Risoluzione dell'equazione delle onde con semidiscretizzazione spaziale.

astrolabio95
Salve a tutti,

Vista l'estrema competenza degli utenti di questo forum, volevo porvi questo altro quesito.

Devo risolvere in maniera numerica la "classica" equazione delle onde

$ (d^2\varphi)/dt^2 = a^2(d^2\varphi)/dx^2 $

Un piccolo appunto (tutto quello che ho di questo argomento...) suggerisce la seguente sostituzione

$ { ( u=\varphi ),( v = (d\varphi)/dt):} $

e dunque

$ { ( (du)/dt=v ),( (dv)/dt = a^2(d^2u)/dx^2):} $

con le seguenti I.C.

$ { ( u(x,0) = u_o(x) = \varphi_o(x) ),( v(x,0) = v_o(x) =(d\varphi_o)/dt):} $

e le seguenti B.C.

$ { ( \varphi(0,t) = \varphi(L,t) = 0 ),((d\varphi)/dt(0,t) = (d\varphi)/dt(L,t) = 0 ):} $

che diventano (e qui nasce il primo dubbio; perche $x_b$ ?)

$ { ( u(x_b,t) = 0 ),( v(x_b,t) = 0):} $


A questo punto si ha un vettore $\omega = [u,v]^T$ tale che

$ ( dul(\omega))/dt = ul(A)*ul(\omega) $

dove A dovrebbe essere una matrice a blocchi fatta così

$ [ ( 0 , I ),( a^2d^2/dx^2 , 0 ) ] $.

Nella pratica, ho capito che si discretizza la derivata spaziale con, ad esempio, un metodo alle differenze finite del secondo ordine centrato e lo si "mette" nel bocco corrispondente della matrice A.
Dopodiché si utilizza il pacchetto ODE di MatLab e si risolve, appunto, la ODE così ricavata passandogli A come variabile globale.
La mia difficoltà sta nell'implementare le B.C. e le I.C. nella matrice A.
Vi è solo un codice svolto senza commento di cui mi sono sforzato di capire qualcosa ma non ho appurato granché.

Se poteste darmi una mano, un suggerimento sarebbe davvero grandioso. Grazie!

Risposte
astrolabio95
Ho provato a svolgerla, ma il vettore delle y che fuoriesce dal [t,y] = ode45(...) è un vettore che ha 2*N colonne, con N pari al numero di punti del mesh, mentre la I.C. è, appunto, definita solo su N punti...

Raptorista1
Se hai \(n\) punti e \(2\) variabili, ti ritroverai con \(2n\) numeri.

Sinceramente, questa equazione mi sembra che si possa risolvere direttamente con differenze finite in spazio e tempo [metodo noto come LeapFrog].
Quella matrice con dentro un operatore differenziale è una roba astratta, devi prima convertirla in qualcosa di concreto. Nel caso specifico, devi discretizzare l'equazione in qualche modo e poi scrivere l'equazione discretizzata per ogni punto. Per i nodi di bordo scriverai un'equazione diversa che tiene conto delle condizioni al bordo. Quando hai raccolto tutte queste equazioni, le usi per assemblare una matrice [che non è nemmeno necessario in realtà].

astrolabio95
"Raptorista":
Se hai \(n\) punti e \(2\) variabili, ti ritroverai con \(2n\) numeri.

Sinceramente, questa equazione mi sembra che si possa risolvere direttamente con differenze finite in spazio e tempo [metodo noto come LeapFrog].
Quella matrice con dentro un operatore differenziale è una roba astratta, devi prima convertirla in qualcosa di concreto. Nel caso specifico, devi discretizzare l'equazione in qualche modo e poi scrivere l'equazione discretizzata per ogni punto. Per i nodi di bordo scriverai un'equazione diversa che tiene conto delle condizioni al bordo. Quando hai raccolto tutte queste equazioni, le usi per assemblare una matrice [che non è nemmeno necessario in realtà].


Ti ringrazio per la dritta, sono riuscito ad implementare il codice e a far partire tutto!

Raptorista1
Bene!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.