Esercizio Calcolo Numerico
Salve, vorrei porvi alcune domande di cui non riesco a trovare risposta :
1) Trovare gli zeri della funzione :
f=(sin(x.^2+exp(x))/(2.*x-3));
Provando ad usare il comando fzero di matlab (congetturando dal grafico gli intervalli in prossimità degli zeri)
risultano essere :
a) 0.8695
b) 1.4384
c) 1.5000
d) 1.8139
Per quanto riguarda il punto c) in realtà ho constatato che in quel punto il dominio non esiste (almeno per quanto riguarda i numeri reali), quindi non può essere un suo zero, questo ragionamento è corretto?
2) In un esercizio mi viene chiesto di calcolare prima il polinomio di interpolazione della funzione exp(x) con il metodo di lagrange, e,
successivamente di "calcolare un limite teorico dell'errore di troncamento e confrontare con l'errore effettivo nel punto x=1/2"
Non riesco a capire come fare, dovrei usare particolari formule?
3) Modificare la function di gauss in modo da ridurre l'effetto di propagazione degli errori di arrotondamento :
Cosa devo andare a modificare per ridurre l'errore di arrotondamento ?
Magari se qualcuno conosce qualche link dove vengono descritti per bene gli argomenti : Errori di arrotondamento, troncamento, relativi assoluti e può postarli, ve ne sarei grato
1) Trovare gli zeri della funzione :
f=(sin(x.^2+exp(x))/(2.*x-3));
Provando ad usare il comando fzero di matlab (congetturando dal grafico gli intervalli in prossimità degli zeri)
risultano essere :
a) 0.8695
b) 1.4384
c) 1.5000
d) 1.8139
Per quanto riguarda il punto c) in realtà ho constatato che in quel punto il dominio non esiste (almeno per quanto riguarda i numeri reali), quindi non può essere un suo zero, questo ragionamento è corretto?
2) In un esercizio mi viene chiesto di calcolare prima il polinomio di interpolazione della funzione exp(x) con il metodo di lagrange, e,
successivamente di "calcolare un limite teorico dell'errore di troncamento e confrontare con l'errore effettivo nel punto x=1/2"
Non riesco a capire come fare, dovrei usare particolari formule?
function p=lagrange(f,x,z); % % Calcola il valore del polinomio di interpolazione % di Lagrange % % Sintassi p=lagrange(f,x,z); % % x vettore colonna dei nodi % f funzione da interpolare % z punto in cui valutare il polinomio % n=length(x); y=eval(f); for k=1:n L(k)=1; for j=1:n if j~=k L(k)=L(k)*(z-x(j))/(x(k)-x(j)); end end L(k)=L(k)*y(k); end p=sum(L); return
3) Modificare la function di gauss in modo da ridurre l'effetto di propagazione degli errori di arrotondamento :
function x=gauss(A,b); % % Sintassi x=gauss(A,b) % % Metodo di Gauss con pivotaggio % %Parametri di input % A = matrice dei coefficienti % b = vettore (colonna) dei termini noti % %Parametri di output % x = vettore delle soluzioni del sistema % n=length(b); x=zeros(n,1); A=[A,b]; for k=1:n-1 [maxa,r]=max(abs(A(k:n,k))); if maxa<eps error('** Metodo non applicabile'); end r=r+k-1; if r~=k A([k r],:)=A([r k],:); end A(k+1:n,k)=-A(k+1:n,k)/A(k,k); A(k+1:n,k+1:n+1)=A(k+1:n,k+1:n+1)+A(k+1:n,k)*A(k,k+1:n+1); end b=A(:,n+1); A=triu(A(:,1:n)); x=trisup(A,b);
Cosa devo andare a modificare per ridurre l'errore di arrotondamento ?
Magari se qualcuno conosce qualche link dove vengono descritti per bene gli argomenti : Errori di arrotondamento, troncamento, relativi assoluti e può postarli, ve ne sarei grato
Risposte
Ti conviene dire cosa studi o di cosa ti occupi, così da calibrare bene le risposte. Hai seguito un corso di calcolo numerico, forse? Per quale facoltà?
"dissonance":
Ti conviene dire cosa studi o di cosa ti occupi, così da calibrare bene le risposte. Hai seguito un corso di calcolo numerico, forse? Per quale facoltà?
certo, sono uno studente del c.d.l. in informatica della facoltà di scienze, e questi di cui sopra, sono esercizi di calcolo numerico, da svolgere, in parte, con il software matlab
1) Ok. Già a livello teorico se una funzione non è definita in un punto non ha senso dire poi che quel punto è uno zero. Come dicevamo nell'altro topic, MATLAB parte sempre dal presupposto che tu sai cosa stai facendo. In questo caso, il fatto che la funzione non sia definita in un punto ha fatto sì che fzero producesse un risultato sballato.
2) Ci sono tante formule per stimare il resto del polinomio di interpolazione. Quella più comune e semplice da ricordare usa le derivate e te la enuncio:
Sia $f$ una funzione derivabile $n+1$ volte nell'intervallo $[a,b]$, e siano $x_0 ... x_n$ nodi in $[a, b]$. Detto $P_nf$ il polinomio di interpolazione della $f$ nei nodi dati, esiste un $xi\in[a, b]$ tale che
$f(x)-P_nf(x)=\frac{f^{(n+1)} (xi)}{(n+1)!}(x-x_0)...(x-x_n)$.
Questa formula ti permette di costruire stime del resto. E' facile da applicare alla funzione $"exp"$ perché essa coincide con le proprie derivate.
3) La strategia più comune per ridurre la propagazione dell'errore nel metodo di Gauss si chiama pivoting. Possibile che non se ne sia parlato, nel corso di calcolo numerico che hai seguito?
Infine, per materiale didattico, consulta il topic [Dispense appunti ed esercizi in rete] che trovi in cima alla sezione.
2) Ci sono tante formule per stimare il resto del polinomio di interpolazione. Quella più comune e semplice da ricordare usa le derivate e te la enuncio:
Sia $f$ una funzione derivabile $n+1$ volte nell'intervallo $[a,b]$, e siano $x_0 ... x_n$ nodi in $[a, b]$. Detto $P_nf$ il polinomio di interpolazione della $f$ nei nodi dati, esiste un $xi\in[a, b]$ tale che
$f(x)-P_nf(x)=\frac{f^{(n+1)} (xi)}{(n+1)!}(x-x_0)...(x-x_n)$.
Questa formula ti permette di costruire stime del resto. E' facile da applicare alla funzione $"exp"$ perché essa coincide con le proprie derivate.
3) La strategia più comune per ridurre la propagazione dell'errore nel metodo di Gauss si chiama pivoting. Possibile che non se ne sia parlato, nel corso di calcolo numerico che hai seguito?
Infine, per materiale didattico, consulta il topic [Dispense appunti ed esercizi in rete] che trovi in cima alla sezione.
"dissonance":
1) Ok. Già a livello teorico se una funzione non è definita in un punto non ha senso dire poi che quel punto è uno zero. Come dicevamo nell'altro topic, MATLAB parte sempre dal presupposto che tu sai cosa stai facendo. In questo caso, il fatto che la funzione non sia definita in un punto ha fatto sì che fzero producesse un risultato sballato.
2) Ci sono tante formule per stimare il resto del polinomio di interpolazione. Quella più comune e semplice da ricordare usa le derivate e te la enuncio:
Sia $f$ una funzione derivabile $n+1$ volte nell'intervallo $[a,b]$, e siano $x_0 ... x_n$ nodi in $[a, b]$. Detto $P_nf$ il polinomio di interpolazione della $f$ nei nodi dati, esiste un $xi\in[a, b]$ tale che
$f(x)-P_nf(x)=\frac{f^{(n+1)} (xi)}{(n+1)!}(x-x_0)...(x-x_n)$.
Questa formula ti permette di costruire stime del resto. E' facile da applicare alla funzione $"exp"$ perché essa coincide con le proprie derivate.
3) La strategia più comune per ridurre la propagazione dell'errore nel metodo di Gauss si chiama pivoting. Possibile che non se ne sia parlato, nel corso di calcolo numerico che hai seguito?
Infine, per materiale didattico, consulta il topic [Dispense appunti ed esercizi in rete] che trovi in cima alla sezione.
Ok, ti ringrazio, sei stato davvero cordiale e gentile, per quanto riguarda il punto 3) in realtà già la funzione postata è espressa con pivotaggio, solo che non sapevo che tale funzione servisse per diminuire l'errore di arrotondamento. Il problema è che non ho avuto modo di seguire il corso e non potrò farlo in quanto il corso è stato eliminato a causa delle nuove lauree quinquennali e sto studiando tutto da solo da metà luglio, per la parte pratica il materiale è corposo (mi sono fatto prestare materiale da amici e l'ho trovato su internet), i problemi sorgono, da come si può vedere, sulla parte teorica (per esempio non ho trovato scritto da nessuna parte che il metodo di gauss con pivoting riduce l'errore di arrotondamento). Quindi per quanto riguarda il punto 2) ho capito come calcolare l'errore stimato, per quanto riguarda invece l'errore effettivo non dovrei avere avere la soluzione esatta e sottrarla alla soluzione numerica ottenuta con matlab (più nello specifico abs[soluzione_esatta-soluzione_numerica] )? altrimenti senza soluzione esatta come la calcolo in un punto specifico x=1/2 ?
Per il punto 2): si esatto, l'errore reale lo calcoli così. Naturalmente starai trascurando l'errore interno commesso da MATLAB nell'approssimare $e^x$ con exp(x), errore dell'ordine di eps, che se non sbaglio è 2^-52 o qualcosa del genere.
"dissonance":
Per il punto 2): si esatto, l'errore reale lo calcoli così. Naturalmente starai trascurando l'errore interno commesso da MATLAB nell'approssimare $e^x$ con exp(x), errore dell'ordine di eps, che se non sbaglio è 2^-52 o qualcosa del genere.
Scusami se ti disturbo ancora, ma l'esercizio non mi dà la soluzione esatta, come la calcolo ? quella numerica con matlab passando con eval l'argomento x=1/3 alla funzione exp(x) e fin qui ci sono.
In un altro esercizio mi viene chiesto :
1) di calcolarmi gli zeri di f='x.^4-3.2.*x.^3-6.15.*x.^2+15.786.*x-4.104' con il comando fzero e poi nel 2) mi vengono elencate le radici esatte :
x1=-2.4
x2=0.3
x3=1.5
x4=3.8
e mi viene chiesto di calcolare, per ciascun valore ottenuto al punto 1) di determinare l'ordine dell'errore di approssimazione. Come lo calcolo ? Con il comando fzero risultano anche a te esattamente uguali le radici calcolare rispetto a quelle date x1,x2,x3,x4; quindi non vi è errore ?
Scusami se ti sto facendo perdere tempo, ma mi rimane poco tempo per studiare e non so veramente dove cercare materiale che spieghi come calcolarmi queste cose (in effetti gli errori sono l'unico argomento che sto trovando un pò complicato da capire)
Grazie
dissonance, ti prego, illuminami

Sulla propagazione degli errori (anche nota come errore algoritmico) ho appena consultato la dispensa segnalata da Steven qui. Ti può servire, tieni conto che ti servono solo le prime 7 pagine, il resto sono esempi che -se proprio necessario- puoi saltare.
Comunque, veniamo a noi. Per il primo esercizio, quello di stimare l'errore commesso approssimando $e^x$ con un polinomio di interpolazione, lo svolgimento che credo corretto è questo:
dalla traccia abbiamo avuto dei nodi $x_0, x_1, x_2, ..., x_n$ (tu non li hai riportati ma devono essere stati forniti per forza). Supponiamo che siano in ordine: $x_0
Con la rappresentazione di Lagrange che vedo tu conosci costruiamo il polinomio di interpolazione $P_n(x)=\sum_{k=0}^n e^{x_k}L_k(x)$. Il nostro obiettivo è approssimare $e^{0.5}$ e prenderemo come approssimazione $P_n(0.5)$; il problema è dare una stima dell'errore così commesso.
Dalla formula dell'errore ricordata prima, e dal fatto che $("d"^ke^x)/("d"x^k)=e^x$ per ogni $k$, segue che esiste un $xi\in[x_0, x_n]$ tale che
$e^x-P_n(x)=\frac{e^{xi}}{(n+1)!}(x-x_0)(x-x_1)...(x-x_n)$; per $x=0.5$ si ottiene
$e^{0.5}-P-n(0.5)=\frac{e^{xi}}{(n+1)!}(0.5-x_0)(0.5-x_1)...(0.5-x_n)$ dove $xi$ non è noto; ma sicuramente $xi\in[x_0, x_n]$, quindi $e^{xi}<=e^{x_n}$ e inserendo questa disuguaglianza nella formula dell'errore otteniamo (NOTA: è necessario prendere il valore assoluto, perché il pezzo $(0.5-x_0)(0.5-x_1)...(0.5-x_n)$ potrebbe essere negativo; del resto le stime dell'errore si fanno sempre in valore assoluto):
$|e^{0.5}-P_n(0.5)|<=|\frac{e^{x_n}}{(n+1)!}(0.5-x_0)(0.5-x_1)...(0.5-x_n)|$. (S)
Questa è la stima che si può fornire a priori. Sostituendo i valori di $x_0, x_1, ..., x_n$ si ottiene il numero voluto.
Ora chiaramente questa stima è molto pessimistica: abbiamo supposto che l'errore fosse il più grande possibile, ma potrebbe essere (e in genere è) MOLTO più piccolo. Per vedere quanto effettivamente vale l'errore possiamo usare la function "exp" interna a MATLAB, supponendo che il risultato da essa fornito sia esatto:
>> exp(0.5)
e calcolare poi $|e^{0.5}-P_n(0.5)|$ per vedere la differenza con la stima fornita sopra.
___________________
Per l'altro esercizio invece, si, se fzero ti restituisce esattamente quei valori (cosa che mi pare plausibile, essendo la funzione coinvolta un polinomio non particolarmente mal condizionato) allora l'errore è zero. Si, è strano, ma se hai riportato correttamente la traccia, il tuo svolgimento è esatto.
Comunque, veniamo a noi. Per il primo esercizio, quello di stimare l'errore commesso approssimando $e^x$ con un polinomio di interpolazione, lo svolgimento che credo corretto è questo:
dalla traccia abbiamo avuto dei nodi $x_0, x_1, x_2, ..., x_n$ (tu non li hai riportati ma devono essere stati forniti per forza). Supponiamo che siano in ordine: $x_0
Con la rappresentazione di Lagrange che vedo tu conosci costruiamo il polinomio di interpolazione $P_n(x)=\sum_{k=0}^n e^{x_k}L_k(x)$. Il nostro obiettivo è approssimare $e^{0.5}$ e prenderemo come approssimazione $P_n(0.5)$; il problema è dare una stima dell'errore così commesso.
Dalla formula dell'errore ricordata prima, e dal fatto che $("d"^ke^x)/("d"x^k)=e^x$ per ogni $k$, segue che esiste un $xi\in[x_0, x_n]$ tale che
$e^x-P_n(x)=\frac{e^{xi}}{(n+1)!}(x-x_0)(x-x_1)...(x-x_n)$; per $x=0.5$ si ottiene
$e^{0.5}-P-n(0.5)=\frac{e^{xi}}{(n+1)!}(0.5-x_0)(0.5-x_1)...(0.5-x_n)$ dove $xi$ non è noto; ma sicuramente $xi\in[x_0, x_n]$, quindi $e^{xi}<=e^{x_n}$ e inserendo questa disuguaglianza nella formula dell'errore otteniamo (NOTA: è necessario prendere il valore assoluto, perché il pezzo $(0.5-x_0)(0.5-x_1)...(0.5-x_n)$ potrebbe essere negativo; del resto le stime dell'errore si fanno sempre in valore assoluto):
$|e^{0.5}-P_n(0.5)|<=|\frac{e^{x_n}}{(n+1)!}(0.5-x_0)(0.5-x_1)...(0.5-x_n)|$. (S)
Questa è la stima che si può fornire a priori. Sostituendo i valori di $x_0, x_1, ..., x_n$ si ottiene il numero voluto.
Ora chiaramente questa stima è molto pessimistica: abbiamo supposto che l'errore fosse il più grande possibile, ma potrebbe essere (e in genere è) MOLTO più piccolo. Per vedere quanto effettivamente vale l'errore possiamo usare la function "exp" interna a MATLAB, supponendo che il risultato da essa fornito sia esatto:
>> exp(0.5)
e calcolare poi $|e^{0.5}-P_n(0.5)|$ per vedere la differenza con la stima fornita sopra.
___________________
Per l'altro esercizio invece, si, se fzero ti restituisce esattamente quei valori (cosa che mi pare plausibile, essendo la funzione coinvolta un polinomio non particolarmente mal condizionato) allora l'errore è zero. Si, è strano, ma se hai riportato correttamente la traccia, il tuo svolgimento è esatto.
Ti ringrazio, sei stato gentilissimo
Cordiali Saluti
Giuseppe
Cordiali Saluti
Giuseppe