Download - Condizionamento degli zeri di un polinomio
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;