condizionamento degli zeri di un polinomio

Post on 12-Nov-2014

466 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Condizionamento degli zeri di un polinomio, algoritmo in matlab per il calcolo delle radici, tesina per il corso di Calcolo Numerici

TRANSCRIPT

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 1 di 8 

1. Approccio al problema

Il condizionamento degli zeri (ξ) al variare dei coefficienti a  del polinomio è defini-to come: 

)('

Δ

ξpaξ

εε

Cp nnk

rx

ry ⋅==−− 1

occorre quindi in primo luogo determinare le radici del polinomio. 

Radici. Per prima cosa il polinomio viene tabulato per poter isolare gli zeri per via grafica. 

 

Dai grafici di p ( x ) , a sinistra con l’asse delle ordinate in scala logaritmica del mo-dulo di y, a destra  in scala  lineare si nota  la presenza di tre radici  intorno a -5, -1, e 60, identificate rispettivamente con ξ1, ξ2 e ξ3. 

Si osserva  immediatamente come  la rapidità della funzione  intorno alla radice ξ3 renda  il problema particolarmente malcondizionato: ad una piccola variazione sulla x  corrisponde una grande variazione della y   (l’asse y  è visualizzato con scala 1012). Per  la stessa radice, nel grafico  logaritmico, si osserva una variazione di segno  in cui  il modulo della funzione è superiore ai 10-12 anche se il passo della y  è di sole 0,2 unità; Il picco ver-so il basso avrebbe dovuto tendere verso -∞. 

Dall’ingrandimento  della funzione  intorno  all’origine  si osserva  la  presenza  di  flessi  in prossimità di ξ1 e di ξ2, dei quali occorre  tener  conto  per  la  de-terminazione della radici, in par-ticolare  ξ1  potrebbe  coincidere con un flesso. 

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 2 di 8 

2. Ricerca delle radici con Matlab

Sono stati implementati 2 algoritmi in linguaggio Matlab per la ricerca delle radi-ci:  il metodo di Newton ed  il metodo di bisezione, con  i  rispettivi script  riportati  in ap-pendice.  Il calcolatore utilizzato è  in grado di operare con numeri  in virgola mobile con una precisione massima di 17 cifre. 

Radice ξ1. La presenza del flesso  (p ’ ’ ( x )=0)  in  prossimità della  radice  rende  difficoltosa  la ricerca  di  un  intervallo  [a,b], all’interno del quale deve  trovarsi la  radice  ed  in  cui  la derivata  se-conda non è mai nulla.  Le  condi-zioni  sovra  esposte  garantiscono la  convergenza  del  metodo  di Newton a partire da un estremo di Fourier (p ( x 0 ) ·p ’ ’ ( x 0 )>0). 

Non  è  neppure  possibile garantire che p ’ ( x )  sia non nulla in un  intorno della radice, pertan-to non  sono  soddisfatte  le  condi-

zioni per la convergenza del metodo di Newton. La radice potrebbe avere molteplicità 3, in tal caso sarebbe possibile applicare il metodo di Newton modificato, per il quale: 

)(')(

n

nnn xp

xpxx 31 −=+  

Con  il metodo di bisezione  invece è sufficiente scegliere un  intervallo  [a,b] per  il quale risulta p (a)·p (b)<0, ciò è verificato per a=-4.6, b=-4. L’output ottenuto è: 

>>bisezpoly(A,a,b,epsilon); ------------------------------------------------------------------------------- n a b m p(m) ------------------------------------------------------------------------------- 1 -4.600000000000000 -4.000000000000000 -4.300000000000000 5.133e+000 ... ... ... ... 46 -4.333329182771303 -4.333329182771286 -4.333329182771294 -3.492e-009 47 -4.333329182771294 -4.333329182771286 -4.333329182771291 -6.694e-010 48 -4.333329182771291 -4.333329182771286 -4.333329182771289 -3.900e-009 49 -4.333329182771289 -4.333329182771286 -4.333329182771287 2.037e-010 50 -4.333329182771289 -4.333329182771287 -4.333329182771288 0.000e+000 Raggiunta radice in 50 passi>>

in cui epsilon è stato impostato a 1·10-16. Si assumerà come radice  

ξ1=-4.333329182771288.

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 3 di 8 

Radice ξ2. Dal grafico intorno alla se-conda  radice,  si  osserva  la  presenza  di  una distanza tangibile tra la radice ed il nullo del-la  derivata  seconda.  In  questo  caso  quindi sono valide le ipotesi: 

p (a) · p (b) < 0     con p (x ) X C2[a, b] 

p ’’(x ) K0, ∀xX [a, b] 

p ’(ξ) K0 

in cui  l’intervallo  [a,b] è ad esempio a=-0.7, b=-0.5. Dunque è sufficiente determinare un estremo di fourier dal quale iniziare ad itera-

re  con  il  metodo  di  newton  per  avere  la  convergenza.  Ad  esempio  posto  x 0=-0.7, p (x 0)*p ’ ’ (x 0)>0, dunque x 0 è un estremo di Fourier. L’esecuzione dello script newtonzp da luogo al seguente output: 

>> newtonzp(A,0,epsilon,delta) --------------------------------------- n xi p(xi) --------------------------------------- 1 -0.735849056603774 3.955e+004 2 -0.601542910811362 1.599e+004 3 -0.590245920932620 1.148e+003 4 -0.590158659143148 8.732e+000 5 -0.590158653920796 5.225e-004 Raggiunto limite precisione macchina in 5 passi

in cui epsilon=1·10-16, delta=1·1010. L’algoritmo si arresta alla 5 iterazione, quando p (x i ) è ancora dell’ordine di 10-4. Con il metodo di bisezione invece: 

>> bisezpoly(A,a,b,,epsilon) ------------------------------------------------------------------------------ n a b m p(m) ------------------------------------------------------------------------------ 1 -.59999999999999998 .50000000000000000 0.55000000000000004 -3.907e+003 ... ... ... ... 47 -.59015865392079669 -.59015865392079525 -.59015865392079592 1.455e-011 48 -.59015865392079592 -.59015865392079525 -.59015865392079558 -1.455e-011 49 -.59015865392079592 -.59015865392079558 -.59015865392079569 0.000e+000 Raggiunta radice in 49 passi

La precisione della  radice è maggiore,  l’algoritmo sembra  funzionare meglio del metodo di Newton. Ciò probabilmente è dovuto ad errori di arrotondamento eseguiti nel calcolo del rapporto delle funzioni p (x )/p ’(x ) (dell’ordine di 10-4 ). Infatti la differenza tra x i -p (x i )/p ’(x i ) non genera problemi dovuti all’annullamento in quanto x i  è svariati or-dini di grandezza superiore del rapporto. Mentre p ’(x i ) si mantiene elevato ordine di 105, p (x i ) decresce fino a rendere inattendibile il rapporto tra le funzioni. 

ξ2=-0.59015865392079569

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 4 di 8 

Radice ξ3. Per la terza radice è facile individuare le ipotesi per la convergenza del metodo  di Newton,  ed  è  anche  facile  individuare  l’estremo  di  Fourier  x 0,  per  il  quale p (x 0)*p ’ ’ (x 0)>0. Tuttavia  la ripidità della funzione nell’intorno della radice, da  luogo ad un problema malcondizionato: non appena ci discostiamo dalla  radice ξ3, otteniamo un valore  del  polinomio  molto  elevato  in  modulo.  Osserviamo  i  dati  ottenuti  con l’applicazione del metodo con x0=62, epsilon=1·10-16, delta=1·1010: 

newtonzp(A,x0,epsilon,delta) ---------------------------------------- n xi p(xi) ---------------------------------------- 1 61.157300198834456 1.721e+012 2 61.085638246829994 1.254e+011 3 61.085147905914937 8.461e+008 4 61.085147883085845 3.939e+004 5 61.085147883085845 3.466e-005 Raggiunto limite precisione macchina in 5 passi

In soli 5 passi viene  raggiunto  il  limite di precisione macchina sulla x, quando  il polinomio è dell’ordine di 10-5. Forzando  l’algoritmo a continuare, si ottengono tutte ri-ghe analoghe alla quinta. Notevole il guadagno di 9 ordini di grandezza sulla y  in una so-la iterazione, che implica che la funzione è ben linearizzabile intorno alla radice. 

Occorre osservare che né con  il metodo di bisezione, né con altri metodi non è possibile ottenere una precisione maggiore: Infatti osserviamo i dati ottenuti con il meto-do di bisezione: 

>> bisezpoly(A,61,61.1,epsilon) ------------------------------------------------------------------------------- n a b m p(m) ------------------------------------------------------------------------------- 1 61.000000000000000 61.100000000000001 61.049999999999997 -6.044e+010 43 61.085147883085831 61.085147883085853 61.085147883085838 -1.289e-002 44 61.085147883085838 61.085147883085853 61.085147883085845 3.466e-005 45 61.085147883085838 61.085147883085845 61.085147883085838 -1.289e-002 46 61.085147883085838 61.085147883085845 61.085147883085838 -1.289e-002

 

Il metodo giunge alla stessa identica radice del metodo di newton in 44 iterazioni, che tra l’altro è la migliore che si riesce ad ottenere, come visibile dai risultati. 

Alla riga 45 si osserva che la media (a+b)/2, coincide con il valore a, risultato ov-viamente privo di senso matematico. Ciò è dovuto all’errore di rappresentazione dei nu-meri del calcolatore utilizzato. Infatti eseguendo in matlab i comandi: 

>> xi=61.085147883085838; %il valore di a alla riga 44 >> xi+eps(xi) ans = 61.085147883085845

otteniamo che all’iterazione 45  il numero successivo ad a che è possibile rappre-sentare è proprio b: non esistono numeri intermedi per il calcolatore. Ciò arresta di fatto l’algoritmo, e impedisce di ottenere una soluzione più accurata, se non facendo uso di un calcolatore  in grado di eseguire calcoli  in virgola mobile con un numero maggiore di ci-fre. 

ξ3=61.085147883085845 

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 5 di 8 

3. Coefficienti di condizionamento

Perturbando  il termine noto,  il coefficiente di condizionamento che si ottiene ha la forma: 

)('

Δ

ξpa

εε

Cp n

rx

ry ==  

che per le radici trovate assume il valore rispettivamente di  

Cp1 = 5.393094715224958e+009 

Cp2 = 0.39524133495742 

Cp3 = 2.291931500642379e-008 

Intuitivamente si osserva come al variare del termine noto, il polinomio venga tra-slato orizzontalmente, con il conseguente spostamento delle radici. Questo spostamento è tanto maggiore, quanto più  il polinomio  interseca  l’asse delle ascisse orizzontalmente. Ciò si rispecchia nei coefficienti di condizionamento: per la radice 1 a tangenza orizzon-tale  il Cp1 è notevolmente elevato, al contrario per  la  radice 3 data da un’intersezione quasi verticale del polinomio con l’asse delle ascisse, si ha un Cp3 particolarmente basso, come era ragionevole aspettarsi. 

Ciò significa che per la terza radice non è critico il termine noto, anche per varia-zioni piuttosto ampie dello stesso non si hanno consistenti scostamenti della radice. È in-vece critica la determinazione della stessa, per la quale, infatti, su ha un indice di condi-zionamento della radice di circa 3·1018. 

Per la prima radice si ha il discorso inverso, mentre la seconda è in un certo qual modo più “equilibrata”, le difficoltà della determinazione della radice e la sua sensibilità a variazioni del termine noto si equivalgono, e non comportano particolari problemi. 

Perturbando  il  termine di quinto grado, per  il quale k -n -1=4,  i valori dei coeffi-cienti di condizionamento sono dati da: 

)(' ξpaξCp 2

4 ⋅=  

Si ottengono quindi i valori 

Cp1 = -9.629300430614109e+011 

Cp2 = 0.02427769436537 

Cp3 = -0.16158986377900 

Anche in questo caso le radici più sensibili sono quelle in cui il polinomio interseca l’asse delle ascisse con pendenza più bassa, vale a dire ξ1 in primo luogo (a tangenza oriz-zontale) e in misura minore ξ2. In generale le radici multiple, per le quali si annulla anche la derivata prima sono malcondizionate rispetto a perturbazioni dei coefficienti. 

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 6 di 8 

4. Codice degli algoritmi

Poly.dat 27 -1296 -20025 -92663 -146320 -35555 -53742 -39546

function A1=deriva(A) % % A1=deriva(A) % %Se A è una matrice dei coefficienti di un polinomio, la funzione %restituisce la matrice A1 dei coefficienti della derivata del polinomio % n=length(A)-1; %è il grado del polinomio (il -1 serve per la presenza del termine noto) for i=1:n

A1(i)=A(i)*(n+1-i); end;

 function Y=polycalc(A,X) % % Y=polycalc(A,X) % %Funzione per il calcolo del valore assunto da un polinomio in un punto %(o vettore di punti X). A è la matrice dei coefficienti del polinomio % n=length(A); Y=X*0; %Inizializzazione di Y for i=1:n

Y=Y+A(i)*(X.^(n-i)); end;

 

 function m=bisezpoly(A,a,b,epsilon) % % m=bisezpoly(A,a,b,epsilon) % %Calcolo gli zeri di un polinomio tramite il metodo di Bisezione. A è la %matrice dei coefficienti del polinomio, a e b sono gli estremi %dell'intervallo al quale è applicato il metodo, epsilon è la precisione %che si vuole ottenere sulla determinazione della radice m % %Visualizzazione dei passaggi s='---------------------------------------------------------------' ; disp(s) fprintf(' n\t\t\t a\t\t\t\t\t b\t\t\t\t\t m\t\t\t\t p(m)\n') disp(s) n=1; %inizializzazione N=ceil((log(b-a)-log(epsilon))/log(2)); %numero di iterazioni richieste fa=polycalc(A,a); fb=polycalc(A,b);

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 7 di 8 

if sign(fa)==sign(fb) %verifica intervallo

fprintf('L''intervallo non è valido!' ) else

while n<N %avanzamento algoritmo m=(a+b)/2; fm=polycalc(A,m); fa=polycalc(A,a); %visualizzazione output fprintf('%3d\t %17.17f\t %17.17f\t %17.17f\t %8.3e\n',n,a,b,m,fm) if fm==0

fprintf('\nRaggiunta radice in %3d passi',n) n=N;

elseif sign(fa)==sign(fm) a=m;

elseif sign(fa)~=sign(fm) b=m; end; n=n+1;

end end;

 

 function xi=newtonzp(A,x0,epsilon,delta) % % xi=newtonzp(A,x0,epsilon,delta) % %Calcolo gli zeri di un polinomio tramite il metodo di Newton. A è la %matrice dei coefficienti di un polinomio, x0 è il punto iniziale dal quale %far partire l'algoritmo, xi è la radice alla quale è giunto il metodo, %epsilon e delta sono le precisioni che si vuole raggiungere, %rispettivamente sulla x e sulla f(x) %Inizializzazione A1=deriva(A); xi=x0; x=xi; %Visualizzazione dei passaggi s='---------------------------------------'; disp(s) fprintf(' n\t\t\t xi\t\t\t\t\t p(xi)\n') disp(s)

Calcolo numerico Condizionamento degli zeri di un polinomio

Roberto Patrizi, 09114657 pag 8 di 8 

%parte centrale dell'algoritmo: for n=1:100 %100=numero massimo di iterazioni

p=polycalc(A,x); p1=polycalc(A1,x); r=p/p1; %controllo sul rapporto delle funzioni if abs(r) < eps

fprintf('\nRaggiunto limite precisione macchina in %d passi',n) return

end %calcolo radice successiva xi=x-(p/p1); fprintf('%2d\t %17.15f\t\t %8.3e\n' ,n,xi,p) %controllo precisione %if (abs(xi-x)<epsilon)|(abs(p)<delta) if (abs(p)<delta)

fprintf('\nRaggiunta precisione richiestain %d passi',n) break ;

end x=xi;

end;  

top related