|
|
|
![]() |
|
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 14: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 14: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: 09:20.