Grafico dell'errore spline cubica
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:
Funzione newton1d_spline:
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.
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
[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
[/xdom]

Ho provato a cambiare in questo modo:
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).
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).
Non ho guardato il codice. Puoi riportare qui il grafico per la figura (1)?
"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?
Intendo quella che nel testo dell'esercizio è definita come Figura (1)
"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:

"feddy":
Intendo quella che nel testo dell'esercizio è definita come Figura (1)
Se ti serve altro dimmelo eh, che non ho problemi.
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.
"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.