Sistemi letterali non lineari con Matlab
Ciao! Devo risolvere un sistema non lineare di otto equazioni in otto incognite, utilizzando il metodo iterativo di Newton-Raphson. Il metodo so scriverlo ed utilizzarlo perfettamente; il problema è che in due delle equazioni compare il parametro t (tempo), in funzione del quale devono essere scritte tutte le soluzioni del sistema, per poi tracciarne i grafici. E' possibile farlo con Matlab e, se sì, come?
Grazie in anticipo.
Grazie in anticipo.
Risposte
Non sono certo di aver compreso il problema ma immagino che tu debba richiamare più volte il metodo per risolvere il sistema usando di volta in volta un tempo diverso e memorizzando i risultati in un vettore in modo da poterlo visualizzare alla fine.
Ah, quindi non è possibile far apparire ciascun risultato come legge (in funzione di t), che è quello che dovrei fare?
A meno di usare il symbolic toolbox (che non conosco ma dovrebbe avere funzionalità simili) non credo. O almeno non mi viene in mente niente.
A quanto pare il problema si deve risolvere impostando una routine che vada a sostituire di volta in volta un valore diverso di t, generando un matrice le cui colonne sono i vettori delle soluzioni del sistema; una volta fatto questo, bisogna utilizzare il comando plot sulla matrice e creare i grafici delle soluzioni in funzione di t, ma non ho idea di come si faccia... qualche aiuto?
Si tratta semplicemente di un ciclo.. In cosa incontri difficoltà esattamente?
Non riesco a far sì che nella matrice jacobiana varino sia i valori delle incognite (nel metodo iterativo, la soluzione trovata in una iterazione deve diventare soluzione di primo tentativo nell'iterazione successiva) sia il parametro t. Ho scritto questo finora:
function M=newratime(x0)
t=0;
i=0;
while(t<=6)
J=jacob(x0, t);
F=func(x0, t);
y=newra(F,J,x0, 0.000001, 10000);
for j=1:8
M(i,j)=y(j);
end
x0=y;
t=t+0.1;
i=i+1;
end
return
dove newra è questo metodo
function x=newra(f, J, x0, eps, max_iter)
k=0;
norma_residui=norm(f);
while(norma_residui>eps)
norma_residui=norm(f);
x=x0-J\f';
k=k+1;
if(k>max_iter)
disp('no');
disp(k);
break,
end
x0=x ;
end
function M=newratime(x0)
t=0;
i=0;
while(t<=6)
J=jacob(x0, t);
F=func(x0, t);
y=newra(F,J,x0, 0.000001, 10000);
for j=1:8
M(i,j)=y(j);
end
x0=y;
t=t+0.1;
i=i+1;
end
return
dove newra è questo metodo
function x=newra(f, J, x0, eps, max_iter)
k=0;
norma_residui=norm(f);
while(norma_residui>eps)
norma_residui=norm(f);
x=x0-J\f';
k=k+1;
if(k>max_iter)
disp('no');
disp(k);
break,
end
x0=x ;
end
Ho fatto progressi... ho scritto questo
Mi restituisce una matrice 61x8, in cui però si ripete 61 volte la soluzione con t =0... come mai?
function T = newra(x0,eps,max_iter) T=zeros(61,8); i=1; t=0; f=fun(x0,t); norma_residui=norm(f); while(t<=6)&&(i<=61) k=0; while(norma_residui>eps) f=fun(x0,t); J=jac(x0,t); % Calcola la norma del vettore dei residui norma_residui=norm(f); % Aggiorna la soluzione x=x0-J\f; % Aggiorna il contatore delle iterazioni k=k+1; % Arresta il calcolo se si raggiunge il massimu numero di iterazione if(k>max_iter) disp('no'); disp(k); break, end % Assumi come soluzione di primo tentativo quella % ottenuta al ciclo precedente x0=x; end for j=1:8 T(i,j)=x(j); end i=i+1; x0=x; end end
Mi restituisce una matrice 61x8, in cui però si ripete 61 volte la soluzione con t =0... come mai?