Einzelnen Beitrag anzeigen
  #2  
Alt 11.05.23, 21:14
Benutzerbild von Geku
Geku Geku ist offline
Singularität
 
Registriert seit: 09.06.2021
Beitr?ge: 1.334
Blinzeln AW: Entwicklung von Differential-Gleichungen simulieren

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 dt dx// CFL-Zahl
    
double tx;

    
// Initialisierung der Amplitude am Anfang der Simulation

    
for (int i 0Ni++) 
    {
        
y[i][0] = cos(dx);
    }

    
// Berechnung der Amplitude zu jedem Zeitpunkt

    
for (int j 1Mj++)
    {
        for (
int i 0Ni++) 
        {
            
double y_L cos(* (c*j) * dx); // linke Welle
            
double y_R cos(* (c*j) * dx); // rechte Welle
            
y[i][j] = y_L y_R// Überlagerung
        
}
    }

    
// Ausgabe der Amplitude am letzten Zeitpunkt

    
= (M-1) * dt;

    for (
int i 0Ni++) 
    {
        
dx;
        
printf("x=%f t=%f y=%f\n"xty[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 tx;

    
// Initialisierung der Amplitude am Anfang der Simulation

    
for (int i 0<= Ni++) 
   {
        
y[i][0] = cos(dx);
    }

    
// Numerische Lösung der Differentialgleichung

    
for (int j 0Mj++)
    {
        
// Randbedingungen setzen
        
y[0][j+1] = 0.0;
        
y[N][j+1] = 0.0;
        
// Innere Punkte berechnen

        
for (int i 1Ni++) 
       {
            
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

    
M*dt;

    for (
int i 0<= Ni++) 
    {
        
dx;
        
printf("%f %f %f\n"xty[i][M]);
    }

    return 
0;

__________________
It seems that perfection is attained not when there is nothing more to add, but when there is nothing more to remove — Antoine de Saint Exupéry

Ge?ndert von Geku (12.05.23 um 09:44 Uhr)
Mit Zitat antworten