Quiz su interpolazione spline in MatLab
L'ultimo esercizio che non riesco a far quadrare:

il codice:
Qui più o meno funziona tutto ma non so come utilizzare l'informazione dei 500punti equidistanti; ho provato ad utilizzare il dato nella definizione di z ma in ogni caso non mi tornano i risultati.
Ancora una volta grazie a chi vorrà aiutarmi

il codice:
a=1; b=2; n=35; f=@(x) (x.^5).*log(x); %definisco f(x) fd=@(x) 5.*(x.^4)*(1./x); %definisco f'(x) f0=fd(1); fn=fd(2); x=linspace(a,b,n); y=f(x); z=linspace(a,b); fz=f(z); s=spline(x,y,z) %creo la spline s1=spline(x,[f0 y fn],z) %creo la spline vincolata nei punti f0 e fn err=max(abs(fz-s)) %errore sulla spline err1=max(abs(fz-s1)) %errore sulla spline vincolata
Qui più o meno funziona tutto ma non so come utilizzare l'informazione dei 500punti equidistanti; ho provato ad utilizzare il dato nella definizione di z ma in ogni caso non mi tornano i risultati.
Ancora una volta grazie a chi vorrà aiutarmi

Risposte
Una paio di cose:
1) la derivata è sbagliata: devi usare la regola del prodotto.
2) quello che mi pare ti sfugga è il significato del concetto di interpolazione. Ti do dei punti ${x_i}_i$ e ${y_i}_i$, per i quali passa una funzione che voglio ricostruire. Non so cosa fa nei punti in mezzo, ma voglio che passi per quei punti. Chiaramente può farlo in tanti modi.
Ad esempio, in questo caso, una spline cubica non è altro che una funzione polinomiale a tratti con certe proprietà. Determinarla significa semplicemente calcolare i coefficienti.
Una volta che ce l'abbiamo, ci si chiede: assumiamo che io conosca le $x$ e le $y$ di partenza, che sono quelle corrispondenti ad una certa funzione $f(x)$. Voglio vedere di quanto si "sbaglia" globalmente, cioè se la spline $s$ approssima "bene" la funzione $f$ che ne ha originato i "sample" (cioè i punti di partenza di cui parlavamo prima).
Per fare questo altro non devi fare che valutare entrambe le funzioni in un insieme di punti "test", fitti, come in questo caso, e osservarne il risultato.
3) Non ti viene chiesto di calcolare l'errore sulla spline, percio' le variabili
Ti allego il codice con la soluzione:
1) la derivata è sbagliata: devi usare la regola del prodotto.
2) quello che mi pare ti sfugga è il significato del concetto di interpolazione. Ti do dei punti ${x_i}_i$ e ${y_i}_i$, per i quali passa una funzione che voglio ricostruire. Non so cosa fa nei punti in mezzo, ma voglio che passi per quei punti. Chiaramente può farlo in tanti modi.
Ad esempio, in questo caso, una spline cubica non è altro che una funzione polinomiale a tratti con certe proprietà. Determinarla significa semplicemente calcolare i coefficienti.
Una volta che ce l'abbiamo, ci si chiede: assumiamo che io conosca le $x$ e le $y$ di partenza, che sono quelle corrispondenti ad una certa funzione $f(x)$. Voglio vedere di quanto si "sbaglia" globalmente, cioè se la spline $s$ approssima "bene" la funzione $f$ che ne ha originato i "sample" (cioè i punti di partenza di cui parlavamo prima).
Per fare questo altro non devi fare che valutare entrambe le funzioni in un insieme di punti "test", fitti, come in questo caso, e osservarne il risultato.
3) Non ti viene chiesto di calcolare l'errore sulla spline, percio' le variabili
err, snon ti servono.
Ti allego il codice con la soluzione:
clear all; close all; a=1; b=2; n=35; f=@(x) (x.^5).*log(x); % f(x) fd=@(x) 5.*(x.^4)*log(x) + x.^4 ; % f'(x) % valuto la derivata nei punti estremi f0=fd(a); fn=fd(b); x=linspace(a,b,n); y=f(x); % punti test, fitti, in cui andro' a valutare l'errore commesso xx = linspace(a,b,500); cs=spline(x,[f0 y fn],xx) %valutazione della spline vincolata nei punti test % errore commesso approssimando f(x) con la spline. errore = abs(f(xx)-cs); max(abs(errore))