Problema calcolo intervallo - Metodo numerico di Schroder

linus81
Salve a tutti!
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
linus81
Ho trovato questa soluzione iterativa:

  
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?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.