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
...
tags
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.

