Allora il mio codice è questo:
Script:
- Codice:
warning off
f=@(x)((sin(x).*(cos(x)).^2)./(1+x.^2));
alpha=0; beta=2*pi;
figure(1)
fplot(f,[alpha,beta],'r--')
title('Grafico f e splines')
xlabel('asse x')
ylabel('asse y')
hold on
pause
t=linspace(alpha,beta,10000)';
for n=[3 5 7]
x=linspace(alpha,beta,n+1);
s=spline(x,f(x),t);
plot(t,s)
legend('f','n=3','n=5','n=7')
pause
a=0;
b=0.1;
tolla=1e-8;
tollr=0;
tollf=1e-8;
kmax=500;
S=spline(x,f(x));
[x_star]=bisezione(S,a,b,tolla,tollr,tollf,kmax);
disp([n,x_star,abs(0.01-ppval(S,x_star)),abs(0.01-f(x_star))])
end
Funzione bisezione:
- Codice:
function [x]=bisezione(S,a,b,tolla,tollr,tollf,kmax)
f_a=ppval(S,a)-0.01;
ind=-1;
for k=1:kmax
x=(a+b)/2;
y=ppval(S,x)-0.01;
if abs(y)<=tollf, ind=2; return, end
if b-a<= tolla+tollr*abs(a), ind=1; return, end
if f_a*y<0
b=x;
else
a=x;
f_a=y;
end
end
il tutto funziona perfettamente, l'unico dubbio che mi viene è se ho rispettato effettivamente la condzione imposta nel problema, ovvero: "La procedura non rigenera l'intera spline ogni volta che la stessa spline dev'essere valutata in un punto."
Se qualcuno mi sa dire, grazie.