Equazione differenziale con metodo di Newton

Messaggioda luca.milano » 25/08/2018, 10:31

Buongiorno a tutti, sto cercando di risolvere un'equazione differenziale non lineare discretizzando in N nodi e poi risolvendo il sistema risultante con il metodo di Newton. Il codice mi sembra che giri ma è abbastanza lento e vorrei capire se c'è qualche errore o se semplicemente questi sono i limiti del metodo di Newton.

Questa è l'equazione:
$ { ( (partial^2 T)/(partial x^2) + g/k=0 ),( T(0)=T_0 ),( T(L)=T_L ):} $

dove il termine $ k $ è pari a:
$ k=k0+a*T $

Vi riporto lo script principale:
Codice:
L=1; %lunghezza
N=50; %numero nodi
dx=L/N; %intervallo spaziale

T0=0;  %temperatura in x=0
TL=0;  %temperatura in x=L

g=50;  %termine di generazione
k0=10; %primo termine della polinomiale per la conduttività termica: k=k0+aT
a=10;  %coefficiente della T
save indiretto

%METODO DI NEWTON
T=zeros(N,1);
x1=ones(N,1);
n=0;

while norm(T-x1)>1e-5
    n=n+1;
    x1=T;
    r=jac2(T)\sist2(T);
    T=T-r;
end
T;
n;


La function per il vettore delle equazioni è la seguente:
Codice:
function F=sist2(T)
%devo creare il vettore colonna del sistema: F=0
load indiretto

F(1)=T(1)-T0;
F(N)=T(L)-TL;

for j=2:N-1
    k(j)=k0+(10^-1)*T(j);
    F(j)=T(j+1)-2*T(j)+T(j-1)+g/k(j)*dx^2;
end

F=F';


Lo Jacobiano è invece questo:
Codice:
function J=jac2(T)
load indiretto
J=zeros(N,N);

J(1,1)=1; J(N,N)=1;
for j=2:N-1
    k(j)=k0+10^-1*T(j);
    J(j,j-1)=1;
    J(j,j)=-2-a*g/(k0+a*T(j))^2;
    J(j,j+1)=1;   
end


Vedete qualche errore? Ci sono metodi migliori per risolvere sistemi non lineari?
luca.milano
New Member
New Member
 
Messaggio: 11 di 50
Iscritto il: 28/07/2018, 17:35

Re: Equazione differenziale con metodo di Newton

Messaggioda feddy » 25/08/2018, 10:57

Ciao,

deduco che tu stia usando uno schema alle differenze finite equispaziate. E' un semplice problema ai limiti con condizioni al contorno di Dirichlet.

Probabilmente evitare di scrivere due diverse funzioni solo per scrivere la $F$ e lo jacobiano (con cicli for !) è meglio. Questo perché MatLab è "ottimizzato" per questo genere di operazioni, vedi anche qui.
Per quel che mi riguarda, preferisco sempre discretizzare gli operatori differenziali, in questo caso $\frac{d}{dx^2}$, in modo "matriciale", ossia creando una matrice triangolare, ma non cambia nulla a livello concettuale.

Il tuo metodo di Newton mi pare corretto, anche se le dichiarazione $x_1=T$ non vedo che senso possa avere.
Ultima modifica di feddy il 25/08/2018, 12:12, modificato 1 volta in totale.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2184 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Equazione differenziale con metodo di Newton

Messaggioda luca.milano » 25/08/2018, 11:05

Si hai ragione, è lineare, è che il mio problema è un altro e volevo provare una versione più semplificata per fare pratica :-D .

Il problema completo sarebbe questo:

$ k(T)*(partial^2 T)/(partial x^2) + a(T)*(partial T)/(partial x) + g=0 $

Poi a sua volta questa equazione devo inserirla in un sistema di 5 equazioni non lineari (se possibile in geometria bidimensionale, altrimenti la tengo monodimensionale).

Il problema è che se già la versione semplificata che ho proposto gira con fatica, posso solo immaginare quanto potrà metterci a risolvere il problema completo. :roll:
luca.milano
New Member
New Member
 
Messaggio: 12 di 50
Iscritto il: 28/07/2018, 17:35

Re: Equazione differenziale con metodo di Newton

Messaggioda feddy » 25/08/2018, 11:10

N.B.: codice editato.

Codice:
 
clear all
close all

L=1; %lunghezza
m=50; %numero nodi
h=L/m;%passo spaziale
x=linspace(0,L,m);

%Dati al bordo + costanti del problema
T0=0;TL=0;
g=50;k0=10;a=10;

%Matrice che discretizza derivata seconda
A = toeplitz(sparse([1,1],[1,2],[-2,1]/(h^2),1,m));
I=speye(m);
%BOUNDARY CONDITIONS
A(1,1:2)=[1,0];
A(m,m-1:m)=[0,1];
I(1,1)=0;
I(m,m)=0;

b=zeros(m,1);
b(1)=-g/k0;
b(m)=-g/k0;

F=@(u) A*u + g./(k0+a*I*u) + b;
JF=@(u) A - g*a*spdiags([0;1./((k0+a*u(2:m-1)).^2);0],0,m,m);

%Newton:

tol=h^2; %diff finite secondo ordine
u0=ones(m,1);
res=-JF(u0)\F(u0);
iter=0;
maxit=50;
while (norm(res,inf)>tol) & (iter<maxit)
   iter++;
   u0+=res;
   res=-JF(u0)\F(u0);
end
u0+=res;


plot(x,u0,'b-o')


L'output prodotto è:
Immagine

- - - - - - - - - - - - -
Chiaramente è un approccio diverso dal tuo, dunque subito potrebbe non essere chiaro.
Un paio di osservazioni sul mio codice:
    1. E' scritto in Octave, quindi se usi MatLab incrementi del tipo i++, u0+=res vanno scritti rispettivamente i=i+1 e u0=u0 +res
    2. Ho scritto la funzione $F$, a valori vettoriali, da azzerare. Ho scelto di aggiunere un vettore "correttivo" del termine noto per imporre le condizioni ai bordi per cercare di fare il più simile possibile a te.
    3. Ora ho dovuto effettivamente utilizzare Newton, quindi ho calcolato la jacobiano $JF$, identico al tuo



Editato
Ultima modifica di feddy il 25/08/2018, 12:18, modificato 1 volta in totale.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2185 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Equazione differenziale con metodo di Newton

Messaggioda feddy » 25/08/2018, 11:15

Beh, se $k$ e $a$ sono funzioni di $T$ allora anche il secondo problema da te proposto è ancora lineare...
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2186 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Equazione differenziale con metodo di Newton

Messaggioda luca.milano » 25/08/2018, 11:36

Ti ringrazio per la risposta, sei stato gentilissimo. Innanzitutto mi hai fatto vedere un metodo per creare le matrici più agilmente e cercherò di studiarlo e impararlo :-D .

L'unico problema riguardo il tuo codice è che la soluzione non dipende dal parametro $ a $ ! Se provo a cambiarlo rimane tutto uguale. E' possibile che tu abbia dimenticato un pezzo?
luca.milano
New Member
New Member
 
Messaggio: 13 di 50
Iscritto il: 28/07/2018, 17:35

Re: Equazione differenziale con metodo di Newton

Messaggioda feddy » 25/08/2018, 11:43

Sì hai ragione, leggendo in fretta non avevo visto anche $k0$... ho editato il messaggio sopra
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2187 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Equazione differenziale con metodo di Newton

Messaggioda luca.milano » 25/08/2018, 12:52

Grazie ancora! Mi confermi che posso estendere il metodo anche a sistemi di equazioni differenziali alle derivate parziali? Le soluzioni che trovo sono accurate?
luca.milano
New Member
New Member
 
Messaggio: 14 di 50
Iscritto il: 28/07/2018, 17:35

Re: Equazione differenziale con metodo di Newton

Messaggioda feddy » 25/08/2018, 14:07

Eh questo credo sia un po' troppo... in che contesto ti è richiesto di risolvere questo?
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2189 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Equazione differenziale con metodo di Newton

Messaggioda luca.milano » 25/08/2018, 14:31

Tesi di laurea magistrale in ingegneria. Altrimenti che strumenti bisogna adoperare?
luca.milano
New Member
New Member
 
Messaggio: 15 di 50
Iscritto il: 28/07/2018, 17:35

Prossimo

Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite