Calcolo numerico/Operazioni aritmetiche con il calcolatore

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:Calcolo numerico

Non è detto che i risultati delle operazioni tra numeri macchina siano ancora dei numeri macchina. Ci sono dei bit di guardia che permettono di rappresentare l'operazione in maniera quasi esatta, e poi si converte il risultato in numero macchina.

Somma

Per eseguire la somma algebrica x±y:

  1. rappresentiamo x e y con i loro floating, cioè fl(x)+fl(y),
  2. dopo aver sommato facciamo il floating del risultato

cioè

x±y=fl(fl(x)+fl(y))

L'errore relativo fl(x)−xx=ε, e si pone fl(x)=x(1+ε). ε non un infinitesimo.

fl(x)+fl(y)=x(1+εx)+y(1+εy)=fl(fl(x)+fl(y))=(1+εs)(x(1+εx)+y(1+εy))

Al primo ordine, si ha

=x(1+εx)±y(1+εy)+(x±y)εs

=(x±y)+xεx+yεy+(x±y)εs

Considerando l'errore relativo al primo ordine:

Er=|fl(x±y)−(x±y)x±y|=∘|(x±y)+xεx+yεy+(x+y)εs−(x±y)|x±y

=∘xεx+yεy+(x+y)εs|x±y

=|xx±y∗εx±yx±yεy+εs|

≤|xx±y|∗|εx|±|yx±y|∗|εy|+|εs|

e in base al teorema sulla round of unit

≤u∗(|x||x±y|+|y||x±y|+1)

Distinguiamo due casi.

  1. Se i due numeri hanno segno concorde, allora x/|x+y| e y/|x+y| sono frazioni proprie, e sono minori o uguali ad 1. Allora l'errore relativo è maggiorato al primo ordine da 3u=3∗2−52. L'operazione è "stabile", e non dipende dai dati.
  2. Nel caso di segno discorde, l'errore dipende dai dati, e non è sempre "stabile", perché può capitare il fenomeno della cancellazione numerica.

Esempio 1.6

Supponiamo ℱ=ℱ(10,5,−6,6). Consideriamo

x=0.123456,y=−0.123454

fl(x)=0.12346∗100per eccesso

fl(y)=−0.12345∗100tper difetto

In aritmetica esatta

x+y=0.2∗10−5

Per il calcolatore

fl(x)+fl(y)=0.1∗10−4∈ℱ

Non c'è nessuna cifra esatta.

eA=0.8∗10−5,er=4,ep=400%

La somma è fra due numeri quasi uguali in valore assoluto e con segno opposto: si ha un errore molto elevato dovuto all'approssimazione. Questo fenomeno viene chiamato cancellazione numerica.

L'errore relativo totale è fatto al primo ordine da tre termini:

  1. εs, errore locale generato nell'operazione;
  2. errore relativo al dato x moltiplicato per un coefficiente cx, ed è xx±y;
  3. errore relativo al dato y, moltiplicato per cy

Allora εx,εy danno l'errore di rappresentazione sui dati, mentre cx,cy, detti coefficienti di amplificazione.

L'errore totale al primo ordine è

εs+cx∗εx+cy∗εy

(coefficiente lungo il ramo moltiplicato per errore)

Esercizio 1.1

Se l'operazione si scrive come f(x,y) allora

cx=xf(x,y)∗∂f∂x

cy=yf(x,y)∗∂f∂y

Verificare che questo è vero per i risultati ottenuti per la somma, e dimostrarlo nel caso di moltiplicazione e divisione.

Nel caso della somma:

f(x,y)=x+y∂f∂x=1∂f∂y=1⟶cx=|x||x+y|∗1⟶cy=|y||x±y|

quindi

Er=x|x±y|∗εx+y|x±y|∗εy+εscoincide con l'espressione ottenuta

Nel caso della moltiplicazione ricavo il risultato con i due procedimenti:

Procedimento 1: x∗y viene eseguita dal calcolatore come

fl(fl(x)∗fl(y))

e considerando che fl(x)=x(1+εx) e fl(y)=y∗(1−εy) otteniamo:

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

=(1+εm)[xy(1+εx)(1+εy)]

e al primo ordine otteniamo:

=xy+xyεx+xyεy+xyεm

e l'errore relativo è:

Er=|fl(xy)−xy||xy|=

=∘xy+xyεx+xyεy+xyεm−xy|xy|

=∘xyεx+xyεy+xyεm|xy|

=εx+εy+εm

Procedimento 2:

f(x,y)=xy∂f∂x=y∂f∂y=x⟶cx=x|xy|∗y=1⟶cy=y|xy|∗x=1

quindi

Er=cxεx+cyεy+εm

=εx+εy+εm

Derivazione dei coefficienti di amplificazione

Vogliiamo calcolare f(x1,x2,…,xn). Ipotizziamo che f sia sufficientemente regolare, e che non ci sia errore nel calcolo del valore di f, ma solo nella rappresentazione dei dati.

Chiamiamo x=(x1,…,xn), e ne consideriamo il floating, cioè fl(x)=(fl(x1),…,fl(xn)).

Er=f(fl(x))−f(x)f(x)

Caso 1: n=1

Er=f(x)+f′(x)∗(fl(x)−x)+o(fl(x)−x)−f(x)f(x)

Considerando f′(x)∗(fl(x)−x)x, moltiplichiamo numeratore e denominatore per v:

x∗f′(x)∗(fl(x)−x)x∗f(x)

=x∗f′(x)f(x)∗fl(x)−xx+o(fl(x)−x)f(x)

=(cx∗εx)+o(fl(x)−x)

Caso 2: n generico

Er=1f(x)[f(x)+∑i=1n∂f∂xi(x)∗(fl(xi)−xi)+o(|fl(x)−x|)−f(x)]

Er=[∑i=1nxif(x∗∂f∂xi(x)]∗fl(xi)−xixi+o(|fl(x)−x|)f(x)

=∑icxiεxi+o(fl(x)−x)

Divisione

x/y=x(1+εx)y(1+εy)

(1+εd)x(1+εx)y(1+εy)

=x/y∗(1+εx)(1+εd)1+εy

Sappiamo che

11+εy∘1−εy

Quindi

=xy(1+εx)(1−εy)(1+εd)

=x/y∗(1+εx−εy+εd)

Considerando l'errore relativo:

|x/y|∗(1+εx−εy+εd)−|x/y|x/y

1+εx−εy+εd−1

=εx−εy+εd≤|εx|+|εy|+|εd|≤3u

e si ottiene lo stesso risultato della moltiplicazione, cioè l'operazione di divisione non dipende dai dati.

Er=|cx|∗εx+|cy|∗εy+εd

e ancora cx=x∗1/yx/y=1,cy=−x/y2∗yx/y=−1.

Template:Avanzamento