Grafico dell'errore spline cubica

Angus1956
Consideriamo il seguente problema:

E data la funzione ` $f:[0, 2pi] ->RR$, $f(x) = sqrt(1+x^2)sin^3(x)$.
Crea lo script che svolge quanto riportato in seguito.

1) Approssima $f$ nell’intervallo considerato mediante splines cubiche $s_3$ di tipo not-a-knot su m sottointervalli, con $m in{4, 6, 8, ..., 16}$.
Figura 1 mostra il grafico di $f$ e di $s_3$ al crescere di $m$.
Figura 2 mostra il grafico della funzione errore $abs(f(x)−s_3(x))$, $x in[0, 2pi]$, per $m = 6, 8$.
Figura 3 mostra l’errore $max_{x in[0,2pi]}abs(f(x)−s_3(x))$ al crescere di $m$.

2) Usando $s_3$ al posto di $f$, lo script usa il metodo di Newton per l’approssimazione di
$x^∗ = arg max_{x in[0,2pi]} f(x)$ come punto critico di $f$ (aiutarsi con i grafici di Fig.1 per
individuare un intervallo opportuno contenente $x^∗$ ed un valore basso di $m$ per la spline).
Figura 4 mostra la storia della convergenza del metodo iterativo (tol=1e-6)

questo è il mio codice

Script:

f=@(x)(sqrt(1+x.^2).*(sin(x)).^3);
alfa=0; beta=2*pi;
figure(1)
fplot(f,[alfa,beta],'r--');
hold on
pause
t=linspace(alfa,beta,10000)';
for m=4:2:16
 x = linspace(alfa,beta,m+1)';
 s = spline(x,f(x),t);
 figure(1)
 plot(t,s);
 pause
 if m==6 || m==8
     E=@(a)(abs(f(a)-s(a)));
     figure(2)
     fplot(E,[alfa,beta],'g');
     hold on
 end
 E_max=max(abs(f(t)-s));
 figure(3)
 plot(m,E_max,'*')
 hold on
end
S=spline(x,f(x));
rho=S.coefs;
drho=[3*rho(:,1), 2*rho(:,2), rho(:,3)];
d2rho=[6*rho(:,1), 2*rho(:,2)];
ds=mkpp(x,drho); 
d2s=mkpp(x,d2rho);
kmax=500;
tolla=1e-8;
tollr=0;
tollf=1e-8;
x_0=1.5;
[x,res,k,flag]=newton1d_spline(ds,d2s,x_0,tolla,tollr,tollf,kmax);
figure(4)
plot(1:k,res,'k')


Funzione newton1d_spline:

function [x,res,k,flag]=newton1d_spline(ds,d2s,x_0,tolla,tollr,tollf,kmax)
x=x_0;
y=ppval(ds,x);
d=y/(ppval(d2s,x));
flag=2;
for k=1:kmax
    x=x-d;
    y=ppval(ds,x);
    res(k)=abs(y);
    if abs(y)<tollf, flag=0; return, end
    if abs(d)<tollr*abs(x)+tolla, flag=1; return, end
    d=y/(ppval(d2s,x));
end



Dovrebbe essere praticamente tutto giusto tranne per la figura (2), il problema mi chiedeva di fare la funzione errore e perciò io l ho definita come funzione, però credo che la dipendenza da $f$ e da $s$ non vada bene poichè quando vado a vedere il grafico (2) non mi esce niente... forse sbaglio a definirla come funzione e devo farla come grafico semplice oppure sbaglio a scriverla, se qualcuno mi sa dire grazie.

Risposte
feddy
[xdom="feddy"]Andrea, quando pubblichi un post dovresti evitare di includere (come da regolamento) l'immagine del problema e scrivere la traccia "a mano". So che è noioso, però facendo così siamo sicuri che se il link alle immagini si rompesse il post non resterà monco. Siccome hai postato molto negli ultimi giorni e in ogni post hai inserito l'immagine, c'è il rischio che molte conversazioni siano "rotte" in futuro :D[/xdom]

Angus1956
Ho provato a cambiare in questo modo:

  if m==6 || m==8
     figure(2)
     plot(t,abs(f(t)-s));
     hold on
 end


e mi vengono dei grafici del genere (in blu $m=6$ e in rosso $m=8$):



non so se sia giusto ma è l'unica cosa che mi è venuta in mente per far uscire il grafico (2).

feddy
Non ho guardato il codice. Puoi riportare qui il grafico per la figura (1)?

Angus1956
"feddy":
Non ho guardato il codice. Puoi riportare qui il grafico per la figura (1)?

Aspetta in che senso il grafico della figura (1)? Intendi solo la funzione oppure anche la spline?

feddy
Intendo quella che nel testo dell'esercizio è definita come Figura (1)

Angus1956
"feddy":
Intendo quella che nel testo dell'esercizio è definita come Figura (1)

Questa è la figura (1) completa, ovvero con tutte le spline e la funzione, ma non si capisce molto perchè si sovrappongono, se vuoi delle catture piu specifiche per capire meglio dimmelo che tanto ho messo il pause:


Angus1956
"feddy":
Intendo quella che nel testo dell'esercizio è definita come Figura (1)

Se ti serve altro dimmelo eh, che non ho problemi.

feddy
Non ero al pc. Lo script che hai scritto qui (https://www.matematicamente.it/forum/vi ... 7#p8622030) per la funzione errore richiesto per Figura 2 va bene: per ogni punto in $t$ calcoli il modulo della differenza tra il valore puntuale della funzione e della spline.

Angus1956
"feddy":
Non ero al pc. Lo script che hai scritto qui (https://www.matematicamente.it/forum/vi ... 7#p8622030) per la funzione errore richiesto per Figura 2 va bene: per ogni punto in $t$ calcoli il modulo della differenza tra il valore puntuale della funzione e della spline.

Ah ok, grazie mille, pensavo fosse un po sbagliata per l'andamento "sinusoindale" in valore assoluto, invece va bene ahahah.

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