|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 1963
|
Correzione codice C++ con newton raphson (matlab)
ragazzi, c'è qualche buon'anima che mi può correggere dove sbaglio con questo codice per risolvere un sistema di equazioni non lineari con newton raphson?
Quote:
Ultima modifica di -Root- : 03-02-2014 alle 15:12. |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Dove hai valorizzato x(0)?
Se la prima condizione è soddisfatta quanto vale k? A che serve salvare in un vettore i risultati di tutte le iterazioni? Quanto vale xnew(k-1) alla prima iterazione? Dove valorizzi xnew1? |
|
|
|
|
|
#3 | |||
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 1963
|
Quote:
Quote:
Quote:
Ultima modifica di -Root- : 03-02-2014 alle 15:13. |
|||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 1963
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Per favore quando posti il codice usa i tag code, così è illeggibile... per questa volta lo riscrivo io:
Codice:
[function [x,res,niter,Err] = newtonsys(Ffun,Jfun,x0,tol,nmax, varargin)
%NEWTONSYS calcola una radice di un sistema non lineare
% [ZERO,RES,NITER,ERR]=NEWTONSYS(FFUN,JFUN,X0,TOL,NMAX)
% calcola il vettore ZERO, radice di un sistema non
% lineare definito nella function FFUN con matrice
% jacobiana definita nella function JFUN a partire
% dal vettore X0. RES contiene il valore del residuo
% in ZERO e NITER il numero di iterazioni necessarie
% per calcolare ZERO. FFUN e JFUN sono function
% definite tramite M-file
% Nel vettore ERR sono salvate le norme degli incrementi
% alle varie iterazioni
niter = 0;
Func = tol + 1;
err = tol + 1;
x = x0;
Err=[];
while Func >= tol & err >= tol & niter < nmax
J = Jfun(x,varargin{:});
F = Ffun(x,varargin{:});
z = - J/F;
x = x + z;
err = norm(z);
Func = norm(F);
Err=[Err;err];
niter = niter + 1;
end
res = norm(Ffun(x,varargin{:}));
if (niter==nmax & err> tol)
fprintf(['Il metodo non converge nel massimo ',...
'numero di iterazioni. L''ultima iterata\n',...
'calcolata ha residuo relativo pari a %e\n'],res);
else
fprintf(['Il metodo converge in %i iterazioni',...
' con un residuo pari a %e\n'],niter,res);
end
return]
[function F = Ffun(x)
F(1,1) = 0.3*cos(0) + 0.5*cos(x(1)) - 0.7*cos(x(2)) - 0.4;
F(2,1) = 0.3*sin(0) + 0.5*sin(x(1)) + 0.7*sin(x(2));
return]
[function J = Jfun(x)
J(1,1)= -0.5*sin(x(1))
J(1,2)= -0.7*sin(x(2))
J(2,1)= 0.5*cos(x(1))
J(2,2)= 0.7*sin(x(2))
return]
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 1963
|
Quote:
Codice:
function [x,res,niter,Err] = newtonsys(Ffun,Jfun,x0,tol,...
nmax, varargin)
%NEWTONSYS calcola una radice di un sistema non lineare
% [ZERO,RES,NITER,ERR]=NEWTONSYS(FFUN,JFUN,X0,TOL,NMAX)
% calcola il vettore ZERO, radice di un sistema non
% lineare definito nella function FFUN con matrice
% jacobiana definita nella function JFUN a partire
% dal vettore X0. RES contiene il valore del residuo
% in ZERO e NITER il numero di iterazioni necessarie
% per calcolare ZERO. FFUN e JFUN sono function
% definite tramite M-file
% Nel vettore ERR sono salvate le norme degli incrementi
% alle varie iterazioni
niter = 0;
Func = tol;
Jac = tol;
x = x0;
Err=[];
while Func >= tol & niter < nmax & Jac >= tol
J = Jfun(x,varargin{:});
F = Ffun(x,varargin{:});
z = - J\F;
x = x + z;
Jac = norm(J);
Func = norm(F);
niter = niter + 1;
end
res = norm(Ffun(x,varargin{:}));
if (Func > tol)
fprintf(['Il metodo non converge nel massimo ',...
'numero di iterazioni. L''ultima iterata\n',...
'calcolata ha residuo relativo pari a %e\n'],res);
else
fprintf(['Il metodo converge in %i iterazioni',...
' con un residuo pari a %e\n'],niter,res);
end
return
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:32.



















