slogan3

Maak een Fortran-programma om een eenvoudige harmonische oscillator te simuleren

description

Door deze prompt te gebruiken, krijg je praktische ervaring in het simuleren van fysieke systemen met Fortran, verbeter je je begrip van harmonische beweging en leer je hoe je simulatie-resultaten kunt visualiseren en interpreteren.

prompt

try_prompt

Help me bij het ontwikkelen van een Fortran-programma dat een eenvoudige harmonische oscillator simuleert met de volgende specificaties: - Massa van de oscillator: {{massa}} - Veerconstante: {{veerconstant ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Hier is een eenvoudig Fortran-programma dat een harmonische oscillator simuleert met de door u genoemde parameters: ```fortran program harmonische_oscillator implicit none ! Parameters real :: m = 1.0 ! Massa real :: k = 10.0 ! Veerconstante real :: x = 0.1 ! Initiële verplaatsing real :: v = 0.0 ! Initiële snelheid real :: tmax = 10.0 ! Totale simulatie tijd real :: dt = 0.01 ! Tijdstap integer :: n_steps integer :: i ! Arrays om data op te slaan real, allocatable :: time(:), positie(:), snelheid(:) n_steps = int(tmax / dt) + 1 allocate(time(n_steps)) allocate(positie(n_steps)) allocate(snelheid(n_steps)) ! Initialisatie time(1) = 0.0 positie(1) = x snelheid(1) = v ! Simulatie met eenvoudige Euler-methode do i = 1, n_steps - 1 ! Versnelling real :: a = - (k / m) * positie(i) ! Update snelheid en positie snelheid(i+1) = snelheid(i) + a * dt positie(i+1) = positie(i) + snelheid(i) * dt ! Tijd bijwerken time(i+1) = time(i) + dt end do ! Data opslaan of uitprinten open(unit=10, file='harmonische_oscillator.txt', status='replace') write(10, '(2a,2f10.4)') 'Tijd', 'Positie', 'Snelheid' do i = 1, n_steps write(10, '(2f10.4)') time(i), positie(i) end do close(10) print *, 'Simulatie voltooid. Gegevens opgeslagen in harmonische_oscillator.txt' end program harmonische_oscillator ``` **Hoe de beweging te visualiseren:** 1. **Data inlezen:** Open het bestand `harmonische_oscillator.txt` met een spreadsheetprogramma (bijvoorbeeld Excel) of een grafieksoftware zoals GNUplot, Python (matplotlib), of Origin. 2. **Grafiek maken:** Plot de positie (y-as) tegen de tijd (x-as). Dit toont de sinusvormige beweging van de oscillator. 3. **Analyse:** Kijk naar de amplitude, frequentie en eventuele verstoringen. Omdat we een eenvoudige Euler-methode gebruiken, kunnen er kleine foutjes optreden die na langere simulaties zichtbaar worden. **Resultaten effectief interpreteren:** - **Oscillerende beweging:** De positie moet sinusvormig zijn met een constante amplitude en frequentie, wat wijst op een ideaal, niet-vergevend systeem zonder demping. - **Amplitude:** De maximale uitslag moet ongeveer gelijk blijven, wat bevestigt dat er geen energieverlies optreedt. - **Frequentie:** De theoretische frequentie is \(f = \frac{1}{2\pi} \sqrt{\frac{k}{m}}\). Met de gegeven parameters is dat ongeveer 1.59 Hz. Je kunt de periode uit de grafiek meten en vergelijken. - **Energiebehoud:** Controleer of de som van kinetische en potentiële energie constant blijft. Dit geeft aan of de numerieke methode nauwkeurig genoeg is. Voor een accuratere simulatie kunt u overwegen om een meer geavanceerde integratiemethode te gebruiken, zoals de Verlet- of Runge-Kutta-methoden.
provider: deepseek
model: deepseek-chat
Hier is een compleet Fortran-programma voor de simulatie van een eenvoudige harmonische oscillator, samen met begeleiding voor visualisatie en interpretatie: ```fortran program harmonische_oscillator implicit none ! Constantes en parameters real, parameter :: massa = 1.0 real, parameter :: veerconstante = 10.0 real, parameter :: x0 = 0.1 ! initiële verplaatsing real, parameter :: v0 = 0.0 ! initiële snelheid real, parameter :: totale_tijd = 10.0 real, parameter :: dt = 0.01 ! tijdstap integer, parameter :: n_stappen = int(totale_tijd/dt) ! Variabelen real :: x, v, a, t, omega integer :: i ! Open bestand voor output open(unit=10, file='oscillator_data.txt', status='replace') ! Bereken hoekfrequentie omega = sqrt(veerconstante/massa) ! Initialiseer variabelen t = 0.0 x = x0 v = v0 ! Schrijf kopregel write(10, *) 'Tijd Verplaatsing Snelheid Versnelling' ! Hoofd simulatie loop do i = 1, n_stappen ! Bereken versnelling (F = -k*x, a = F/m) a = -veerconstante * x / massa ! Update snelheid en positie (Euler methode) v = v + a * dt x = x + v * dt t = t + dt ! Schrijf data naar bestand write(10, '(4F12.6)') t, x, v, a end do ! Sluit bestand close(10) print *, 'Simulatie voltooid! Data opgeslagen in oscillator_data.txt' print *, 'Totale stappen: ', n_stappen print *, 'Hoekfrequentie: ', omega print *, 'Periode: ', 2*3.14159/omega end program harmonische_oscillator ``` ## Compilatie en Uitvoering ```bash gfortran -o oscillator harmonische_oscillator.f90 ./oscillator ``` ## Visualisatie met Python Maak een Python-script voor visualisatie: ```python import numpy as np import matplotlib.pyplot as plt # Data inlezen data = np.loadtxt('oscillator_data.txt', skiprows=1) tijd = data[:, 0] verplaatsing = data[:, 1] snelheid = data[:, 2] versnelling = data[:, 3] # Plot verplaatsing vs tijd plt.figure(figsize=(12, 8)) plt.subplot(3, 1, 1) plt.plot(tijd, verplaatsing, 'b-', linewidth=2) plt.ylabel('Verplaatsing (m)') plt.title('Eenvoudige Harmonische Oscillator') plt.grid(True) plt.subplot(3, 1, 2) plt.plot(tijd, snelheid, 'r-', linewidth=2) plt.ylabel('Snelheid (m/s)') plt.grid(True) plt.subplot(3, 1, 3) plt.plot(tijd, versnelling, 'g-', linewidth=2) plt.ylabel('Versnelling (m/s²)') plt.xlabel('Tijd (s)') plt.grid(True) plt.tight_layout() plt.savefig('oscillator_plots.png') plt.show() # Fase-ruimte diagram plt.figure(figsize=(8, 6)) plt.plot(verplaatsing, snelheid, 'purple', linewidth=2) plt.xlabel('Verplaatsing (m)') plt.ylabel('Snelheid (m/s)') plt.title('Fase-Ruimte Diagram') plt.grid(True) plt.axis('equal') plt.savefig('fase_ruimte.png') plt.show() ``` ## Interpretatie van Resultaten ### 1. **Fysische Analyse** - **Periode**: Bereken met `T = 2π√(m/k)` ≈ 1.986 seconden - **Amplitude**: Zou constant moeten blijven bij ideale oscillatie - **Energiebehoud**: Totale energie = kinetische + potentiële energie ### 2. **Te Controleren Kenmerken** - **Periodiciteit**: Controleer of beweging zich herhaalt - **Amplitude**: Moet ongeveer 0.1 blijven (initiële verplaatsing) - **Faseverschuiving**: Snelheid is maximaal wanneer verplaatsing nul is ### 3. **Validatie** Vergelijk met analytische oplossing: ```python # Theoretische oplossing omega = np.sqrt(10.0) # √(k/m) x_theoretisch = 0.1 * np.cos(omega * tijd) ``` ### 4. **Foutanalyse** - Controleer energiebehoud over tijd - Monitor numerieke fouten door tijdstap te variëren ## Tips voor Verbetering 1. **Numerieke Methoden**: Probeer Runge-Kutta voor betere nauwkeurigheid 2. **Tijdstap Experiment**: Varieer `dt` om stabiliteit te testen 3. **Energie Monitoring**: Voeg energieberekening toe in Fortran-code 4. **Animatie**: Maak een real-time animatie met matplotlib.animation De gegenereerde plots geven inzicht in de oscillatie-dynamica en helpen bij het valideren van de fysische principes.