Ciao a tutti! Scusatemi ma sto veramente impazzendo con qst programma Matlab odioso!!! Mi hanno assegnato all'uni un esercizio su un sistema di equazioni non lineari composto da due eq, da risolvere con il metodo di Newton e Newton stazionario. L'ho fatto ma mi dà errori. Mi potreste aiutare??
Grazie mille anticipatamente!!! ciao ciao
Scrivo il testo dell'esercizio e quello che ho fatto io sul metodo di Newton (quello stazionario ancora non l'ho fatto).
Se me lo sistemate ricambierò in qualche modo il favore. NON CON UN ESERCIZIO MATLAB PERCHE' LO ODIO!! magari vi faccio una ricarica di 5 euri
Testo esercizio:
Il sistema:
F(x) = ( X1^(2 ) + X2^(2 ) -2 = 0 ; exp^(X1-1) + X2^(3 ) -2 =0 )
ha soluzione X* =(1; 1)
Approssimare questa soluzione con il metodo di Newton a partire dalla approssimazione iniziale
X0= (1.5 ; 2.0), X0= (2 ; 0.5), e da quella X0= (1.84 ; 0.820)
Discutere i risultati ottenuti confrontandoli con quelli forniti applicando il metodo di Newton stazionario.
Nota: Usare la fattorizzazione diretta per risolvere i sistemi lineari che nascono ad ogni iterazione con il metodo di Newton.
Function fatta da me:
function [X,FX,ind,K,err,res]= Newton_System12(funzione,Jacob,X0,tol_vf,tol_r,tol_a, N, Xstar)
%
% METODO DI NEWTON PER SISTEMI NON LINEARI
% La function Newton_System12 calcola il vettore X, radice di un sistema
% non lineare definito nella function: funzione.m, con matrice Jacobiana
% definita nella function: Jacob.m, a partire dal vettore X0.
%--------------------------------------------------------------------------
% VARIABILI IN INGRESSO (INPUT):
% funzione= nome del file in cui sono memorizzate sotto forma di vettore le funzioni che compongono il sistema da valutare: F
% Jacob= nome del file in cui è memorizzata la matrice jacobiana di F
% Sono entrambe handle function che hanno un unico parametro in uscita e in ingresso
% X0= vettore che rappresenta l'approssimazione iniziale della soluzione
% tol_vf= tolleranza per il C.A.1 riguardante la norma di F all'approssimazione corrente Xnew-->
|| F(Xnew))||<= tol_vf
% tol_r= tolleranza relativa per il C.A.2 misto
% tol_a= tolleranza assoluta per il C.A.2 misto
% C.A.2 MISTO= ||Xnew- Xold|| <= tol_a + tol_r *||Xnew||
% N= numero massimo di iterazioni C.A.3
% Xstar= soluzione esatta fornita dal testo del problema
%--------------------------------------------------------------------------
% VARIABILI IN USICTA (OUPUT):
% X= vettore di approssimazione della soluzione calcolata
% FX= valutazione delle funzioni in X ???? in valore assoluto: |F(X)|?????
% ind= indica per quale C.A. (criterio d'arresto) il processo di iterzioni si è arrestato:
% ind= -1 La matrice jacobiana di F all'approssimazione corrente: JF(Xold) è non singolare
% ind= 1 Si è verificato il C.A.1
% ind= 2 Si è verificato il C.A.2 MISTO
% ind= 3 Ho raggiunto il numero massimo di iterazioni senza verificare alcun criterio di %arresto C.A.3
% K= numero di iterazioni effettuate, necessarie per calcolare X
% err= nel vettore err sono salvate le norme delle differnze tra X* soluzione esatta (dato del problema)e il valore di X calcolato alle varie
% iterazioni || X*-X||
% res= contiene il valore del residuo in X calcolato come norma di FX
Xold=X0;
iter=1;
FXold= funzione(Xold); % Valuta le funzioni che compongono il sistema F in Xold, dove F=
% @funzione --->COME MAI NON E' CORRETTO??
JFXold=Jacob(Xold); % Valuta la funzione JF (matrice Jacobiana di F) in Xold, dove JF= @Jacob ---%>COME MAI NON E' CORRETTO??
while iter<=N
if det(JFXold)==0
ind= -1; X=[]; disp ('Errore: Matrice Jacobiana non singolare')
return
else
Y= -JFXold\FXold; % risolvo il sistema lineare con la fattorizzazione diretta
Xnew= Xold + Y;
FXnew=funzione(Xnew); % Valuta la funzione F in Xnew, dove F= @funzione --->COME MAI &NON E' CORRETTO??
end
if norm(FXnew)<= tol_vf
X=Xnew;
FX= FXnew;
ind=1;
K=iter; % numero di iterazioni effettivamente eseguite
err=norm(Xstar-X);
res=norm(FX);
return
end
dif= norm(Xnew-Xold)
if dif<=(tol_a +tol_r*norm(Xnew))
X=Xnew;
FX= FXnew;
ind=2;
K=iter; % numero di iterazioni effettivamente eseguite
err= norm(Xstar-X);
res=norm(FX);
return
else
Xold= Xnew;
end
iter=iter+1
end
ind=3; disp ('Raggiunto il numero massimo di iterazioni N')
X=Xnew;
FX= FXnew;
K=N;
err=norm(Xstar-X);
res=norm(FX);
end
%%% Volendo usare il comando disp ('K X err res') riferito ad ogni iterara????
% disp('---------------') Dove lo colloco?
%sprintf ('%2.0d %20.15f %20.15f %20.15f' , K, X, err, res)
funzione.m
function F =funzione(X)
% funzione.m
% function che valuta il vettore f delle funzioni nel punto X
F= zeros (2,1); % vettore composto da elementi tutti uguali a 0 con 2 righe e 1 colonna
F(1)= X(1)^2 +X(2)^2-2; % primo elemento (prima funzione) del vettore f
F(2)=exp(X(1)-1)+ X(2)^3-2 ; % secondo elemento (seconda funzione) del vettore f
end
Jacob.m
function JF = Jacob(X)
% Jacob.m
% function che valuta la matrice jacobiana di F nel punto X
JF=[2*X(1), 2*X(2); exp^(X(1)-1), 3*X(2)^2]; % matrice jacobiana di F
end
Nel mio WorkSpace:
>> X0= [1.5 ; 2.0];
>> Xstar= [1 ; 1];
>> [X,FX,ind,K,err,res]= Newton_System12(@funzione,@Jacob,X0,1.0e-007,1.0e-006,1.0e-006, 50, Xstar)
Warning: File: C:\MATLAB6p5\work\Newton_System12.m Line: 78 Column: 1
Unmatched "end".
(Type "warning off MATLAB:m_warning_end_without_block" to suppress this warning.)
??? Subscript indices must either be real positive integers or logicals.
Error in ==> C:\MATLAB6p5\work\Newton_System12.m
On line 37 ==> FXold= funzione(Xold); % Valuta le funzioni che compongono il sistema F in Xold, dove F= @funzione --->COME MAI NON E' CORRETTO??