Loop in procedura.
function [somma] = sinf(x,tol,nmax) s=[x -x^3/6]; somma=sum(s); i=2; while (abs(s(i)-s(i-1))<tol) || (i>nmax) i=i+1; sterm= ((-1)^i* x^(2*i+1))/factorial(2*i+1); %termine i esimo della serie. s(i)=somma+sterm; endwhile l=length(s); somma=s(l);
La procedura su scritta dovrebbe, in linea teorica , darmi come input un valore approssimato della funzione $sin(x)$.
$s$ rappresenta il polinomio di Taylor della funzione ed ad ogni iterata viene aggiunto un termine ad $s$.
L'algoritmo dovrebbe fermarsi o quando $|s(i) - s(i-1) | < tol$ , $t$$ol$ è deciso dall'utente, o quando il numero di iterate dell'algoritmo ($i$) superano un valore massimo ($nmax$).
Il problema sta nel fatto che , a quanto pare, il while mi va in loop.. come mai?
Risposte
innanzitutto per chiudere il ciclo non devi scrivere "endwhile" ma semplicemente "end", poi forse nella condizione sulla tolleranza ha più senso un ">" invece di un "<"
comunque attento a non confondere il vettore s con la somma dei termini di s altrimenti ti esce un risultato errato...
comunque attento a non confondere il vettore s con la somma dei termini di s altrimenti ti esce un risultato errato...
Salve, in effetti hai ragione.. avevo un po' pasticciato. Comunque , ho apportato le dovute correzioni , adesso sembra tutto funzionare alla perfezione. Grazie per l'intervento.

function [somma] = sint(x,tol,nmax) v=[]; for i=1:2 t=(-1)^(i-1)*x^(2*(i-1)+1)/factorial(2*(i-1)+1); v(i)=t; endfor j=2; while abs(v(j)-v(j-1))>tol || j>nmax j=j+1; t=(-1)^(j+1)*x^(2*(j-1)+1)/factorial(2*(j-1)+1); %fatto sto bordello x far quadrare i conti v(j)=t; endwhile somma=sum(v);