Calcolo numerico/Condizionamento e stabilità

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:Calcolo numerico

Condizionamento

Il condizionamento fa riferimento all'errore inerente. Se |cxi| sono elevati in modulo, allora a un piccolo errore εxi sulla rappresentazione dei dati corrisponde un grande errore su f(x), e il problema è mal condizionato.

Esempio 1.7

Consideriamo un'equazione del tipo

ax2+bx+c=0,δ=b2−4ac

Per calcolare le radici si ha la formula x1,2=−b±δ2a.

Se δ=b, per calcolare x1 sto sommando due quantità quasi uguali, e quindi c'è un grande errore di cancellazione. Invece il calcolo di x2 non dà problemi.

Viceversa, se δ=−b, l'errore di cancellazione si ha per x2. Allora possiamo rimodellizzare il problema: se δ≃−b, allora calcolo x2 con la formula solita senza avere problemi, invece calcolo x1 ricordando che

x1x2=c/a

quindi

x1=cax2

e il problema torna a essere stabile, dopo essere stato rimodellizzato.

Stabilità

La stabilità è connessa all'errore algoritmico, e riguarda l'ordine esatto con cui vengono fatte le operazioni. L'errore algoritmico viene generato nella valutazione di ψ(fl(x)).

ψ è una funzione razionale, cioè ha un'espressione analitica data da un numero finito di operazioni di somma e sottrazione. L'errore algoritmico è una combinazione lineare degli errori locali generati nelle singole operazioni.

Simbolicamente,

|ealg|>θ(u)+O(u2)

dove θ è indipendente dalla round of unit, e tiene conto della combinazione lineare dei coefficienti.

Osservazione 1.3

Se abbiamo un problema mal condizionato, l'analisi dell'errore algoritmico è inutile, perché questo errore è trascurabile rispetto all'errore inerente.

Esempio di rimodellizzazione di un problema

Esercizio 1.2

Analizzare l'errore nel calcolo della funzione

f(x,y)=x2−y2=(x+y)(x−y).

Chiamiamo a1 l'algoritmo f=x2−y2 che è dato dai seguenti passi:

  1. poniamo z1=x∗x;
  2. poniamo z2=y∗y;
  3. eseguiamo l'operazione z3=z1−z2.

Nella moltiplicazione tengo conto che cx=cy=1, mentre nella sottrazione si ha cx=xx−y e cy=−yx−y.

Rappresento graficamente l'algoritmo:

xxyy↑(1)↑(1)↑(1)↑(1)z1z2↑(z1z3)↑(−z2z3)z3=z1−z2

εz3+z1z3(εz1+εx+εx)−z2z3(εz2+εy+εy)

Vogliamo rappresentare la formula generale come somma di errore algoritmico e inerente.

er=εz3+2z1z3∗εx−2z2z3∗εy+z1z3∗εz1−z2z3∗εz2

e sostituendo a z1,z2,z3 le loro espressioni in termini di x,y,z si ha:

=2x2x2−y2εx−2y2x2−y2∗εy+εz3+x2x2−y2εz1−y2x2−y2εz2

I primi due termini rappresentano l'errore inerente, mentre gli altri tre rappresentano l'errore algoritmico. Se x2−y2 è piccolo, il problema è mal condizionato, e l'errore inerente domina.

Esercizio 1.3

Ricavare lo stesso risultato per via analitica.

f(x,y)=x2−y2

=fl{fl[fl(x)∗fl(x)]−fl[fl(y)∗fl(y)]}

=fl{fl[(1+εx)∗|x|∗(1+εx)∗|x|]−fl[(1+εy)∗|y|∗(1+εy)∗|y|]}

=fl{(1+εz1)(1+εx)∗|x|∗(1+εx)∗|x|−(1+εz2)(1+εy)∗|y|∗(1+εy)∗|y|}

=(1+εz3){(1+εz1)(1+εx)∗|x|∗(1+εx)∗|x|−(1+εz2)(1+εy)∗|y|∗(1+εy)∗|y|}

=(1+εz3){x2(1+εz1)(1+εx)2−y2(1+εz2)(1+εy)2}

e al primo ordine:

=(1+εz3){x2(1+εz1)(1+2εx)−y2(1+εz2)(1+2εy)}

=(1+εz3){x2(1+εz1+2εx)−y2(1+εz2+2εy)}

=x2(1+εz1+2εx+εz3)−y2(1+εz2+2εy+εz3)

Valuto l'errore relativo:

Er=fl(x2−y2)−(x2−y2)x2−y2

=x2(εz1+2εx+εz3)−y2(εz2+2εy+εz3)x2−y2

=(x2−y2)εz3+2x2εx+x2εz1−y2εz2−2y2εyx2−y2

=2x2x2−y2εx−2y2x2−y2∗εy+x2x2−y2εz1−y2x2+y2εz2+εz3

e si ottiene lo stesso risultato di prima.

Rimodellizzo il problema applicando l'algoritmo 2.

  1. w1=x+y
  2. w2=x−y
  3. w3=w1∗w2

Assumiamo che stiamo facendo conti sui numeri macchina, perché l'errore inerente si può calcolare a parte, cioè poniamo εx=εy=0. Graficamente otteniamo:

xyxy↑(cx)↑(cy)↑(cx)↑(cy)w1w2↑(1)↑(1)z

quindi

ealg=ε3+1∗(ε1+cx∗εx)+1∗(ε2+cy∗εy)

e allora, siccome εx=εy=0 ottengo:

ealg=ε3+1∗(ε1+0)+1∗(ε2+0)

=ε1+ε2+ε3

Esercizio 1.4

Ricavare lo stesso risultato per via analitica.

fl(x2−y2)=

fl[fl(x(1+εx)+y(1+εy))∗fl(x(1+εx)−y(1+εy))]=

(1+ε3)[(1+ε1)(x(1+εx)+y(1+εy))∗(1+ε2)∗[x(1+εx)−y(1+εy)]]=

Al primo ordine

(1+ε3)[(1+ε1)∗(1+ε2)∗[x2(1+2εx)−y2(1+2εy)]=

(1+ε1+ε2+ε3)∗[x2(1+2εx)−y2(1+2εy)]=

x2(1+2εx+ε1+ε2+ε3)−y2(1+2εy+ε1+ε2+ε3)

Er=x2(1+2εx+ε1+ε2+ε3)−y2(1+2εy+ε1+ε2+ε3)−x2+y2|x2−y2|

Er=x2(2εx+ε1+ε2+ε3)−y2(2εy+ε1+ε2+ε3)|x2−y2|

Er=(x2−y2)(ε1+ε2+ε3)+2x2∗εx−2y2∗εy|x2−y2|

Er≤(x2−y2)(ε1+ε2+ε3)x2−y2+2x2∗εxx2−y2+2y2∗εy|x2−y2|

Er≤ε1+ε2+ε3+2x2∗εxx2−y2+2y2∗εy|x2−y2|

Gli ultimi due addendi rappresentano l'errore inerente, uguale a quello del primo algoritmo, mentre

Ealg=ε1+ε2+ε3≤3u

Nel primo algoritmo:

|Ealg,1|≤u(1+x2+y2x2−y2)

invece

|Ealg,2|≤3u

Il secondo algoritmo è stabile e indipendente dai dati, ma quando |x2−y2| è piccolo il problema diventa mal condizionato quindi questo vantaggio non serve a niente, tranne nel caso in cui x e y sono numeri macchina.

La cosa migliore è fare subito le operazioni rischiose (somma e sottrazione), e lasciare moltiplicazioni e divisioni per ultime, in modo che l'errore accumulato sia minore.

Errore nel calcolo della somma di n numeri

Calcoliamo l'errore della funzione

f(x)=∑i=1nxi

e consideriamo

ci=xif(x)∗∂f∂xi=xif(x)

Ein=∑i=1nεxi∗xif(x1,…,xn)

=|1f(x)∗∑i=1nxi∗εxi|

≤|nuf(x)|∗max⁡|xi|

L'errore inerente dipende dai dati e dal loro numero.

Se siamo nella situazione in cui gli xi hanno tutti segni concordi, allora:

|∑ixi|=∑i|xi|

Quindi, tenendo anche conto che f(x)=|∑i=1nxi|, si ha:

Ein=1|∑ixi|∗|∑ixiεxi|

≤1|∑xi|∗∑i|xi||εxi|

≤1∑i|xi|∗u∗∑i|xi|<u

Allora in questo caso il problema è ben condizionato, mentre nel caso generale l'errore inerente dipende dal valore dei dati e dal loro numero.

Rappresento il grafo dell'errore relativo nel caso della somma di quattro numeri x1,x2,x3,x4 ponendo:

  1. z1=x1+x2;
  2. z2=z1+x3=(x1+x2)+x3;
  3. z3=x4+z2=x4+(x1+x2+x3).

Il grafico è

x2x1↑(cx2)↑(cx1)x3z1↑(cx3)↑(cz1)x4z2↑(cx4)↑(cz2)z3

Supponiamo che x1,x2,x3,x4 siano numeri macchina, quindi εxi=0, e rimane:

Ealg=ε3+cz2∗(ε2+cz1∗ε1)

e sostituendo ai coefficienti le loro espressioni:

=ε3+z2z3∗(ε2+z1z2ε1)

=ε3+z2z3∗ε2+z2z3∗z1z2ε1

=ε3+z2z3∗ε2+z1z3∗ε1

Sostituiamo le espressioni di zi espressi in funzione delle xi:

=ε3+x1+x2+x3x1+x2+x3+x4∗ε2+x1+x2x1+x2+x3+x4∗ε1

allora anche l'errore algoritmico dipende dai dati.

Esercizio 1.5

Trovare l'espressione dell'errore algoritmico per via analitica.

Supponiamo che gli xi siano numeri macchina, cioè che fl(xi)=xi.

x1+x2+x3+x4=

{[(x1+x2)+x3]+x4}

fl{fl[fl(x1+x2)+x3]+x4}

={[(x1+x2)(1+ε1)+x3](1+ε2)+x4}(1+ε3)

Eseguendo i prodotti e trascurando i termini di ordine superiore al primo:

={[x1+x2+x3+x1ε1+x2ε1](1+ε2)+x4}(1+ε3)

={x1+x2+x3+x4+x1ε1+x2ε1+x1ε2+x2ε2+x3ε2}(1+ε3)

=x1+x2+x3+x4+x1ε1+x2ε1+x1ε2+x2ε2+x3ε2+x1ε3+x2ε3+x3ε3+x4ε3

Allora

Ealg=|fl(x1+x2+x3+x4)−x1−x2−x3−x4||x1+x2+x3+x4|

=x1+x2+x3+x4+x1ε1+x2ε1+x1ε2+x2ε2+x3ε2+x1ε3+x2ε3+x3ε3+x4ε3−x1−x2−x3−x4x1+x2+x3+x4

=x1ε1+x2ε1+x1ε2+x2ε2+x3ε2+x1ε3+x2ε3+x3ε3+x4ε3x1+x2+x3+x4

=ε3+x1ε1+x2ε1x1+x2+x3+x4+x1ε2+x2ε2+x3ε2x1+x2+x3+x4

=ε3+ε1(x1+x2)x1+x2+x3+x4+ε2(x1+x2+x3)x1+x2+x3+x4

e si ottiene il risultato precedente.

Nel caso della somma di n numeri si ottiene la formula generale:

Ealg=|1f(x)∑i=1n−1∑j=1i+1xjεi|

Se invece gli xi sono di segno concorde, allora

∑j=1i+1|xj|≤|f(x)|

quindi, applicando la disuguaglianza triangolare, si ottiene:

Ealg≤|1f(x)|∑i=1n−1∑j=1i+1|xj|εi|

Ealg≤∑i=1n−1|εi|≤(n−1)u

Allora l'errore algoritmico non dipende dai dati.

Ottimizzazione dell'algoritmo per la somma di n numeri

Procedimento 1: per ridurre l'errore nella somma, conviene ordinare i numeri per valore assoluto, dal più piccolo al più grande. In questo modo risulta che, se consideriamo le medie aritmetiche dei primi i+1 numeri, si ha:

|1/i∗∑j=1ixj|≤1i+1∗|∑j=1i+1xj|≤1n−1|f(x)|

∑j=1i+1|xj||f(x)|≤i+1n−1

quindi

ealg=1|f(x)|∑i=1n−1|∑j=1i+1xj|∗|εi|

≤u1|f(x)|∑i=1n−1|∑j=1i+1xj|

≤un−1∑i=1n−1(i+1)

Esercizio 1.6

Verificare che

∑i=1n−1(i+1)=(n2+n−2)/2

Verifichiamo per induzione: per n=2, si ha:

∑i=12−1(i+1)=2=(2∗2+2−2)/2=2

Supponiamo vero l'asserto per n−1, e lo dimostriamo per n.

∑i=1n−1(i+1)=

Isolando l'ultimo termine della somma:

n+∑i=1(n−1)−1(i+1)=

e applicando il passo induttivo al secondo addendo si ottiene:

n+[(n−1)2+(n−1)−2]/2=

n+[n2+1−2n+n−1−2]/2=

n+[n2−n−2]/2=

[n2+2n−n−2]/2=n2+n−22

Applicando l'esercizio e sostituendo nella formula 1 si ottiene:

ealg<un−1∑i=1n−1(i+1)

<(n2+n−2)/2∗un−1<(n+1)/2u

e l'errore è dell'ordine di u/2.

Procedimento 2: supponiamo di avere n=23 numeri da sommare. Allora

x1+x2=z1,x3+x4=z2,x5+x6=z3,x7+x8=x4

z1+z2=z5,z3+z4=z6

z5+z6=z7

|Er|>log⁡n

Errore nel calcolo dell'esponenziale

Calcoliamo

f(x,y)=ex+y=ex∗ey

In questo caso c'è una funzione di libreria exp⁡(z) tale che per ogni z, exp⁡(z)=ez∗(1+εz), dove ε=|ean+ealg|≤u.

1. Calcoliamo l'errore inerente:

cx=xf(x,y)∗∂f∂x=xex+y∗ex+y=x

cy=y

quindi

ein=x∗εx+y∗εy

2. Applicando l'algoritmo A1=ex∗ey si ha:

z1=ex,z2=ey,z3=z1∗z2

Rappresentiamo il grafo:

xy↑(cx)↑(cy)z1z2↑(c1)↑(c2)z3

Sapendo che c1=c2=1 si ha:

ealg=ε3+1∗ε1+1∗ε2≤|3u|

Questo è un algoritmo stabile qualsiasi siano i due numeri x e y.

3. Per via analitica, supponendo che fl(x)=x e fl(y)=y calcoliamo l'errore del primo algoritmo:

ex+y=ex∗ey=fl[fl(ex)∗fl(ey)]

=fl[ex∗(1+ε1)∗ey∗(1+ε2)]

=(1+ε3)∗ex∗(1+ε1)∗ey∗(1+ε2)

e al primo ordine:

=ex∗ey∗(1+ε1+ε2+ε3)

quindi

Er=fl(ex+y)−ex+yex+y

=ex∗ey∗(1+ε1+ε2+ε3)−ex∗eyex∗ey

=|ε1+ε2+ε3|≤|ε1|+|ε2|+|ε3|<3u

4. Applichiamo l'algoritmo 2 f(x,y)=ex+y e poniamo

w1=x+y,w2=ew1

xy↑(cx)↑(cy)w1↑(c1)w2

e assumendo εx=εy=0, e sapendo che c1=w1 si ha:

|ealg|=ε2+w1ε1=ε2+(x+y)ε1<(1+x+y)u

Quando x+y è piccolo, l'algoritmo 2 è più stabile, mentre è meno stabile quando x+y è grande.

5. Per via analitica, calcolo l'errore algoritmico del secondo algoritmo.

ex+y=fl[efl(x+y)]

=fl(e(1+ε1)∗(x+y)

=e(1+ε1)∗(x+y)∗(1+ε2)

Al primo ordine:

=[ex+y+ex+y∗ε1]∗(1+ε2)

=ex+y+(x+y)∗ex+y∗ε1+ex+y∗ε2

Calcolo l'errore relativo:

Er=ex+y+ex+y∗(x+y)∗ε1+ex+y∗ε2−ex+yex+y

e al primo ordine rimane:

=(x+y)ε1+ε2

Template:Avanzamento