Professional Documents
Culture Documents
1. Approccio al problema
Il condizionamento degli zeri (ξ) al variare dei coefficienti a del polinomio è defini-
to come:
Δ ε ryξ k − n −1 ⋅ a n
Cp = = ,
ε rx p' (ξ )
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 10 ). Per la
12
stessa radice, nel grafico logaritmico, si osserva una variazione di segno in cui il modulo
della funzione è superiore ai 10 anche se il passo della y è di sole 0,2 unità; Il picco ver-
-12
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.
>>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
ξ1=-4.333329182771288.
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:
2
p (a) · p (b) < 0 con p (x ) X C [a, b]
p ’’(x ) K0, ∀x X [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
>> 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
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 ). Infatti la differenza tra
-4
p (x i ) decresce fino a rendere inattendibile il rapporto tra le funzioni.
ξ2=-0.59015865392079569
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
-16 10
l’applicazione del metodo con x0=62, epsilon=1·10 , delta=1·10 :
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
In soli 5 passi viene raggiunto il limite di precisione macchina sulla x, quando il
-5
polinomio è dell’ordine di 10 . 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:
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
3. Coefficienti di condizionamento
Perturbando il termine noto, il coefficiente di condizionamento che si ottiene ha
la forma:
Δ ε ry an
Cp = =
ε rx p' (ξ )
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-
18
zionamento della radice di circa 3·10 .
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:
ξ 4 ⋅ a2
Cp =
p' (ξ )
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.
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);
%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)