Problema calcolo intervallo - Metodo numerico di Schroder
Salve a tutti!
Ho implementato in Matlab una function per il calcolo degli zeri di funzione attraverso il metodo di Schroder:
la function funziona correttamente prendendo come parametri di input f,f',f'',punto iniziale x0, tolleranza tol e numero massimo di iterate maxIter.
La function andava testata sulla funzione f(x)=sin(x)-x/3 nell'intervallo [2,3]. Infatti restituisce come soluzione x=2.27..
Ora siano alfa e f al punto precedente, dovrei scrivere una funzione che determina numericamente, con precisione assoluta 10^-3, il più grande intervallo I contenente alfa tale che, per x0 appartenente ad I, la successione Xk generata dal metodo precedente converge ad alfa. (utilizzando la tolleranza relativa tol=10^-6).
Dal punto teorico ho capito la domanda ma non ho idea di come possa implementarla e come possa risalire all'intervallo [a,b].
Pensavo di impostare lo scheletro della funzione in questo modo:
dove a x passo lo zero calcolato...
Ho implementato in Matlab una function per il calcolo degli zeri di funzione attraverso il metodo di Schroder:
function [x1,numIter]=schroder(f,df,d2f,x0,tol,maxIter) % %metodo di schroder % numIter=0; err=tol+1; while err>tol && numIter<maxIter x1=x0-(f(x0)*df(x0))/(df(x0)^2-(f(x0)*d2f(x0))); err=abs(x1-x0)/abs(x1); numIter=numIter+1; x0=x1; fprintf('%d \t %1.15e \n',numIter,x1) end if err>tol disp('Attenzione: raggiunto il numero massimo di iterate'); disp(' senza aver ottenuto la precisione richiesta'); numIter=-1; end end
la function funziona correttamente prendendo come parametri di input f,f',f'',punto iniziale x0, tolleranza tol e numero massimo di iterate maxIter.
La function andava testata sulla funzione f(x)=sin(x)-x/3 nell'intervallo [2,3]. Infatti restituisce come soluzione x=2.27..
Ora siano alfa e f al punto precedente, dovrei scrivere una funzione che determina numericamente, con precisione assoluta 10^-3, il più grande intervallo I contenente alfa tale che, per x0 appartenente ad I, la successione Xk generata dal metodo precedente converge ad alfa. (utilizzando la tolleranza relativa tol=10^-6).
Dal punto teorico ho capito la domanda ma non ho idea di come possa implementarla e come possa risalire all'intervallo [a,b].
Pensavo di impostare lo scheletro della funzione in questo modo:
function [a,b]=intervallo(f,df,d2f,x,tol) err=tol+1; while err>tol end end
dove a x passo lo zero calcolato...
Risposte
Ho trovato questa soluzione iterativa:
Per f=sin(x)-x/3 e alpha=2.2789 ottengo ------->>> a=1.2309 e b=5.0529
Il risultato sembra corretto e il grafico della funzione con l'intervallo e lo zero evidenziati è il seguente:

Secondo voi il metodo usato è corretto? Esiste una soluzione migliore?
function [a,b]=intervallo(f,df,d2f,alpha,prec,tol) % % Determina il più grande intervallo I=[a,b] contenente alpha t.c. per x0 appartenente ad I, % la successione Xk generata dal metodo di schroder converge ad alpha % % Input: % f: funzione ; df: derivata prima; d2f: derivata seconda; alpha: zero della funzione; prec: precisione intervallo; % tol: tolleranza metodo %Output: % [a,b]: Il più grande intervallo per la convergenza ad alpha % xa=alpha-prec; [x,numIter]=schroder(f,df,d2f,xa,tol,100); %esegue finchè il metodo è convergente aallo zero alpha while numIter~=-1 && abs(x-alpha)<tol [x,numIter]=schroder(f,df,d2f,xa,tol,100); xa=xa-prec; end a=xa+prec; xb=alpha+prec; [x,numIter]=schroder(f,df,d2f,xb,tol,100); %esegue finchè il metodo è convergente aallo zero alpha while numIter~=-1 && abs(x-alpha)<tol [x,numIter]=schroder(f,df,d2f,xb,tol,100); xb=xb+prec; end b=xb-prec; end
Per f=sin(x)-x/3 e alpha=2.2789 ottengo ------->>> a=1.2309 e b=5.0529
Il risultato sembra corretto e il grafico della funzione con l'intervallo e lo zero evidenziati è il seguente:

Secondo voi il metodo usato è corretto? Esiste una soluzione migliore?