Ich würde die Simulation in C wie folgt lösen:
PHP-Code:
#include <stdio.h>
#include <math.h>
#define N 100 // Anzahl der Diskretisierungspunkte im Raum
#define M 1000 // Anzahl der Diskretisierungspunkte in der Zeit
#define A 1.0 // Amplitude der Welle
#define k 1.0 // Wellenzahl
#define v 1.0 // Geschwindigkeit der Welle
int main()
{
double y[N][M]; // Amplitude an den Diskretisierungspunkten (Raum/Zeitpunkte)
double dx = 1.0 / N; // räumliche Schrittweite
double dt = 0.001; // zeitliche Schrittweite
double c = v * dt / dx; // CFL-Zahl
double t, x;
// Initialisierung der Amplitude am Anfang der Simulation
for (int i = 0; i < N; i++)
{
y[i][0] = A * cos(k * i * dx);
}
// Berechnung der Amplitude zu jedem Zeitpunkt
for (int j = 1; j < M; j++)
{
for (int i = 0; i < N; i++)
{
double y_L = A * cos(k * (i - c*j) * dx); // linke Welle
double y_R = A * cos(k * (i + c*j) * dx); // rechte Welle
y[i][j] = y_L + y_R; // Überlagerung
}
}
// Ausgabe der Amplitude am letzten Zeitpunkt
t = (M-1) * dt;
for (int i = 0; i < N; i++)
{
x = i * dx;
printf("x=%f t=%f y=%f\n", x, t, y[i][M-1]);
}
return 0;
}
Das Programm kann mit "
gcc programm_name -lm" kompiliert werden und mit "
./a.out" aufgerufen werden. Wenn man t ändert, dann man jeden beliebiegen Zeitpunkt zwischen 0 und M ausgeben. Oder man kann Amplidude Spalten mit y(t) ausgeben (Matrix).]
PS: PHP-Code sollte eigentlich c-Code heißen.
Statt die Wellen als COS-Funktionen darzustellen kann man diese auf Differenzahlgleichungen reduzieren:
PHP-Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100 // Anzahl der Diskretisierungspunkte im Raum
#define M 1000 // Anzahl der Diskretisierungspunkte in der Zeit
#define A 1.0 // Amplitude der Welle
#define k 1.0 // Wellenzahl
#define v 1.0 // Geschwindigkeit der Welle
#define dt 0.001 // zeitliche Schrittweite
#define dx 1.0 / N // räumliche Schrittweite
#define alpha v*dt/dx // CFL-Zahl
int main()
{
double y[N+1][M+1]; // Amplitude an den Diskretisierungspunkten
double t, x;
// Initialisierung der Amplitude am Anfang der Simulation
for (int i = 0; i <= N; i++)
{
y[i][0] = A * cos(k * i * dx);
}
// Numerische Lösung der Differentialgleichung
for (int j = 0; j < M; j++)
{
// Randbedingungen setzen
y[0][j+1] = 0.0;
y[N][j+1] = 0.0;
// Innere Punkte berechnen
for (int i = 1; i < N; i++)
{
y[i][j+1] = 2.0*(1-alpha*alpha)*y[i][j] - y[i][j-1] + alpha*alpha*(y[i+1][j] + y[i-1][j]);
}
}
// Ausgabe der Amplitude am letzten Zeitpunkt
t = M*dt;
for (int i = 0; i <= N; i++)
{
x = i * dx;
printf("%f %f %f\n", x, t, y[i][M]);
}
return 0;
}