Cristiano Teodoro LA RISOLUZIONE DI EQUAZIONI ALGEBRICHE

annuncio pubblicitario
Cristiano Teodoro
[email protected]
LA RISOLUZIONE DI EQUAZIONI ALGEBRICHE DI GRADO ELEVATO
con l’algoritmo del Quoziente - Differenza e l’algoritmo di Bairstow
Sommario: nel presente articolo vengono illustrati e considerati due metodi per il calcolo delle radici di una
equazione polinomiale algebrica a coefficienti reali di grado superiore al 4°. I due algoritmi presi in esame sono,
il primo noto come algoritmo del Quoziente-Differenza(Q-D), il secondo noto come algoritmo di Bairstow. Tutti e
due i metodi implicano operazioni di tipo iterativo tramite le quali si possono far convergere i calcoli a dei
risultati che presentano valori numerici molto vicini od uguali alle effettive radici dell’equazione algebrica
considerata.
L’algoritmo Q-D risulta interessante perché è uno dei pochi metodi numerici che non necessita di parametri
iniziali legati in qualche maniera alle radici dell’equazione stessa, a differenza del metodo di Bairstow per il
quale occorre iniziare le operazioni di iterazione con opportuni parametri affinché i calcoli portino a dei valori
uguali o prossimi a quelli effettivi della radici anziché a risultati di overflow.
Nell’articolo. dopo aver accennato alla utilizzazione della risoluzione delle equazioni algebriche nel campo della
tecnica, vengono descritti i due algoritmi e si mettono in evidenza pregi, difetti e limitazioni inerenti ciascuno di
essi. Da quanto esposto si evince che risulta preferibile il metodo di Bairstow, con la dotazione però di opportuni
accorgimenti realizzati nel programma in Qbasic e mostrato nell’Allegato 2. Tale algoritmo risulta valido per tutte
le equazioni algebriche che sono state provate e sottoposte a verifica.
Può anche essere interessante in diversi casi di risoluzione di equazioni sfruttare i risultati trovati con l’algoritmo
Q-D per accelerare le operazioni di calcolo da eseguire con l’algoritmo di Bairstow.
Per avere dei risultati concreti l’articolo presenta due programmi in linguaggio Qbasic, uno relativo all’algoritmo
Q-D, il cui listato è riportato nell’Allegato1, l’altro a quello di Bairstow. riportato nell’Allegato 2. In essi per i
calcoli ci si limita ad utilizzare la doppia precisione messa a disposizione dal software in Qbasic. E’ necessario
pertanto fare attenzione ai risultati ottenuti per evitare il pericolo di andare in overflow o di avere addirittura
errori di calcolo, quando i coefficienti dell’equazione sono o numeri interi molto grandi o numeri decimali
composti da molte cifre .
Nel programma relativo all’algoritmo di Bairstow si è introdotta una ricerca esaustiva ed automatica dei due
parametri “r” ed “s” riguardanti ciascun fattore quadratico di cui è composta l’equazione superando inoltre la
difficoltà di eventuali possibili trabocchi di calcolo .
Oltre ad aver verificato l’efficienza dei due programmi tramite la risoluzione di diverse equazioni di cui si
conoscevano a priori gli effettivi valori delle loro radici, nel listato del programma relativo all’algoritmo di
Bairstow sono stati inseriti esempi di equazione di grado diverso (dal 3° al 25° grado)
Tale programma presenta quindi due opzioni, una relativa al calcolo delle radici di una equazione introducendo
dall’esterno con l’istruzione INPUT il suo grado e i suoi coefficienti, l’altra riguardante la risoluzione della
equazione scelta fra gli esempi proposti che compaiono nel listato.
Nel mostrare alcuni esempi di risoluzione di equazioni si fa ricorso all’algoritmo di Horner riportato in Allegato
3 tramite il quale si può effettuare una verifica nei riguardi dei i valori numerici trovati al fine di accettarli o no
come valori uguali o molto prossimi alle effettive radici dell’equazione, tenendo però presente che si possono
avere risultati non soddisfacenti dovuti alle limitazioni di precisione od addirittura agli errori di calcolo dovuti al
tipo disponibile di aritmetica utilizzata. Si presentano infine alcuni esempi relativi alla risoluzione di equazioni
algebriche facendo presente che con il programma in Allegato 2 relativo all’algoritmo di Bairstow si riescono a
risolvere con soddisfacente precisione equazioni algebriche di grado anche elevato come mostrato negli esempi.
Abstract: in this paper we propose two methods for the solution of an algebraic polynomial equation with real
coefficients and degree higher of the fourth. The envisaged methods are the Quotient – Difference and the Bairstow
algorithms. The both algorithms involve iterative operations, by which the computation converge toward
numerical values that will give improving estimates of the equation roots.
The Q-D algorithm is interesting because it doesn’t need to supply any appropriate parameter for the iterative
starting operations, differently from the Bairstow algorithm which wants some parameters for working out with
success the course of the iterative arithmetical operations to avoid an overflow output.
In the paper we hint some employment of the algebraic equations in the technical field; then we give a description
of the two algorithms and we highlight their advantage , restrictions and failings and we infer that it is preferable
www.matematicamente.it
1
the Bairstow algorithm, provided with the suitable some trick, as we have implemented in the Qbasic language
program, displayed in Allegato 2 .
This algorithm is proved efficient for all equations which we have tested. It is interesting also for some equations to
utilize the results (outputs) founded by Q-D algorithm in order to quicken the computation pertinent to the
Bairstow algorithm.
Then we present two programs in Qbasic language: the former is pertinent to QD algorithm and is showed in
Allegato1, the latter in Allegato 2 regards the Bairstow algorithm. The computation for both is implemented in
double - precision arithmetic, available in the Qbasic software.
If the equation coefficients are large integer or large floating–point numbers, with this type of arithmetic we must
take care to avoid possible overflow or wrong results.
We have inserted in the Bairstow algorithm program the performances for an exhaustive and automatic pursuit
concerning the two parameters, “r” and “s” of every quadratic factor regarding the equation at issue and for
avoiding the overflow output.
We check the efficiency of two programs by resolution of several equations with already their true roots and we
insert in the Bairstow algorithm program several examples of equations of different degree (3° ÷ 25°). This
program has two choices, the one related to the zeros computation of the equation by INPUT statement, the other
pertinent to the resolution of an equation sorted out from several proposed examples inserted in the program list
Then we outline the control of the founded zeros (roots) by Horner algorithm realized by the program in Allegato 3
for the aim to consider them as same or near real zeros of the equation, but considering that also the used double–
precision arithmetic shows wrong computation results for arithmetical operations carried out with large floating–
point numbers having fixed word length.
Finally we show some examples of solved algebraic equations, as well as of high degree .
1 - INTRODUZIONE
1.1 – Generalità sulle equazioni algebriche
Nella letteratura tecnica e precisamente nel campo dell’analisi numerica esistono vari algoritmi dedicati alla
risoluzione con metodi iterativi delle equazioni algebriche di grado superiore al quarto. E’ noto infatti che per le
equazioni di forma generale di grado superiore al quarto si ha l’impossibilità di risolverle per radicali (Teorema di
Ruffini – Abel) [0].
In effetti per alcuni tipi particolari di equazioni algebriche, anche di grado superiore al 4°, si possono ricavare
attraverso opportuni accorgimenti e formule le relative radici, come per l’equazione binomia x n - a = 0, o come per
le equazioni reciproche che si possono ridurre dal grado 2n al grado n, per cui ad esempio un’equazione di 6° grado
può ricondursi alla risoluzione di una di 3° grado.
Le equazioni di 2°, 3° e 4° grado possono poi essere risolte con formule implicanti radicali: si vedano ad esempio
i testi scolastici per la risoluzione delle equazioni di primo e secondo grado e testi o articoli più specializzati per
quelle di terzo e quarto grado per le quali si può fare riferimento ad una vasta bibliografia [1], [2], [3] [4],[5].
Questa nota è pertanto dedicata al calcolo delle radici di una equazione algebrica a coefficienti reali di forma
generale e di grado superiore al quarto, affrontando il problema di trovare i valori numerici delle sue radici reali o
complesse con una approssimazione sufficientemente elevata, vale a dire con un errore fra l’effettivo valore della
radice ed il valore trovato per la maggior parte delle volte inferiore in valore assoluto a 10 −8 :
Si vuole far notare che con gli algoritmi proposti nel presente articolo si possono facilmente risolvere anche le
equazioni di 3° e 4° quarto grado, con una precisione sul valore delle radici non certo inferiore a quella ottenuta con
le classiche soluzioni analitiche per radicali.
E’ noto che una equazione algebrica di grado n a coefficienti reali ha n radici che possono essere di valore reale od
essere formate da coppie di valori complessi e coniugati, intendendo per coppia di radici complesse coniugate due
radici una del tipo α + i β e l’altra del tipo α - i β dove α e β sono numeri razionali e i = − 1
Nell’impiego dei diversi metodi iterativi, come ad esempio il metodo di Bairstow od altri ancora, risulta auspicabile
partire con opportuni valori dei parametri implicati nelle iterazioni allo scopo di poter convergere attraverso un
limitato numero di iterazioni verso gli effettivi valori delle radici.
In questi metodi la scelta ottimale dei suddetti parametri tuttavia dipende in qualche modo dall’effettivo valore
delle radici dell’equazione. Pertanto il maggior inconveniente di questi algoritmi sta proprio nel fatto che non
conoscendo evidentemente a priori il valore delle radici non si possono conoscere e quindi scegliere i valori più
convenienti dei suddetti parametri al fine di poter far convergere i risultati con un numero piccolo di iterazioni
www.matematicamente.it
2
verso i valori più o meno approssimati delle radici. Si parte allora di solito da valori convenzionali che possono
portare in diversi casi addirittura ad una divergenza dei risultati con la conseguenza di avere un overflow nei
calcoli. Si potrebbe quindi procedere per tentativi fino a trovare dei valori iniziali fortunati per i parametri di
partenza tramite i quali, attraverso le opportune iterazioni proprie dell’algoritmo, si riesce a convergere verso gli
effettivi valori delle radici. Può essere interessante allora utilizzare un algoritmo che non richiede a priori la
conoscenza dei valori approssimati delle radici.
Un efficace algoritmo che possiede questa caratteristica è quello conosciuto nella letteratura tecnica come il metodo
del Quoziente – Differenza ( QD method ) [ 6 ], [ 7 ], [8].
Poiché tuttavia questo metodo, anch’esso di tipo iterativo, presenta una convergenza lenta verso gli effettivi valori
delle radici, potrebbe risultare opportuno, una volta trovati i valori anche se non molto approssimati delle radici,
proseguire nelle ricerca con l’algoritmo di Bairstow, tramite il quale si può arrivare generalmente ad una migliore
approssimazione di tali valori.
Risulta conveniente così in diversi casi utilizzare la combinazione dei i due algoritmi, l’algoritmo Q-D a cui far
seguire l’algoritmo di Bairstow.
Qui di seguito ci limiteremo ad illustrare le relazioni e le formule iterative esistenti fra gli opportuni parametri che
vengono impiegati nei due algoritmi, senza entrare nel merito delle giustificazioni teoriche relative ai due algoritmi,
per i quali esiste una idonea letteratura [ 6 ] , [7 ], [ 8 ] [ 9 ] , [10 ].
1.2 – Cenni sull’ utilizzo delle equazioni algebriche nella tecnica
Prima di passare alla descrizione dei due algoritmi, si vuole accennare all’importanza che assume la risoluzione
delle equazioni algebriche con coefficienti reali, non solo nel campo prettamente matematico dell’analisi numerica,
ma anche in svariati campi della tecnica. In effetti nella descrizione di molti fenomeni fisici, e quindi nello sviluppo
di modelli matematici che li riguardano, trova ampia applicazione una particolare classe di equazioni differenziali,
precisamente quella delle equazioni differenziali lineari a coefficienti costanti. E’ noto che per risolvere un tale tipo
di equazione si può utilizzare la sua associata equazione caratteristica che risulta essere una equazione algebrica di
opportuno grado a coefficienti reali costanti. E’ pure altrettanto noto che nel campo della tecniche circuitali
elettriche, invece di descrivere un sistema fisico con un modello matematico che si evolve nel tempo e quindi come
forma differenziale nella variabile temporale t, lo si può studiare come forma algebrica nella variabile di tipo
complesso convenzionalmente denominata con il simbolo s = σ + i w, utilizzando la trasformata di Laplace,
n +1
risolvendo così al posto di equazioni differenziali delle equazioni algebriche del tipo
∑ a (k ) ⋅ s
( n +1) − k
= 0
k =1
dove a(k) sono costanti reali ed s è la variabile che nell’ambito della trasformata di Laplace prende il posto della x .
Nel vasto campo poi dei Servomeccanismi, o più in generale in quello dei Sistemi di controllo lineare, la funzione
di trasferimento F(s), quale rapporto tra la trasformata della segnale in uscita di un Sistema e la trasformata del
segnale d’ingresso al Sistema stesso, sia esso controreazionato o meno, è costituita dal rapporto fra due polinomi
algebrici
N (s)
. E’ noto ad esempio che per lo studio della stabilità di un Sistema a controreazione occorre
D( s)
conoscere dove sono dislocate nel piano complesso s le radici del polinomio D(s) , che prendono il nome di poli di
F(s).
E’ pertanto opportuno se non indispensabile risolvere l’equazione algebrica D(s) = 0 che può essere anche di grado
superiore al 4°.
2 - ALGORITMO QUOZIENTE- DIFFERENZA (Q – D)
Sia da risolvere la seguente equazione algebrica di grado n:
a(1) ⋅ x n + a(2) x n −1 + a (3) ⋅ x n − 2 +…………………a(n-2) ⋅ x 3 + a(n-1) ⋅ x 2 + a(n) ⋅ x +a(n+1) = 0
dove i coefficienti a(k) con l’indice k =1,2,3,……… n +1 sono numeri reali
Si prendano in considerazione due matrici bidimensionali:
una, che chiameremo Matrice Q, è formata da elementi relativi ad un parametro che indicheremo q( h, k) con h
=1,2,3 ….. it ; k =1, 2, 3,……n
l’altra, che chiameremo Matrice D, è costituita da elementi relativi ad un parametro indicato con d( h, j) con h
=1,2,3,…it ; j = 0,1,2,3,……n
dove n = grado dell’equazione e it = numero di iterazioni richieste
www.matematicamente.it
3
Utilizzando i coefficienti a(k) dell’equazione si costruisca la riga iniziale della matrice Q con i seguenti n valori
q(1, k):
q(1,1) = -a(2)/a(1),
q(1,2 ) = q(1,3) = q(1,4) =………q(1, n-1) = q(1, n) = 0
(1)
e la riga iniziale della matrice D con i seguenti n + 1 valori d(1, j) :
d(1,0) = 0,
d(1,1) =
a(3)
,
a(2)
d(1,2) =
a(4)
a(n + 1)
….. ….d(1,n-1) =
,
a(3)
a ( n)
d(1,n) =0
(2)
le due matrici risultano intimamente connesse fra di loro in quanto per le successive righe fra gli elementi q(h, k )
e d(h , j ) sussistono le due seguenti relazioni di tipo iterativo una per il calcolo del valore di q(h, k):
q( h, k) = d(h-1, k) – d(h-1, k-1) + q(h-1, k)
(1a)
con h variabile da 2 a it e k variabile da 1 a n
l’altra relativa al calcolo del valore d( h, j) :
d(h, j) = d( h-1, j ) · q(h, j + 1 ) / q(h, j )
(2a)
con h variabile da 2 a it e j variabile ora da 1 a n
Dall’esame delle due formule (1a) e (2a) si deve considerare quanto segue:
una volta noti con la (1) i valori degli elementi relativi alla prima riga della matrice Q e con (2) i valori degli
elementi relativi alla prima riga della matrice D, si possono calcolare con la (1a) gli elementi relativi alla seconda
riga della matrice Q; per calcolare però con la (2a) gli elementi relativi alla seconda riga della matrice D risulta
necessario avere disponibili tutti i valori q(h,k) della seconda riga della matrice Q; utilizzando poi sempre le
relazioni (1a) e (2a), si possono ricavare gli elementi delle successive righe delle due matrici calcolando comunque
sempre tutti gli elementi della h-esima riga relativa alla matrice Q prima di passare al calcolo degli elementi relativi
alla h-esima riga della matrice D.
Effettuando poi un opportuno numero it di iterazioni si riescono a trovare tutte insieme simultaneamente le n
radici dell’equazioni con valori tanto più approssimati ai loro valori effettivi quanto maggiore è il numero it delle
iterazioni effettuate Per trovare tali valori si tenga conto di quanto esposto qui di seguito.
Per il calcolo delle radici x (k) si prendono in considerazione dopo un congruo numero di iterazioni i valori
ottenuti per q(h,k) nell’ultima iterazione it ed in quella precedente e vale quanto segue:
- 1R: si ha una radice di tipo reale ed il suo valore risulta essere x(k ) = q(it , k) se si constata che
nella colonna k presa in considerazione, il valore q(it , k) risulta essere costituito da numeri
sempre o tutti negativi o tutti positivi per un opportuno insieme di valori q( h, k) precedenti q(it, k),
vale a dire se non si sono avuti cambiamenti di segno nei valori di q(h, k) rilevati in un opportuno
numero di valori numerici precedenti l’ultima iterazione; inoltre le varie differenze relative a
q(h, k) – q(h-1,k) risultano normalmente in valore assoluto sempre più piccole.
- 1C: si ha una coppia di radici di tipo complesso e coniugato se si constata che nella colonna k presa
in considerazione, per un opportuno numero di valori q( h, k) precedenti il valore q(it , k), essi
risultano di segno variabile, vale a dire vi sono sia numeri positivi che negativi nei valori q(h, k)
rilevati in un opportuno numero di valori precedenti l’ultima iterazione; inoltre la varie differenze
q(h, k) – q(h-1,k) possono presentare valori molto diversi fra loro e non tendono a diventare
sempre più piccoli.
Per conoscere poi quali sono i valori numerici di questa coppia di radici complesse si procede prendendo in
2
considerazione il fattore quadratico x − r ⋅ x − s con i valori di r e di s ricavati dalle seguenti relazioni
r = q(it,k) + q(it,k+1)
(3)
s = – q(it-1,k) · q(it,k+1)
(4)
Uguagliando a zero tale fattore quadratico si calcolano quindi le sue due radici con le note formule dell’equazione
di secondo grado:
− r ±
r2 − 4⋅s
x =
2
Per comprendere meglio quanto esposto facciamo un esempio.
Si vuole risolvere la seguente equazione algebrica di 5° grado:
x 5 + 37 x 4 − 25 x 3 + 44985 x 2 + 528984 x − 15852382 = 0
www.matematicamente.it
4
(5)
Per risolvere questa equazione o più in generale una qualsiasi equazione algebrica si è approntato un programma in
linguaggio Qbasic dedicato allo sviluppo del presente algoritmo.
Il listato del programma è riportato nell’ALLEGATO 1
Sviluppando l’algoritmo, partendo dalle relazioni le (1) e (2) e impiegando quindi le formule iterative (1a) e (2a ),
si riportano qui di seguito le ultime 16 righe relative alla matrice Q degli elementi trovati del parametro q(h,k)
avendo impostato e sviluppato i calcoli relativi a 100 iterazioni (it=100):
q( h , 1 )
q( h , 2 )
q( 85, 1) = -49.00001
q (86, 1 )= -49.00001
q( 87 , 1 ) =-49.00001
q( 88 , 1 ) =-49.00001
q( 89 , 1 ) =-49.00001
q( 90 , 1 )=-49.00001
q( 91 , 1 ) =-49.00001
q( 92 , 1 ) =-49.00001
q( 93 , 1 ) =-49.00001
q( 94 , 1 ) =-49.00001
q( 95 , 1 ) =-49.00001
q( 96 , 1 ) =-49.00001
q( 97 , 1 ) =-49.00001
q( 98 , 1 ) =-49.00001
q( 99 , 1 ) =-49.00001
q( 100 , 1 ) =-49.00001
q (85, 2 )= 15.58538
q (86, 2 )=-47.42403
q( 87 , 2 )= 44.81543
q( 88 , 2 )=-2.14347
q( 89 , 2 )= 526.79016
q( 90 , 2 )= 19.94605
q( 91 , 2 )=-32.24633
q( 92 , 2 )= 55.55421
q( 93 , 2 )= 2.52352
q( 94 , 2 )=-406.76476
q( 95 , 2 )= 24.66001
q( 96 , 2 )=-21.8767
q( 97 , 2 )= 71.459010
q( 98 , 2 )= 6.85845
q( 99 , 2 )=-135.76151
q( 100 , 2 )= 29.96985
q(h , 3 )
q (85 , 3 ) = 6.41461
q(86, 3) = 69.42402
q( 87 , 3 )=-22.81544
q( 88 , 3 )= 24.14346
q( 89 , 3 )=-504.79017
q( 90 , 3 )= 2.05394
q( 91 , 3 )= 54.24632
q( 92 , 3 )=-33.55422
q( 93 , 3 )= 19.47647
q( 94 , 3 )= 428.76475
q( 95 , 3 )=-2.66002
q( 96 , 3 )= 43.87669
q( 97 , 3 )=-49.45902
q( 98 , 3 )= 15.14154
q( 99 , 3 )= 157.7615
q( 100 , 3 )=-7.96986
q(h , 4)
q ( 85 , 4 )=-23.00001
q( 86 , 4 ) =-23
q( 87 , 4 )=-23
q( 88 , 4 )=-23.00001
q( 89 , 4 )=-23
q( 90 , 4 )=-23
q( 91 , 4 )=-23.00001
q( 92 , 4 )=-23
q( 93 , 4 )=-23
q( 94 , 4 )=-23
q( 95 , 4 )=-23
q( 96 , 4 )=-23
q( 97 , 4 )=-23
q( 98 , 4 )=-23
q( 99 , 4 )=-23
q( 100 , 4 )=-23
q(h ,5 )
q( 85 , 5 )= 12.99999
q(86 , 5 ) = 12.99999
q( 87 , 5 )= 12.99999
q( 88 , 5 )= 12.99999
q( 89 , 5 )= 12.99999
q( 90 , 5 )= 12.99999
q( 91 , 5 )= 12.99999
q( 92 , 5 )= 12.99999
q( 93 , 5 )= 12.99999
q( 94 , 5 )= 12.99999
q( 95 , 5 )= 12.99999
q( 96 , 5 )= 12.99999
q( 97 , 5 )= 12.99999
q( 98 , 5 )= 12.99999
q( 99 , 5 )= 12.99999
q( 100 , 5 )= 12.99999
Dall’osservazione delle 5 colonne degli elementi q(k , h) si può rilevare quanto segue:
- gli elementi q( h, 1 ) della prima colonna risultano essere tutti dello stesso segno ed in questo caso particolare
tutti uguali e pari al valore – 49.00001; pertanto si deduce che si ha una radice reale di valore x1 = q( 100, 1 ) =
= – 49.00001
- gli elementi della seconda colonna, vale i valori q(h , 2) si susseguono con valori sia positivi che negativi e sono
anche abbastanza diversi .fra loro; lo stesso discorso vale per gli elementi q(h, 3 ) relativi alla terza colonna.
Pertanto da questi elementi q(h, 2) e q(h, 3 ) si possono ricavare le due radici complesse e coniugate prendendo in
considerazione gli elementi delle due ultime righe, e precisamente q( 99, 2), q(100, 2) e q(100, 3) . Da questi tre
valori si ricavano i valori del fattore quadratico del tipo x 2 − r ⋅ x − s da cui si estraggono con le ben note formule
per l’equazione di 2°grado le due radici complesse e coniugate.
Tenendo conto delle formule (3) e(4), in questo specifico caso si ricavano i seguenti valori per r ed s:
r = q(100,2) + q(100,3) = 29.96985 + (–7.96986 ) = 21.99999
s = – (q(99,2) · q(100,3) = – (–135.76151) · (–7.96986 ) = –1082.000228
si ottiene così il seguente fattore quadratico: x^2 – 21.99999 +1082.00028
da cui si ricavano le due radici complesse e coniugate :
x2 =
21.99999 − 21.99999 2 − 4 ⋅ 1082.00028
= 10.999995 − i31.00000629
2
x3 =
21.99999 + 21.99999 2 − 4 ⋅ 1082.00028
= 10.999995 + i31.00000629
2
Esaminando infine la quarta e quinta colonna si osserva facilmente che si hanno in corrispondenza le due seguenti
radici reali :
x 4 = q( 100 , 4 ) = − 23
x5 = q( 100 , 5 ) = 12.99999
Se avessimo effettuato i calcoli in aritmetica a doppia precisione avremmo trovato i seguenti risultati per le cinque
radici:
x1 = – 49.00000000000027
x 2 = 10.99999999999994 + i 31.00000000000117
x3 = 10.99999999999994 – i 31. 00000000000117
x4 = – 22,99999999999993
x5 = 12.99999999999993
molto più vicini agli effettivi valori delle radici dell’ equazione (5) che sono i seguenti:
www.matematicamente.it
5
x 1 e = – 49 ;
x 2e
= 11 + i 31;
x 3e
= 11 – i 31 ;
x 4 e = –23 ;
x5e = 13
Si osservi che per questa equazione la differenza tra il valore effettivo e quello trovato per ognuna delle cinque 5
radici ( vale a dire l’errore commesso utilizzando l’algoritmo in questione) risulta in valore assoluto molto piccola e
precisamente
per x 1 e
| x 1 e – x1 | < 2.71 ⋅ 10 −13
x 2e
| x 2 e – x 2 | < 6.1 * 10 −14 per la parte reale e < 1.2 * 10 −12 per quella immaginaria
x 3e
per x 4 e
| x3e – x3 | < 6.1 * 10 −14 per la parte reale e <1.2 * 10 −12 per quella immaginaria
| x 4 e – x4 | < 7.1 ⋅ 10 −14
per x5e
| x 5 e – x5 | < 7 ⋅ 10 −14
per
per
2.1 - Pregi, difetti e limitazioni dell’algoritmo Q - D
Per questo algoritmo si elencano qui di seguito i pregi ed anche i diversi difetti e le limitazioni.
Pregi:
1) le radici vengono trovate simultaneamente tutte insieme e a differenza di quanto viene fatto nell’algoritmo di
Bairstow o in altri algoritmi non necessita di una preventiva conoscenza di parametri particolari;
2) se l’equazione algebrica presenta tutti i gradi dell’incognita e non ha radici reali effettive di valore opposto
l’algoritmo, tranne in casi di particolari equazioni, converge verso tutti i valori delle effettive radici anche se i
valori trovati possono risultare meno approssimati di quelli ottenibili con altri metodi iterativi a parità di
numero di iterazioni;
Difetti e limitazioni :
1) se l’equazione algebrica non è formata da tutti i gradi della x o presenta coefficienti consecutivi di ugual
valore l’algoritmo non risulta applicabile
2) se nell’effettuazione dei calcoli dovesse risultare un valore di q(h, k) = 0 non si potrebbe più procedere come
risulta evidente osservando la relazione (2a) sopra riportata
3) per diversi tipi di equazioni non tutti i valori trovati per le radici risultano approssimati ai valori esatti delle
radici; inoltre per altri tipi di equazione risulta molto difficile discriminare alcune radici complesse dalle
reali pur tenendo conto di quanto esposto nei punti 1R e 1C.
4) se l’equazione ha radici effettive di valore opposto o quasi i valori ottenibili per questo tipo di radici
risultano essere non bene approssimati ai veri valori delle radici o addirittura errati.
5) per trovare valori sufficientemente prossimi a quelli effettivamente posseduti dalle radici può essere
necessario un numero grande di iterazioni (nell’esempio illustrato sopra le iterazioni sono state 100)
6) se l’equazione presenta radici doppie o in generale radici multiple anche per questo tipo di radici non
si hanno delle buone approssimazioni, difetto questo comune anche ad altri algoritmi di tipo iterativo.
Ai difetti o limitazioni di cui ai punti 1) e 2) si può porre rimedio operando come segue.
A)
Data l’equazione algebrica f(x )=0 non avente tutti i gradi della x posto e y = x – c con c numero intero
positivo o negativo, si fa uso dell’operazione della divisione sintetica ripetuta per trovare i coefficienti della
equazione f(y) = 0 nella nuova incognita y. Se questa nuova equazione f(y) = 0 presenta per la incognita y
tutti i gradi si procede con l’algoritmo Q – D a trovare i valori approssimati delle sue radici.
Se f(y)=0 non presenta ancora tutti i gradi si prende in considerazione un altro valore di c fino a che non si
riesce ad avere un adeguato valore di c. Per passare quindi ai valori approssimati delle radici della f(x) =0
essendo x = y + c si hanno le seguenti relazioni :
ad ogni radice reale y r di f(y) = 0 corrisponde una radice reale x r = y r + c di f(x);
ad ogni coppia di radici y re ± i y im complesse e coniugate di f(y) corrisponde una coppia di radici
complesse e coniugate x re ± i xim = ( y re +c) ± i y im di f(x)
Per la situazione in cui si ha un elemento q(h,k) = 0 si procede come sopra.
www.matematicamente.it
6
B)
I difetti riportati ai punti 3) e 4) risultano abbastanza critici anche se riguardano solo particolari tipi di
equazioni algebriche che hanno peculiari coefficienti o particolari radici. Ci si può accorgere in molti casi se si
tratta dei suddetti tipi di equazione dai risultati ottenuti. In effetti detto xi il generico valore trovato relativo
ad una radice dell’equazione f(x ) = 0 si può calcolare il valore che il polinomio f(x) assume in corrispondenza
a tale valore, cioè si calcola f( xi ) utilizzando ad esempio l’efficiente algoritmo di Horner. Se il valore f( xi )
così trovato risulta essere molto diverso dal valore nullo, ciò potrebbe significare che xi non è un valore
attendibile per essere una effettiva radice dell’equazione.
Il difetto di cui al punto5) non risulta critico in quanto con la rapidità dei tempi di calcolo degli odierni PC
anche con 200 iterazioni i tempi per ottenere tutti i valori approssimati delle radici sono praticamente di qualche
frazione di secondo.
Per il difetto del punto 6) come succede in relazione anche per altri metodi di tipo iterativo non risulta esserci
nessun rimedio
2.2 Esempio di risoluzione
Prima di passare all’algoritmo di BAIRSTOW si mostra quest’altro esempio di risoluzione con l’algoritmo Q-D.
Esempio : si voglia risolvere la seguente equazione f(x) = 0 di 8° grado:
x 8 - 51 x 7 - 3603 x 6 + 322395 x 5 - 7591423 x 4 + 3827411 x 3 + 2569178243 x 2 - 40948983035 x + 215287250062 = 0
le cui radici esatte hanno i seguenti valori (1) :
x 2 = 43 x3 = 31 x 4 = -19 x5 = 13 – i 8 x6 = 13 + i 8 x7 = 22 – i 3 x8 = 22 + i 3
x 1 = - 74
Effettuando i calcoli con l’algoritmo Q-D implicando 200 iterazioni si trovano per le radici i seguenti valori:
x1 = − 73.99999999999997
x 2 = 42.99999999999978
x3 = 31.00000000000311
x4 = − 19.00000000003839
x 5 = 13.00000000000022 + i 8.000000000013809
x6
=
13.00000000000022 − i 8.000000000013809
x7 = 22.00000000001749 + i 3.000000000009029
x8 = 22.00000000001749 − i 3.000000000009029
Dai valori di queste radici si può risalire facilmente ai quattro fattori quadratici x − r ⋅ x − s di cui risulta
composta l’equazione algebrica f(x) =0 suddetta
2
Infatti per quel che riguarda le due coppie di radici complesse coniugate si hanno per r ed s i seguenti valori:
x7 , x8 posti x7 = c + i d e x8 = c - i d
si ha
r(1) = x7 + x8 = 2c = 44.00000000003499
2
2
s(1) = − x7 , x8 = − ( c + d ) = - 493.0000000008239
per la coppia x 5 , x6 posto x 5 = a + i b e x6 = a − i b
si ha r(2) = x 5 + x6 = 2a = 26.00000000000044
per la coppia
s(2) = − x 1 · x 2
= −(a
2
+ b 2 ) = −233.0000000002268
--------------(1) si conoscono i valori esatti delle radici dell’ equazione perché utilizzando un apposito programma sempre in Qbasic (che
qui non si riporta ), l’equazione è stata costruita effettuando il prodotto di binomi e trinomi per i quali si erano scelti i loro
coefficienti.
www.matematicamente.it
7
Riguardo alle radici reali, considerandole a coppie si possono ricavare i relativi valori di r e di s:
per la coppia x 1 , x 2 si ha r(3) = x 1 + x 2 = −31.00000000000019
s(3) = − x 1 · x 2 = 3181.999999999982
per la coppia
x 3 , x4
si ha r(4) = x3 +
x4
=
11.99999999996473
s(4) = − x3 · x4 = 589.0000000012491
Allora l’equazione può essere scritta come segue:
f(x) = ( x 2 - r(1) · x - s(1)) · ( x 2 - r(2) · x - s(2)) · ( x 2 - r(3) · x - s(3)) · ( x 2 - r(4) · x - s(4)) = 0
Si possono tenere presenti i quattro valori di r(k) e di s(k) perché la loro conoscenza ed il loro impiego potrebbe
facilitare la ricerca delle radici di tale equazione quando si utilizza in successione al presente algoritmo l’algoritmo
di Bairstow , che qui di seguito si passa a descrivere .
Si vuol far notare che anche implicando un numero di 200 iterazionI come nell’esempio riportato il tempo calcolo è
risultato trascurabile.
3 - ALGORITMO di BAIRSTOW
Se all’algoritmo sopra illustrato si volesse far seguire nella risoluzione di una equazione algebrica l’algoritmo di
Bairstow si potrebbe arrivare alla determinazione di valori numerici più prossimi all’esatto valore delle radici in
diversi casi con un esiguo numero di iterazioni
L’utilizzo dell’algoritmo QD potrebbe risultare determinante anche in alcuni casi di difficile risoluzione di una
equazione con l’algoritmo di Bairstow.
Non è qui il caso di addentrarci in un esposizione dettagliata di questo algoritmo.
Per chi volesse avere una più estesa documentazione sull’argomento faccia riferimento a [6], [7], [9] [10].
Si da invece qui un breve cenno sulle modalità generali su cui è basato il metodo.
In pratica data l’equazione algebrica f(x) = 0 sul polinomio f(x) viene effettuata per ognuno dei fattori quadratici
del tipo x 2 − r ⋅ x − s che lo compongono una ricerca reiterata dei valori di r e di s mirata a trovare per tali
due parametri dei valori numerici i più prossimi possibile agli effettivi valori che rendono il fattore quadratico un
perfetto divisore del polinomio f(x).
Indicheremo qui di seguito brevemente i passi più salienti dell’algoritmo.
Sia data la seguente equazione algebrica :
a(1) ⋅ x n + a(2) x n−1 + a (3) ⋅ x n− 2 +…………………a(n-2) ⋅ x 3 + a(n-1) ⋅ x 2 + a(n) ⋅ x +a(n+1) = 0
dove i coefficienti a(k) con l’indice k =1,2,3,……… n +1 sono numeri reali,
indicando sinteticamente con A(x) = 0 la suddetta equazione, per il calcolo delle sue radici siano esse coppie di
valori reali o coppie di valori complessi e coniugati si procede come segue:
si prendono in considerazione dei valori di partenza r ed s (valori arbitrari o trovati precedentemente con
l’algoritmo Q - D relativi al fattore quadratico x 2 − r ⋅ x − s ) e s’imposta la seguente uguaglianza:
A(x) = ( x 2 − r ⋅ x − s ) · B(x) + Rb con Rb e B(x) rispettivamente resto e quoziente della divisione del
polinomio A(x) di grado n per il fattore quadratico x 2 − r ⋅ x − s . Il polinomio B(x) è ovviamente un polinomio di
grado n-2.
Utilizzando l’algoritmo della doppia divisione sintetica di A (x) per il fattore quadratico si possono trovare i
coefficienti del polinomio B(x) applicando la seguente formula ricorsiva:
b(k) = a(k) - r · b(k-1)r – s · b(k-2)
per k = 2,3,4 … n-1 e con i valori iniziali b(1) = a(1) e b(2) = a(2) + r · b(1)
Il resto Rb della suddetta divisione risulta opportuno metterlo sotto la seguente forma:
(6)
Rb = b(n) · (x – r) + b(n+1)
con
b(n)
= a(n) + r · b(n-1) + s · b(n-2)
(7)
b(n+1 ) = a(n+1 ) + r · b(n) + s · b(n-1)
www.matematicamente.it
(8)
8
Tutti i coefficienti b(k) con l’indice k =1,2,3,……… n +1 sono numeri reali
Si effettui ora un ulteriore doppia divisione sintetica del polinomio B(x) sempre per lo stesso fattore quadratico e
cioè :
B(x) = ( x 2 − r ⋅ x − s ) · C( x) + Rc ; vale anche qui la seguente formula ricorsiva per il calcolo dei coefficienti
polinomio C(x) :
c(h) = b(h) - r · c(h-1)r – s · c(h -2)
(9)
per h=2,3,4……..n
con i valori iniziali c(1) = b(1) e c(2) = b(2) - r · c(1)
Siano re e s e i valori dei due parametri di s e di r tali per cui il fattore ( x 2 − re ⋅ x − s e ) risulterebbe essere un
divisore perfetto di A(x), tale cioè per cui si avrebbe resto Rb = 0 e quindi: b(n) = 0 e b(n+1)=0.
Posto ∆r = re - r e ∆s = s e - s
Si può dimostrare allora che valgono le seguenti relazioni:
- b(n)
= c(n-1) · ∆r + c(n-2) · ∆s
- b(n+1) = c(n) · ∆r + c(n-1) · ∆s
(10)
(11)
Risolvendo il suddetto sistema nelle due incognite ∆r e ∆s si trova :
∆r =
con
∆ r1
∆s1
e
∆s =
∆ r2
∆s 2
∆r1 = b((n+1) · c(n-2) - b((n) · c(n-1)
∆r2 = c(n-1) · c(n-1) - c(n) · c(n-2)
∆s1 = b((n+1) · c(n-1) - b((n) · c(n)
∆s2 = ∆r2 = c(n-1) · c(n-1) - c(n) · c(n-2)
Per rendere b(n) = 0 e b(n +1) = 0 o per lo meno molto piccoli occorre che ∆r e ∆s siano anch’essi molto
piccoli.
Ciò lo si può ottenere con la seguente sequenza di operazioni :
1) partendo da valori di r e di s abbastanza vicini ai valori re e s e si calcolano i primi valori di ∆r e di ∆s con
le formule sopra riportate
2) una volta trovati tali valori si aggiornano i valori di r e di s ponendo r = r + ∆r e s = s + ∆s;
e con questi valori aggiornati si calcolano di nuovo con la formula ricorsiva (6) i valori dei
coefficienti b(k) e con la formula ricorsiva (9) i coefficienti c(h).
3) posti i nuovi valori di b(n), b(n+1) ; c (n-2), cn-1), c(n) nelle formule (10) e (11) si ricalcolano i valori di
∆r e di ∆s.
Ora, se i valori di r e di s di partenza sono scelti sufficientemente prossimi agli effettivi valori re e s e si constata
che questi nuovi valori di ∆r e di ∆s risultano più piccoli dei precedenti.
Continuando ulteriori iterazioni di sequenze di operazioni analoghe a quella sopra illustrata si vengono ad avere
valori ∆r e ∆s sempre più piccoli, tendendo entrambi sostanzialmente a zero: ad esempio dopo un certo numero
di iterazioni si otterranno per essi i seguenti valori
−9
∆r ≤ 10
∆s ≤ 10 −9 .
Ciò comporta che anche i valori dei coefficienti b(n) e b(n+1) risultano molto piccoli come risulta evidente dalle
formule (10) e (11).
Pertanto anche il resto Rb risulterà tanto più trascurabile quanto più piccoli saranno ∆r e ∆s .
Otterremo così praticamente A(x) = ( x 2 − r ⋅ x − s ) · B(x) + Rb ≅ ( x 2 − re ⋅ x − s e ) · B(x)
Dato però che non si conoscono a priori le radici dell’equazione che si vuole risolvere, sono ignoti gli opportuni
valori di r e di s relativi a ciascun fattore quadratico da cui iniziare la ricerca di ciascuna radice. Rimane pertanto
da stabilire quali sono questi valori iniziali.
La difficoltà principale quindi dell’algoritmo di Bairstow è proprio data dal non conoscere a priori da quali
valori iniziali è conveniente partire per r e per s , tali da non portare i calcoli iterativi in overflow, ma di trovare
invece dopo un certo numero, possibilmente piccolo di iterazioni, valori numerici anche se approssimati ai veri
valori delle radici.
www.matematicamente.it
9
Nella letteratura tecnica dedicata a questo algoritmo si suggerisce spesso di prendere come valori iniziali per r ed
s i seguenti valori: r = 0, s = 0, suggerendo altresì di prender altri valori se essi non fossero tali da
portare alla scoperta di valori anche approssimati di una coppia di radici.
Per molte equazioni, specie di grado non elevato e con coefficienti non eccessivamente grandi, partendo con tali
valori iniziali si riescono effettivamente a trovare i valori approssimati delle radici
Per non dover procedere tuttavia ad una scelta casuale e spesso inefficace per i valori iniziali di r e di s si possono
seguire due metodi
a) se si è anteriormente impiegato l’algoritmo Q-D per la risoluzione dell’equazione invece di scegliere a
caso i valori di r e di s risultano disponibili con una sufficiente approssimazione la coppia si valori r ed s
relativa ad ogni fattore quadratico che compone la equazione algebrica; pertanto inserendo questi valori è
possibile ottenere con un numero limitato di iterazioni i valori delle le radici con una approssimazione
anche migliore di quella ottenuta con l’algoritmo Q-D.
Questo metodo non sempre da ottimi risultati in quanto date le diverse limitazioni ed i difetti che presenta
l’algoritmo Q - D non sempre i valori di r ed s ricavati da esso risultano convenienti ed applicabili.
b) si può procedere ad una sistematica ed automatica introduzione ordinata di diversi valori di r e di s
attraverso ad esempio l’esplorazione esaustiva di tutte la coppie per r ed s che si possono avere entro
ben determinati campi di valori per r e per s. In tale ricerca può accadere che molti coppie di valori r
ed s non siano idonee in quanto i valori trovati di ∆r e di ∆s nelle successive iterazioni invece
di diminuire, aumentano progressivamente anche a dismisura, col rischio di portare i calcoli ad una
ad una condizione di trabocco.Pertanto si devono prendere opportuni provvedimenti al fine di evitare
questa evenienza e ontinuare poi la ricerca automatica di altri valori di r e di s, atti a far diventare
sempre più piccoli ad ogni iterazione i valori di ∆r e di ∆s .
3.1 - Esempio di risoluzione
Utilizziamo ora algoritmo di Bairstow per trovare le radici della seguente equazione:
x 8 - 51 x 7 - 3603 x 6 + 322395 x 5 - 7591423 x 4 + 3827411 x 3 + 2569178243 x 2 - 40948983035 x + 215287250062 = 0
che già avevamo preso in esame con l’algoritmo Q-D.
Per risolvere questa equazione utilizziamo il programma in Qbasic riportato nell’ALLEGATO 2
Tale programma è realizzato per operare con il metodo del tipo indicato in b)
Eseguendo il programma si ottengono per le 8 radici i seguenti valori :
x( 1 )= 42.99999999999994
x( 2 )=-74
x( 3 )= 31.00000000000323
x( 4 )=-19.0000000000001
x( 5 )= 22.00000000000239 + i 3.000000000016186
x( 6 ) = 22.00000000000239 - i 3.000000000016186
x( 7 ) = 12.99999999999607 + i 8.000000000000359
x( 8 ) = 12.99999999999607 - i 8.000000000000359
Poiché le effettive radici dell’equazione hanno i seguenti valori
x(1) = 43; x(2) = -74; x(3) = 31; x(4) = -19 x(5) = 22 - i 3; x(6) = 22 - i 3; x(7) = 13 + i 8; x(8) = 13 – i 8
i valori trovati possono considerarsi accettabili come radici dell’equazione essendo delle loro buone
approssimazioni ( il massimo errore commesso risulta sulla parte immaginaria della coppia di radici
x(5 ) e x(6): ε = 1.6186 ⋅ 10 −11 ). Più avanti si vedrà come può effettuarsi una verifica sui valori ottenuti.
3.2 Equazioni Algebriche con radici multiple
In caso di equazioni che hanno radici multiple i valori trovati delle radici utIlizzando l’algoritmo di Bairstow e in
vari altri metodi iterativi dedicati al calcolo delle radici si viene a perdere la convergenza quadratica passando ad
una convergenza lineare tanto più lenta quanto più alto è il grado di molteplicità delle radici ed ottenendo in genere
valori numerici meno precisi per le radici.
Per ovviare a questo inconveniente si può procedere nella seguente maniera:
www.matematicamente.it
10
sia P(x) = 0 una equazione di grado n con radici multiple; una volta calcolate le sue radici, ad esempio con
l’algoritmo di Bairstow, dall’esame e dall’osservazione dei valori numerici trovati si può intravedere e capire se vi
sono effettivamente delle radici multiple anche se per esse si sono ottenuti valori poco precisi. Si consideri ora il
polinomio ottenuto da P(x) derivando ciascun suo termine, polinomio che denoteremo come la derivata prima di
P(x) e indicheremo con il simbolo P’(x). Si può facilmente dimostrare che se P(x) possiede una radice di
molteplicità m la sua derivata P’(x), risulta avere la stessa radice ma con molteplicità m-1 [11],[12]
Si può poi ricavare inoltre il polinomio Q((x) contenente con molteplicità 1 tutte e sole le radici di tipo multiplo
di P(x) tramite la seguente formula Q( x) =
P( x)
dove il polinomio M(x) risulta essere il Massimo Comun
M ( x)
Divisore fra P(x) e P’(x). [11],[12].
Esempio: consideriamo la seguente equazione di 7° grado:
P(x) = x 7 − 24 x 6 + 269 x 5 − 1810 x 4 + 7060 x 3 − 12248 x 2 − 15708 x + 113288 = 0
che sappiamo avere le seguenti radici esatte: 2, 7, 7, 3 ± i 5, 3 ± i 5;
Risolvendo l’equazione con Bairstow si trovano i seguenti valori:
I VALORI TROVATI PER LE 7 RADICI DELL'EQUAZIONE SONO:
x( 1 )= 6.999999936399882
x( 2 )=-2
x( 3 )= 3.000000025970351 + i 4.999999983662976
x( 4 )= 3.000000025970351 - i 4.999999983662976
x( 5 )= 2.999999974029648 + i 5.000000016337024
x( 6 )= 2.999999974029648 - i 5.000000016337024
x( 7 )= 7.00000006360012
Dall’esame dei suddetti valori si può facilmente vedere che l’equazione possiede delle radici doppie.
Derivando ora la suddetta equazione; si ottiene l’equazione seguente:
P’(x) = 7 x 6 − 144 x 5 + 1345 x 4 − 7240 x 3 + 21180 x 2 − 24496 x − 15708 = 0
Risolvendola si ottengono per le sue radici questi valori .
x( 1 ) = 7
x( 2 ) =-.4433325806250588
x( 3 )= 4.007380576026818 + i 2.282190039808705
x( 4 ) = 4.007380576026818 - i 2.282190039808705
x( 5 ) = 2.999999999999998 + i 5.000000000000002
x( 6 ) = 2.999999999999998 - i 5.000000000000002
prendendo in considerazione i valori x(1), x(5) e x(6) delle radici della P’(x) e paragonandoli ai valori della P(x)
che sono relativi alle sue radici doppie, si vede chiaramente che tali valori sono molto più vicini se non addirittura
uguali alle vere radici rispetto a quelli ottenuti risolvendo la P(x) = 0.
3 – CONTROLLI E VERIFICHE
Una volta trovati con l’utilizzo dei suddetti algoritmi i valori che si ritengono essere i valori più o meno
approssimati alle effettive radici della equazione in esame, risulterebbe opportuno avere disponibile un metodo in
grado di controllare se questi valori si possono considerare sufficientemente prossimi o uguali alle vere radici
dell’equazione.
Nella maggior parte degli esempi riportati nel listato relativo al programma dedicato al metodo di Bairstow ,
vengono date equazioni di cui si conoscono a priori le vere radici come ad esempio quella sopra illustrata.
In effetti i coefficienti di queste equazioni sono stati calcolati con l’utilizzo di un apposito programma sempre in
Qbasic, che qui non si riporta, operando come segue: per ciascuna equazione P(x)=0 che si vuole realizzare si
costruisce il relativo polinomio effettuando il prodotto di binomi o di trinomi (fattori quadratici ) ciascuno dei quali
è costituito da ben determinati valori numerici considerati come loro coefficienti.
Si è voluto così procedere per poter controllare e vedere da un semplice confronto fra i conosciuti i valori delle vere
radici ed i valori ottenuti quanto quest’ultimi si discostano dalla effettivi valori delle radici e ricavare e conoscere
quindi l’errore commesso.
www.matematicamente.it
11
Ma per una equazione algebrica di cui non si conoscono a priori le radici esiste un metodo per verificare dai
risultati ottenuti la bontà dei valori che si ritengono essere le sue radici?
La risposta in linea teorica è affermativa: bisogna tuttavia tenere presente le limitazioni di precisione di calcolo di
cui e affetta l’aritmetica utilizzata ( nel nostro caso aritmetica in doppia precisione a virgola mobile con mantissa di
lunghezza fissa di 16 cifre).
Partendo dal fatto ovvio che il polinomio P(x) ha valore nullo se x è una sua radice il metodo banale è quello
della semplice sostituzione dell’incognita x con il valore reale xo o complesso xo + i yo trovato per la radice ed il
conseguente calcolo delle sue varie potenze, seguito dai vari prodotti di queste potenze per i relativi coefficienti
dell’equazione ed infine dalla somma algebrica totale di questi prodotti tenendo sempre conto di separare fra loro i
valori reali e complessi trovati durante i calcoli
Esiste tuttavia un metodo molto più efficiente di quello sopra accennato, noto come algoritmo di HORNER, in
quanto esso implica un consistente minor numero di operazioni aritmetiche da effettuare. Tale algoritmo infatti è
dedicato proprio al calcolo del valore numerico di un polinomio algebrico P(x) per il valore di x preso in
considerazione. Per tale algoritmo, esteso nel campo delle variabili complesse [13], è stato quindi realizzato un
semplice programma in QBASIC il cui listato, composto da un esiguo numero di istruzioni, viene riportato
nell’ALLEGATO 3.
Con questo programma pertanto si può calcolare in corrispondenza ad un valore reale xo il valore numerico reale
di P(xo) = G(xo) ed in corrispondenza ad un valore complesso xo + i yo il valore numerico complesso
P(xo + i yo ) = G(xo , yo ) + i H(xo ,yo)
Pertanto se xo fosse un effettiva radice reale dell’equazione si avrebbe G(xo) = 0; se xo + i yo fosse un effettiva
radice complessa dell’equazione si avrebbe G(xo , yo ) = 0 e H(xo ,yo) = 0
E’ lecito quindi supporre che per il valore xo trovato quanto più G(xo) risulta prossimo allo zero tanto più xo
risulta essere un buona approssimazione all’effettivo valore della radice. Così pure per il valore xo + i yo trovato:
quanto più G(xo, yo ) e H(xo,yo) risultano prossimi allo zero, tanto più xo + i yo risulta essere una buona
approssimazione all’effettivo valore della radice.
Bisogna tuttavia tener conto, come già sottolineato, della precisione di calcolo in quanto, pur utilizzando la
aritmetica in doppia precisione, quando si effettuano operazioni aritmetiche fra valori numerici sia interi e non,
costituiti da molte cifre tale aritmetica presenta delle limitazioni di precisione dovute agli inevitabili arrotondamenti
e troncamenti nei calcoli che possono portano a risultati approssimati o addirittura inaccettabili.
Pertanto per quelle equazioni e per le quali si sono trovate radici di valore grande si possono ottenere dei valori
alquanto diversi da zero per P(x) anche se il valore di x in esame risulta essere un ottima approssimazione
all’effettivo valore della radice (vedi 2° ESEMPIO)
1° ESEMPIO
Dato il polinomio P(x) = x 7 + 5 x 6 − 34 x 5 + 3 x 4 − 18 x 3 − 64 x + 2
si voglia risolvere l’equazione P(x) = 0.
Utilizzando il programma in ALLEGATO 2 relativo al metodo di Bairstow si trovano per le 7 radici dell’equazione
i seguenti valori:
x( 1 ) =
x( 2 ) =
x( 3 ) =
x( 4 ) =
x( 5 ) =
x( 6 ) =
x( 7 ) =
3.898415710352644
-8.889486988062991
- .7366098098292232 + i .8605328653206531
- .7366098098292232 - i .8605328653206531
.7165247222415944 + i .9624369445553462
.7165247222415944 - i .9624369445553462
3.124145288560465D-02
Utilizzando il programma in ALLEGATO 3 o la parte di programma relativo alla verifica relativa all’algoritmo di
Horner presente nell’ALLEGATO 2 viene calcolato il valore numerico del polinomio P(x) per il valore ad esempio
di x = x(1) .
Effettuando i calcoli si trova P(x(1)) = 2.72249662789162 ⋅ 10 −10 . Per i valori x = x(3 ) e x = x(4) si ottiene
P(x(3)) = P(x(4)) = (1.8237764449956169) ⋅ 10 −10 − i (1.608075050072225) ⋅ 10 −11
Anche per il valore di P(x) calcolato per gli altri valori x(2), x(5), x(6) e x(7) si trovano dei valori numerici dello
stesso ordine di grandezza di quelli trovati per x(1) e per x(3 ) vale a dire molto piccoli e quindi è lecito
considerare i valori trovati proprio come radici dell’equazione o per lo meno delle ottime approssimazioni alle
effettive radici.
www.matematicamente.it
12
2° ESEMPIO
Si consideri il seguente polinomio :
P(x) = x 5 - 1308660 x 4 + 428159526567 x 3 -7706187060090 x 2 -85201586567134 x +827158696377720
l’equazione P(x) = 0 ha come effettive radici i seguenti valori: -12; 7; 23; 654321 – i 13; 654321 + i 13
Risolvendo l’equazione con il programma dell’ALLEGATO 2 si trovano per le radici i seguenti valori :
-12;
7.000000000000001;
23;
654321 – i 13.00000002063238;
654321 + i 13.00000002063238
il valore xo = 7.000000000000001 potrebbe senz’altro da considerarsi accettabile come radice della suddetta
equazione in quanto vi è un errore ε = 1 ⋅ 10 −16 fra il valore trovato e l’effettivo valore della radice.
Applicando ora il metodo di Horner per il valore x =7 si ottiene correttamente P(7) = 0 mentre per il valore
x = 7.000000000000001 si viene ad avere per P(x) = – 0.10498…..che potrebbe essere considerato un accettabile
valore di verifica .
Ma per i valori x1 = 654321 ± i 13.00000002063238 ottenuti al posto delle effettive radici pur essendo affetti da
un errore < 3 ⋅ 10 −8 sulla parte immaginaria si riscontrano per P(x1) dei valori sia per la sua parte reale che per la
sua parte immaginaria non solo diversi da zero ma anche grandi. Pertanto sarebbero da non prendere in
considerazione quali garanti dell’accettazione o meno del valore trovato quale valore radice dell’equazione.
Ciò è dovuto sostanzialmente alla propagazione ed all’accumulo degli errori di arrotondamento e di troncamento
nei calcoli effettuati su numeri interi e non interi, composti da diverse cifre e che possono portare a valori errati
sul risultato finale avendo usato una aritmetica, se pur a doppia precisione, che opera però su numeri a virgola
mobile e con mantissa di lunghezza fissa prestabilita.
L’imprecisione nei calcoli per questo tipo di aritmetica può del resto essere messa in evidenza effettuando il
semplice il calcolo di (7.0000000000001 –7) che, eseguito con tale aritmetica risulta essere pari a:
1.003641………D-13 mentre il suo evidente valore è dato da 1D-13
3° ESEMPIO
Dato il polinomio P(x) = 25 x 9 + 89 x 8 − 41x 7 + 78 x 6 − 92 x 5 + 67 x 4 + 512 x 3 − 631x 2 + 10 x + 53
Si voglia risolvere l’equazione P(x) = 0
Utilizzando il programma in ALLEGATO 1 relativo al metodo Q-D si sono trovati per le 9 radici dell’equazione i
seguenti valori:
radici reali:
xr( 1 ) = -4.171072612564805
xr( 2 ) = -1.405104995540434
xr( 3 ) = .9256795247813259
xr( 4 ) = .3576619480208132
xr( 5 ) = -.2581278353479367
radici complesse:
xc( 1 ) = -.4087905203203133 + i 1.538755139809708
xc( 2 ) = -.4087905203203133 - i 1.538755139809708
xc( 3 ) = .9042725056458745 + i .9230665105543054
xc( 4 ) = .9042725056458745 - i .9230665105543054
Uilizzando il programma in ALLEGATO 3 relativo all’algoritmo di Horner si è calcolato il valore numerico del
polinomio P(x) in corrispondenza a ciascuna dei suddetti valori relativi alle radici si sono avuti i seguenti risultati:
P(xr1) = (2.56…..)ּ 10 −9
P(xr2) = (-1.71….)ּ 10−6
P(xr3) = (4.64…..)ּ 10 −13
P(xr4) = (-1.88….)ּ 10 −12
P(xr5) = (-3.08….)ּ 10 −12
P(xc1) = P(xc2) = (2.24…)ּ 10 −8 – i (1.05…)ּ 10 −8
P(xc3) = P(xc4) = (5.95…)ּ 10 −7 + i (6.62…)ּ 10 −7
I valori numerici che si sono ottenuti per il polinomio P(x) sono sufficiente piccoli tali quindi da poter concludere
che i valori numerici trovati per le radici possono considerarsi accettabili.
Un altra interessante controllo può essere effettuato sulle equazioni del tipo x n − 1 = 0 , confrontando i risultati
numerici trovati per le radici, quando vengono utilizzati gli algoritmi illustrati con quelli ottenuti tramite la
seguente nota formula relativa al calcolo delle n radici dell’unità :
e
k
2π
i
n
=
cos(k
2π
2π
+ i sen(k
)
n
n
per k = 1, 2, 3,……n
dove i = − 1
Si può verificare così se i corrispondenti risultati numerici sono uguali o diversi
www.matematicamente.it
13
(a)
Esempio: data l’equazione x 9 − 1 = 0 prendiamo in considerazione i risultati numerici relativi ad una stessa
coppia di radici complesse trovata usando sia l’algoritmo QD, sia l’algoritmo di Bairstow sia la formula (a) in cui
si è posto n =9.
Si ottengono i seguenti valori
Per QD :
-0.9396926207851135 ± i 0.3420201433238613
Per Bairstow:
-0.9396926207859302 ± i 0.3420201433256663
per formula (3 ): -0.9396926207859083 ± i 0.3420201433256688
si nota che per i tre diversi casi si ottengo valori che differiscono solo nelle cifre meno significative. Pertanto
possiamo prendere come risultato accettabile e affidabile per detta radice il valore che presenta uguali cifre comuni
in tutti e tre i casi e cioè: 0.939692620785 ± i 0.34202014332
CONCLUSIONI
Dai risultati ottenuti risolvendo molte equazioni di grado diverso si può arrivare a concludere che il metodo di
Bairstow è preferibile al metodo Q-D dati le limitazioni ed i difetti che quest’ultimo algoritmo presenta.
Inoltre in generale si è potuto costatare che i valori trovati relativi alle radici di una equazione risultano più precisi
se ottenuti con Bairstow rispetto a quelli ottenuti con il metodo Q-D e ciò risulta tanto più evidente quanto più alto
è il grado dell’equazione.
Pertanto il programma il cui listato è riportato nell’ Allegato 2 relativo all’algoritmo di Bairstow in relazione alla
risoluzione di una generica equazione algebrica risulta senz’altro da preferire rispetto al programma esposto
nell’Al1egato 1 relativo al calcolo che utilizza l’algoritmo Quoziente-Differenza (Q-D)
Quest’ ultimo algoritmo risulta interessante perché esso permette la simultanea ricerca di tutte le radici di una
equazione senza alcuna preventiva implicazione di eventuali parametri: con esso però , non si può avere la certezza
che i valori trovati per una qualsiasi equazione rappresentino più o meno approssimati i valori delle radici
dell’equazione in quanto come gia messo in evidenza per alcuni tipi particolari di equazioni si trovano o valori
molto imprecisi od addirittura errati.
Ciò non di meno in alcuni casi potrebbe risultare interessante risolvere l’equazione anche con l’algoritmo Q-D per
comparare fra loro i risultati ottenuti con l’uno e con l’altro algoritmo, ma soprattutto perché in alcuni casi si
riescono ad ottenere per l’algoritmo di Bairstow dei risultati con un minor di iterazioni sfruttando i risultati
ottenuti con l’impiego del QD.
L’utilizzo dell’algoritmo Q-D risulta inoltre di notevole interesse quando si vuole calcolare e trovare fra tutte le
radici reali di un equazione quella di valore assoluto più grande. Si è potuto riscontrare infatti in tutti gli esempi
di equazioni risolte che tale tipo di radice risulta ovviamente avere uguale valore tranne al limite la cifra meno
significativa, sia se calcolato con l’uno o con l’altro algoritmo, ma con la differenza che con l’algoritmo
Q-D il calcolo di tale radice è praticamente immediato perché è il primo valore che viene trovato, mentre con
l’algoritmo di Bairstow molto spesso è l’ultimo ad esser calcolato. Pertanto con Bairstow il suo valore non
comparirà immediatamente, ma solo alla fine della ricerca di tutte le radici e quindi anche dopo diversi secondi se il
grado dell’equazione è abbastanza grande( vedi esempi riportati più avanti)
Il programma in Allegato 2 presenta due opzioni:
1) con la prima opzione si può procedere alla risoluzione di una equazione introducendo come richiesta da
INPUT il suo grado ed i suoi coefficienti;
2) con la seconda opzione si può procedere alla risoluzione di una delle equazioni selezionata,(per molte delle
quali si conoscono le effettive radici), fra gli esempi riportati nel listato.
Vengono infine mostrati vari esempi di risoluzione utilizzando sempre l’algoritmo di Bairstow e quindi il
programma esposto in Allegato 2 spaziando dal 3° grado a gradi più elevati.
www.matematicamente.it
14
RIFERIMENTI
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
M. Cipolla – ANALISI ALGEBRICA, Cap. XVIII, Terza Edizione 1948 - Editore G. Principato
M. Cipolla – ANALISI ALGEBRICA, Cap. XVI, Terza Edizione 1948 - Editore G. Principato
A. Bernardo - http://www.matematicamente.it/storia/l'equazione_di_terzo_grado.html
M.T. Mazzucato - http://www.matematicamente.it/mazzucato/EquazioniAlgebriche.pdf
E. Di Rienzo - http://www.matematicamente.it/approfondimenti/index.html
http://eqworld.ipmnet.ru/en/solutions/ae.htm
C.F. Gerald, P.O. Wheatley - Applied Numerical Analysis – Third Edition 1984 Addison-Wesley
Publishing Company
F. Sheid - Analisi Numerica – Collana SCHAUM, 1975 - Etas /Libri
http://hcgl.eng.ohio-state.edu/~ce406/Chapt1/Chapt1.pdf
http://chml028.chml.ubc.ca/CHML/chbe330/notes/rootfind.doc
http://www.vialattea.net/esperti/mat/bairstow/bairstow.htm
G. Clemente, C. Signorini- Elementi di CALCOLO NUMERICO – Patron Editore – Bologna 1974
G.B. De Sinno –Corso completo di MATEMATICHE PURE ,Tomo Primo,Cap.XIV,
Seconda Edizione – STAMPERIA del FIBRENO - NAPOLI 1850
E. Durand - Solutions Numeriques des Equations Algebriques, Tome I - Masson et C.ie Editeurs ,1960
ESEMPI DI RISOLUZIONE DI EQUAZIONI ALGEBRICHE
1 - Risolvere l’equazione x 3 + 6 x − 20 = 0 utilizzando ed eseguendo il programma in Allegato2
sullo schermo del monitor comparirà la seguente stampa:
Il programma presenta due opzioni:
1) se si vuole risolvere un'equazione algebrica qualsiasi digitare 111
e quindi introdurre il suo grado ed i suoi coefficienti
2) se si vuole invece risolvere l'equazione di uno degli esempi
riportati nel listato di questo programma digitare 222 e quindi
introdurre il grado dell'equazione
-----------------------------------------------------quale opzione scegli? 111
introdurre il grado dell'equazione:3
introdurre i coefficienti
a( 1 )? 1
a( 2 )? 0
a( 3 )? 6
a( 4 )? -20
---------------------------------------------------------------------I VALORI TROVATI PER LE 3 RADICI DELL'EQUAZIONE SONO:
x( 1 )=-1 + i 3
x( 2 )=-1 - i 3
x( 3 )= 2
------------------ VERIFICA-----------------------------------------VALORE di P (x( 1 )): 0 + i 0
VALORE di P (x( 2 )): 0 + i 0
VALORE di P (x( 3 )): 0
tempo impiegato: 0 secondi
www.matematicamente.it
15
2 - Risolvere l’equazione x 4 − 15736 x 3 + 1674654086 x 2 − 26340329561236 x + 52673960632000 = 0
utilizzando il programma in Allegato 2 ed eseguendo le indicazioni che compaiono sullo schermo
del monitor si sceglie l’ opzione 2
Il programma presenta due opzioni:
1) se si vuole risolvere un'equazione algebrica qualsiasi digitare 111
e quindi introdurre il suo grado ed i suoi coefficienti
2) se si vuole invece risolvere l'equazione di uno degli esempi
riportati nel listato di questo programma digitare 222 e quindi
introdurre il grado dell'equazione
-----------------------------------------------------quale opzione scegli? 222
grado dell'equazione? 4
------------- EQUAZIONE DI 4° GRADO -------------------------------radici esatte : 2; 15728; 3 + i 40921;
3 + i 40921
coefficienti:
a( 1 )= 1
a( 2 )=-15736
a( 3 )= 1674654086
a( 4 )=-26340329561236
a( 5 )= 52673960632000
---------------------------------------------------------------------I VALORI TROVATI PER LE 4 RADICI DELL'EQUAZIONE SONO:
x( 1 )= 15728
x( 2 )= 2
x( 3 )= 3 + i 40921
x( 4 )= 3 - i 40921
------------------- VERIFICA-----------------------------------------VALORE di P (x( 1 )): 0
VALORE di P (x( 2 )): 0
VALORE di P (x( 3 )): 0 + i 0
VALORE di P (x( 4 )): 0 + i 0
tempo impiegato: 0 secondi
3 - Si vuole risolvere la seguente equazione: x 5 + 7 x 4 − 638x 3 + 9926 x 2 − 87236x − 549360 = 0
eseguendo il programma in Allegato 2 seguendo le indicazioni che compaiono sullo schermo
del monitor si sceglie l’ opzione 1
Il programma presenta due opzioni:
1) se si vogliono calcolare le radici di una equazione algebrica digitare 111
e quindi introdurre il suo grado ed i suoi coefficienti
2) se si vuole risolvere l'equazione di uno degli esempi riportati nel listato del
presente programma digitare 222 e quindi introdurre il grado dell'equazione
? 111
grado dell'equazione? 5
introdurre i coefficienti
a( 1 )? 1
a( 2 )? 7
a( 3 )? -638
a( 4 )? 9926
a( 5 )? -87236
a( 6 )? -549360
---------------------------------------------------------------------I VALORI TROVATI PER LE 5 RADICI DELL'EQUAZIONE SONO:
x( 1 )= 18
x( 2 )=-35
x( 3 )= 7 + i 13
x( 4 )= 7 - i 13
x( 5 )=-4
------------------- VERIFICA-----------------------------------------VALORE di P (x( 1 )): 0
VALORE di P (x( 2 )): 0
VALORE di P (x( 3 )): 0 + i 0
VALORE di P (x( 4 )): 0 + i 0
VALORE di P (x( 5 )): 0
tempo impiegato: 0 secondi
www.matematicamente.it
16
4 - Risolvere la seguente equazione di 7° grado con i due algoritmi: Q-D e Bairstow:
x 7 + 3974 x 6 –2520212 x 5 + 384480770 x 4 –13579847431 x 3 + 483395760056 x 2 – 8591662796578 x + 63423616427580 = 0
risolvendola con l’algoritmo Q-D
(programma in Allegato 1 )
si trovano per le sue radici i seguenti valori:
risolvendola con l’algoritmo di BAIRSTOW
(programma in Allegato 2 )
si trovano per le sue radici i seguenti valori:
radici reali:
xr( 1 ) =-4547.000000000002
xr( 2 ) = 353.9999999999998
xr( 3 ) = 185.0000000000001
radici complesse:
xc( 1 ) = 4.000000000000909 + i 31.00000000007272
xc( 2 ) = 4.000000000000909 - i 31.00000000007272
xc( 3 ) = 13 + i 7.000000000028619
xc( 4 ) = 13 - i 7.000000000028619
Le effettive 7 radici dell’equazione sono: -4547 ;
approssimazione ottenuta.
radici reali:
xr( 1 ) =-4547
xr( 2 ) = 354
xr( 3 ) =185
radici complesse
xc( 1 ) = 3.9999999999999998 + i 31
xc( 2 ) = 3.9999999999999998 – i 31
xc( 3 )= 13 + i 6.999999999999996
xc( 4 ) = 13 – i 6.999999999999996
185 ;
354;
4 ± i 31;
13 ± i 17 , per cui si noti la eccellente
5
- Sia da risolvere la seguente equazione di 9° grado :
P(x) = x 9 − 5 x 8 + 34 x 7 + 87 x 6 + 92 x 5 − 90 x 4 − 31x 3 + 778 x 2 − 65 x + 8 = 0
Utilizzando il programma in Allegato 2 (Bairstow) eseguendo le indicazioni che compaiono sullo schermo si
sceglie l’ opzione 1
Il programma presenta due opzioni
1) se si vogliono calcolare le radici di una equazione algebrica digitare 111
quindi introdurre il suo grado ed i suoi coefficienti battendo ogni volta tasto invio
2) se si vuole risolvere l'equazione di uno degli esempi riportati nel listato del programma
digitare 222 e quindi introdurre il grado dell'equazione battendo ogni volta tasto invio
quale opzione? 111
grado dell'equazione? 9
introdurre i coefficienti
a( 1 )? 1
a( 2 )? -5
a( 3 )? 34
a( 4 )? 87
a( 5 )? 92
a( 6 )? -90
a( 7 )? -31
a( 8 )? 778
a( 9 )? -65
a( 10 )? 8
---------------------------------------------------------------------I VALORI TROVATI PER LE 9 RADICI DELL'EQUAZIONE SONO:
x( 1 )= 4.164367880078814D-02 + i 9.262957138114185D-02
x( 2 )= 4.164367880078814D-02 - i 9.262957138114185D-02
x( 3 )=-1.234482222112714 + i 1.658111661918189
x( 4 )=-1.234482222112714 - i 1.658111661918189
x( 5 )= 1.057399344222862 + i .9773678844460866
x( 6 )= 1.057399344222862 - i .9773678844460866
x( 7 )= 3.557900355354126 + i 5.898401099594206
x( 8 )= 3.557900355354126 - i 5.898401099594206
x( 9 )=-1.844922312530125
------------------- VERIFICA-----------------------------------------VALORE di P (x( 1 )): 2.56695706357668D-14 + i 3.939990694812323D-16
VALORE di P (x( 2 )): 2.56695706357668D-14 – i 3.939990694812323D-16
VALORE di P (x( 3 )): 1.849958988081601D-12 + i 2.389052931178748D-12
VALORE di P (x( 4 )): 1.849958988081601D-12 – i 2.389052931178748D-12
VALORE di P (x( 5 )): 2.445309579823807D-13 – i 4.928848128249452D-13
VALORE di P (x( 6 )): 2.445309579823807D-13 + i 4.928848128249452D-13
VALORE di P (x( 7 )):-2.184939304136768D-09 – i 8.733180810460706D-10
VALORE di P (x( 8 )):-2.184939304136768D-09 + i 8.733180810460706D-10
VALORE di P (x( 9 )):-4.331097112897364D-12
tempo impiegato: 3.2421875 secondi
www.matematicamente.it
17
OSSERVAZIONI: della suddetta equazione non si conoscono i valori effettivi delle radici : tuttavia i valori trovati
possono essere considerati delle ottime approssimazioni delle radici constatando che il valore assunto dal polinomio
P(x) in corrispondenza di tali valori risulta praticamente uguale zero.Del resto risolvendo l’equazione con
l’algoritmo Q-D si trova il valore -1.844922312530126 per l’unica radice reale che è uguale a meno della cifra
decimale meno significativa a quello trovato con l’algoritmo di Bairstow.
6 -Si vuole risolvere la seguente equazione di grado 13°:
1.95 x 13 + 8.85 x 12 − 1.27 x 11 − 3.81x 10 − 1.89 x 9 + 6.87 x 8 + 4.09 x 7 − 2.91x 6 + 4.45 x 5 − 9.17 x 4 − 0.31x 3 + 9.67 x 2 + 8.53 x + 2.23 = 0
seguendo le indicazioni che compaiono sullo schermo si sceglie l’ opzione 1
Il programma presenta due opzioni:
1) se si vogliono calcolare le radici di una equazione algebrica digitare 111,
quindi introdurre il suo grado ed i suoi coefficienti battendo ogni volta tasto invio
2) se rivuole risolvere l’equazione di uno degli esempi riportati nel listato del programma
digitare 222 , quindi introdurre il grado dell’ equazione battendo ogni volta tasto invio
quale opzione? 111
grado dell’equazione? 13
introdurre i coefficienti:
a( 1 )? 1.95
a( 2 )? 8.85
a( 3 )? -1.27
a( 4 )? -3.81
a( 5 )? -1.89
a( 6 )? 6.87
a( 7 )? 4.09
a( 8 )? -2.91
a( 9 )? 4.45
a( 10 )? -9.17
a( 11 )? -0.31
a( 12 )? 9.67
a( 13 )? 8.53
a( 14 )? 2.23
---------------------------------------------------------------------I VALORI TROVATI PER LE 13 RADICI DELL'EQUAZIONE SONO:
x( 1 )=-.4236646377662956
x( 2 )=-4.604272458509148
x( 3 )= 1.004729553860226 + i .3121776607888914
x( 4 )= 1.004729553860226 - i .3121776607888914
x( 5 )= .0816401176996516 + i .9844357667250211
x( 6 )= .0816401176996516 - i .9844357667250211
x( 7 )=-.4060555579184616 + i .3899084388594801
x( 8 )=-.4060555579184616 - i .3899084388594801
x( 9 )=-.7066287282846166 + i .91734358674061
x( 10 )=-.7066287282846166 - i .91734358674061
x( 11 )= .801092265130999 + i .7504521110868337
x( 12 )= .801092265130999 - i .7504521110868337
x( 13 )=-1.060079743161692
------------------ VERIFICA------------------------------------------–
VALORE di P (x( 1 )):-7.958043946043603D-17
VALORE di P (x( 2 )):-1.090604031851478D-07
VALORE di P (x( 3 )): 2.875037096370899D-08 + i 6.283464968823149D-09
VALORE di P (x( 4 )): 2.875037096370899D-08 – i 6.283464968823149D-09
VALORE di P (x( 5 )): 1.017061446368685D-08 + i 1.981446493912339D-08
VALORE di P (x( 6 )): 1.017061446368685D-08 – i 1.981446493912339D-08
VALORE di P (x( 7 )): 3.544287465514356D-10 + i 7.84797225122924D-09
VALORE di P (x( 8 )): 3.544287465514356D-10 – i 7.84797225122924D-09
VALORE di P (x( 9 )):-5.695416201590559D-09 + i 1.8464039971554D-08
VALORE di P (x( 10 )):-5.695416201590559D-09 – i 1.8464039971554D-08
VALORE di P (x( 11 )): 2.465161633429403D-08 + i 1.510495019677299D-08
VALORE di P (x( 12 )): 2.465161633429403D-08 – i 1.510495019677299D-08
VALORE di P (x( 13 )):-1.280957138711375D-08
tempo impiegato: 1.26 secondi
OSSERVAZIONI sui risultati dell’esempio 6: la verifica ha dato risultati molto vicino a zero in relazione al valore
del polinomio P(x) calcolato per ciascun valore numerico trovato per le radici dell’equazione ; pertanto i vari valori
x(k) calcolati possono essere considerati delle buone approssimazioni agli effettivi valori delle radici
www.matematicamente.it
18
7 - Sia
data l’equazione P(x) = 0 di grado 16° composta dai seguenti coefficienti :
a(1) = 1 a(2) = -30:
a(3) = 435 a(4) = -4060 a(5) = 27337 a(6) = -140790 a(7) = 573105
a(8) = -1877980 a(9) = 4997798
a(10) = -10819380
a(11) = 18959460 a(12) = -26570960
a(13) = 29153864 a(14) = -24178800 a(15) = 14280000 a(16) = -5360000
a(17) = 960000
si sa che l’’equazione presenta le seguenti radici esatte:
1; 2; 3; 4 ; 1 ± i 1 ± i2; 1 ± i3; 2 ± i; 2 ± j2; 3 ± i
Risolvendo l’equazione con l’algoritmo di Bairstow utilizzando il programma riportato in Allegato 2 sullo
schermo del monitor compare quanto segue:
Il programma presenta due opzioni:
1) se si vuole risolvere un'equazione algebrica qualsiasi digitare 111
e quindi introdurre il suo grado ed i suoi coefficienti
2) se si vuole invece risolvere l'equazione di uno degli esempi
riportati nel listato di questo programma digitare 222 e quindi
introdurre il grado dell'equazione
-----------------------------------------------------quale opzione scegli? 111
introduci il grado dell'equazione? 16
introduci i coefficienti:
a( 1 ) = 1
a( 2 )=-30
a( 3 )= 435
a( 4 )=-4060
a( 5 )= 27337
a( 6 )=-140790
a( 7 )= 573105
a( 8 )=-1877980
a( 9 )= 4997798
a( 10 )=-10819380
a( 11 )= 18959460
a( 12 )=-26570960
a( 13 )= 29153864
a( 14 )=-24178800
a( 15 )= 14280000
a( 16 )=-5360000
a( 17 )= 960000
---------------------------------------------------------------------I VALORI TROVATI PER LE 16 RADICI DELL'EQUAZIONE SONO:
x( 1 )= 2.000000000008083
x( 2 )= .9999999999999756
x( 3 )= 4.000000000020012
x( 4 )= 2.999999999885962
x( 5 )= 1.999999999998137 + i .9999999999945444
x( 6 )= 1.999999999998137 - i .9999999999945444
x( 7 )= 1.000000000002836 + i 1.000000000005617
x( 8 )= 1.000000000002836 - i 1.000000000005617
x( 9 )= 3.000000000035363 + i .9999999999873737
x( 10 )= 3.000000000035363 - i .9999999999873737
x( 11 )= 1.000000000001345 + i 2.0000000000012
x( 12 )= 1.000000000001345 - i 2.0000000000012
x( 13 )= 2.000000000005255 + i 2.00000000000216
x( 14 )= 2.000000000005255 - i 2.00000000000216
x( 15 )= 1.000000000000049 + i 2.999999999999947
x( 16 )= 1.000000000000049 - i 2.999999999999947
------------------ VERIFICA-----------------------------------------VALORE di P (x( 1 )): 6.451068657042924D-08
VALORE di P (x( 2 )):-1.11572262539994D-09
VALORE di P (x( 3 )):-4.185146235613502D-05
VALORE di P (x( 4 )):-1.811940819607116D-08
VALORE di P (x( 5 )): 9.427776603843085D-08 + i -2.002786914090393D-08
VALORE di P (x( 6 )): 9.427776603843085D-08 + i 2.002786914090393D-08
VALORE di P (x( 7 )):-1.568359380144102D-07 + i -6.043688927093172D-08
VALORE di P (x( 8 )):-1.568359380144102D-07 + i 6.043688927093172D-08
VALORE di P (x( 9 )):-4.322619815866346D-06 + i -2.176418774979538D-06
VALORE di P (x( 10 )):-4.322619815866346D-06 + i 2.176418774979538D-06
VALORE di P (x( 11 )):-7.815964409019216D-07 + i 1.98667748918524D-07
VALORE di P (x( 12 )):-7.815964409019216D-07 + i -1.98667748918524D-07
VALORE di P (x( 13 )): 2.700085133255925D-07 + i 1.21854543522204D-06
VALORE di P (x( 14 )): 2.700085133255925D-07 + i -1.21854543522204D-06
VALORE di P (x( 15 )):-2.640306888679333D-06 + i 1.210968889608921D-06
VALORE di P (x( 16 )):-2.640306888679333D-06 + i -1.210968889608921D-06
tempo impiegato: 2.14 secondi
OSSERVAZIONI : nella a verifica effettuata tutti i valori P (x (k) ) sono numeri molto piccoli;, quindi i valori
trovati Per le radici possono essere accettabili.
www.matematicamente.it
19
8 -Risolvere l’equazione P(x) = 0 di 61° grado
15
543
-344
481
-676 479
-840 189
-902 -108
-78 -724
87
-282
-252
379
433
535
959
631
307 249
867 -152
-42 -484
583 715
avente i seguenti 62 coefficienti
-10 -84
559 -788
63 639
398 509
849 177 645
-268 -718 -390
-564 -772 -294
963
37
-548
557
-400
821 217
793 -260
499
-2
-606 647
-842 187
-54 287
P(x) = 15 x 61 − 676 x 60 + 479 x 59 + .......... .......... .......... .......... ...... + 398 x 3 + 509 x 2 + 963 x + 37 = 0
Risolvendo l’quazione con il programma in Allegato 2 i valori trovati per le 61 radici dell'equazione sono :
x( 1 )=-1.030162730698988 + i 4.848681546975673D-02
x( 2 )=-1.030162730698988 - i 4.848681546975673D-02
x( 3 )=-1.178035068961121D-02 + i .9616558798269891
x( 4 )=-1.178035068961121D-02 - i .9616558798269891
x( 5 )=-.7234485284555989 + i .6807484034724163
x( 6 )=-.7234485284555989 - i .6807484034724163
x( 7 )=-.5978415461173342 + i .7547568174748615
x( 8 )=-.5978415461173342 - i .7547568174748615
x( 9 )= .9958244477130661 + i 5.071022127163749D-02
x( 10 )= .9958244477130661 - i 5.071022127163749D-02
x( 11 )= .480993898389197 + i .8671702362189653
x( 12 )= .480993898389197 - i .8671702362189653
x( 13 )=-.812031076946809 + i .5430441591959616
x( 14 )=-.812031076946809 - i .5430441591959616
x( 15 )=-.4526542447267758 + i .9737504041040241
x( 16 )=-.4526542447267758 - i .9737504041040241
x( 17 )= 5.708663287847188D-02 + i 1.126709807653914
x( 18 )= 5.708663287847188D-02 - i 1.126709807653914
x( 19 )= .8651236988174531 + i .5082588941687342
x( 20 )= .8651236988174531 - i .5082588941687342
x( 21 )=-.8870673176892232 + i 3.973120596375307D-02
x( 22 )=-.8870673176892232 - i 3.973120596375307D-02
x( 23 )=-.3445594916860084 + i .9183248488106684
x( 24 )=-.3445594916860084 - i .9183248488106684
x( 25 )= 1.472759990448229
x( 26 )=-3.926314515405021D-02
x( 27 )=-.2263402361171653 + i .9305501535588818
x( 28 )=-.2263402361171653 - i .9305501535588818
x( 29 )=-.8435378330026433 + i .7128885372854706
x( 30 )=-.8435378330026433 - i .7128885372854706
x( 31 )= .9671209116891981 + i .3157630292833616
x( 32 )= .9671209116891981 - i .3157630292833616
x( 33 )= .6116111769577449 + i .6497366606654156
x( 34 )= .6116111769577449 - i .6497366606654156
x( 35 )= .8723397416698084 + i .5979358910801393
x( 36 )= .8723397416698084 - i .5979358910801393
x( 37 )=-.9278766094725098 + i .4245930912067086
x( 38 )=-.9278766094725098 - i .4245930912067086
x( 39 )=-.8618646046305071 + i .3155237542432021
x( 40 )=-.8618646046305071 - i .3155237542432021
x( 41 )= .3951590455491724 + i .9325614780023244
x( 42 )= .3951590455491724 - i .9325614780023244
x( 43 )=-.5356463775078942 + i .8788045890153185
x( 44 )=-.5356463775078942 - i .8788045890153185
x( 45 )=-.9324173563165614 + i .2349843535730832
x( 46 )=-.9324173563165614 - i .2349843535730832
x( 47 )= .98559826667011 + i .2091688146004978
x( 48 )= .98559826667011 - i .2091688146004978
x( 49 )= .6167444884875997 + i .7267846225927513
x( 50 )= .6167444884875997 - i .7267846225927513
x( 51 )= .3060657114600533 + i .9646399353918489
x( 52 )= .3060657114600533 - i .9646399353918489
x( 53 )= .8890983141485944 + i .4306554350356319
x( 54 )= .8890983141485944 - i .4306554350356319
x( 55 )= .2036212003254889 + i 1.024399367544061
x( 56 )= .2036212003254889 - i 1.024399367544061
x( 57 )= .7057836038401722 + i .7845283577610442
x( 58 )= .7057836038401722 - i .7845283577610442
x( 59 )=-.1199782858790976 + i .9950196486338441
x( 60 )=-.1199782858790976 - i .9950196486338441
x( 61 )= 44.34324072405367
www.matematicamente.it
20
--------------------------- VERIFICA -----------------------------------------------------VALORE di P (x( 1 )): -6.745601297051922D-11 + i -8.877316915421873D-11
VALORE di P (x( 2 )) :-6.745601297051922D-11 + i 8.877316915421873D-11
VALORE di P (x( 3 )): -2.003523669885654D-09 + i -1.824875618075972D-09
VALORE di P (x( 4 )): -2.003523669885654D-09 + i 1.824875618075972D-09
VALORE di P (x( 5 )):-6.584179087359976D-10 + i -1.280487781779582D-09
VALORE di P (x( 6 )): -6.584179087359976D-10 + i 1.280487781779582D-09
VALORE di P (x( 7 )): -8.706755160597934D-10 + i -1.413304263550574D-09
VALORE di P (x( 8 )) :-8.706755160597934D-10 + i 1.413304263550574D-09
VALORE di P (x( 9 )):-7.969395186527468D-09 + i -7.930589543360053D-10
VALORE di P (x( 10 )):-7.969395186527468D-09 + i 7.930589543360053D-10
VALORE di P (x( 11 )):-9.834951603115982D-10 + i -9.107056090154608D-10
VALORE di P (x( 12 )):-9.834951603115982D-10 + i 9.107056090154608D-10
VALORE di P (x( 13 )):-4.800644083646777D-10 + i -1.04028446794302D-09
VALORE di P (x( 14 )):-4.800644083646777D-10 + i 1.04028446794302D-09
VALORE di P (x( 15 )):-1.116410295806669D-09 + i -2.18040702507083D-09
VALORE di P (x( 16 )):-1.116410295806669D-09 + i 2.18040702507083D-09
VALORE di P (x( 17 )):-6.934414509274234D-08 + i 2.549807921270811D-08
VALORE di P (x( 18 )):-6.934414509274234D-08 + i -2.549807921270811D-08
VALORE di P (x( 19 )):-7.611277636626612D-08 + i 5.676519724759355D-07
VALORE di P (x( 20 )):-7.611277636626612D-08 + i -5.676519724759355D-07
VALORE di P (x( 21 )):-5.489982063045158D-10 + i -1.209965239980237D-10
VALORE di P (x( 22 )):-5.489982063045158D-10 + i 1.209965239980237D-10
VALORE di P (x( 23 )):-4.173701141640951D-10 + i -5.435701194711484D-10
VALORE di P (x( 24 )):-4.173701141640951D-10 + i 5.435701194711484D-10
VALORE di P (x( 25 )):-1.069190158310111D-02
VALORE di P (x( 26 )):-2.595254448845008D-09
VALORE di P (x( 27 )): 2.158262407681022D-08 + i 6.20240749480902D-08
VALORE di P (x( 28 )): 2.158262407681022D-08 + i -6.20240749480902D-08
VALORE di P (x( 29 )):-8.939590344630294D-08 + i 2.742108740072524D-08
VALORE di P (x( 30 )):-8.939590344630294D-08 + i -2.742108740072524D-08
VALORE di P (x( 31 )): 4.020292092148407D-05 + i 4.96542840643455D-05
VALORE di P (x( 32 )): 4.020292092148407D-05 + i -4.96542840643455D-05
VALORE di P (x( 33 )):-1.005656835482462D-05 + i -8.307242799510464D-06
VALORE di P (x( 34 )):-1.005656835482462D-05 + i 8.307242799510464D-06
VALORE di P (x( 35 )): 4.012495110328109D-05 + i 4.807826753178146D-05
VALORE di P (x( 36 )): 4.012495110328109D-05 + i -4.807826753178146D-05
VALORE di P (x( 37 )):-4.496731942534027D-08 + i -3.899152804104355D-08
VALORE di P (x( 38 )):-4.496731942534027D-08 + i 3.899152804104355D-08
VALORE di P (x( 39 )): 2.448457143196942D-09 + i -1.619874909816049D-08
VALORE di P (x( 40 )): 2.448457143196942D-09 + i 1.619874909816049D-08
VALORE di P (x( 41 )): 4.671961056927978D-06 + i -6.261709845025235D-06
VALORE di P (x( 42 )): 4.671961056927978D-06 + i 6.261709845025235D-06
VALORE di P (x( 43 )): 2.39485275846385D-08 + i 6.911045227417367D-09
VALORE di P (x( 44 )): 2.39485275846385D-08 + i -6.911045227417367D-09
VALORE di P (x( 45 )): 1.370624128256559D-08 + i 1.45358669545459D-10
VALORE di P (x( 46 )): 1.370624128256559D-08 - i 1.45358669545459D-10
VALORE di P (x( 47 )): 3.435861705692505D-05 - i 2.071833618336833D-05
VALORE di P (x( 48 )): 3.435861705692505D-05 + i 2.071833618336833D-05
VALORE di P (x( 49 )):-2.714018613413777D-06 - i 1.985598503194234D-05
VALORE di P (x( 50 )):-2.714018613413777D-06 + i 1.985598503194234D-05
VALORE di P (x( 51 )): 6.068510186637427D-06 + i 2.422088976396751D-06
VALORE di P (x( 52 )): 6.068510186637427D-06 - i 2.422088976396751D-06
VALORE di P (x( 53 )):-1.882940070287945D-05 + i 1.552181587564493D-05
VALORE di P (x( 54 )):-1.882940070287945D-05 - i 1.552181587564493D-05
VALORE di P (x( 55 )):-1.807902972161823D-06 + i 3.145529586097602D-06
VALORE di P (x( 56 )):-1.807902972161823D-06 - i 3.145529586097602D-06
VALORE di P (x( 57 )):-6.048588940201979D-06 - i 8.670785053508517D-05
VALORE di P (x( 58 )):-6.048588940201979D-06 + i 8.670785053508517D-05
VALORE di P (x( 59 )): 2.004744866189456D-07 + i 4.864269505461608D-08
VALORE di P (x( 60 )): 2.004744866189456D-07 - i 4.864269505461608D-08
VALORE di P (x( 61 )):-1.176831784628847D+86
Il tempo di calcolo delle radici con relativa verifica è risultato di 43.4 secondi.
OSSERVAZIONI: i valori delle radici in corrispondenza dei quali il polinomio P(x(k)) risulta abbastanza piccolo
(< 10 − 4 ) possono essere considerati come valori accettabili per le radici. I valori numerici molto grandi trovati ad
esempio per il valore di P(x( 61 )) sono da imputare alle limitazioni di calcolo insite nell’aritmetica(anche se a
doppia precisione) utilizzata. Il valore x(61)= 44.34324072405367 può essere accettato perché convalidato alvalore
44.34324072405369 trovato con l’algoritmo Q-D che conferma la stesso valore a meno dell’ ultima cifra decimale.
www.matematicamente.it
21
UNA APPLICAZIONE INTERESSANTE
Si voglia trovare nella ricerca degli zeri di una equazione, anche di grado abbastanza elevato, la sua radice reale
xm più grande in valore assoluto.
1° esempio:
trovare la radice reale di valore assoluto più grande della equazione di 51° Grado che presenta i seguenti
52 coefficienti:
4
158
890
838
-907
-313
-123
192
102
-189
-91
-201
-793 260
-277 -597
902 -107
-969
836
-673
262
-195
484
-811
-113 810
-63 780
232 -299
-233
-281
340
286
558
936
492
790
-67
-31
-265
714
372
-769
400
-683
298
-497
-463
346
10
l’equazione è quindi la seguente :
4 x 51 − 907 x 50 + 102 x 49 − .......................................................................... + .838 x 3 + 192 x 2 − 201x − 969 = 0
utilizzando l’algoritmo di Bairstow ed eseguendo il relativo programma il valore trovato per la radice più grande
in valore assoluto è xm = 226.64134113010716 e per calcolarlo è risultato necessario un tempo di 32.5 secondi.
Utilizzando l’algoritmo Q-D, eseguendo il relativo programma limitiamoci a considerare il primo valore calcolato
per le radici. Tale valore è xm = 226.64134113010716 che risulta uguale a quello trovato con l’algoritmo di
Bairstow, ma con un tempo di calcolo praticamente immediato ( 0.05 secondi)
Avere trovato lo stesso valore per la radice più grande della presente equazione con due algoritmi così diversi fra
loro permette di supporre che tale valore sia effettivamente valido.
2° esempio:
Trovare la radice reale xm di valore assoluto più grande dell equazione di 74° Grado che presenta i
seguenti 75 coefficienti:
1196 -56665 76472 -30765 25040 -99351
-653 11704 54390 83854 -19253 -19383
-21801 58684 -70403 -42037 37880 -63987 56280 -77681 -28731 48050
8112 -32595
–51831 -92931
7606 14634 -83317 20022 -99437
566 -62579 -59797 67232 48738
20978 -76675 30420
28730 48056
8088 36258 75798 -31929 -13191 58090 72146
44028 -27125 68654 45656 19026 25580 -90929
-9975 2472
44536 24534
-7581
15898 28978 -45085
-6795 –71577 –39709
5176 -31635 -16103
38606 -59021 69430
19024
25638 -90031
l’equazione è quindi la seguente :
1196 x 74 − 56665x 73 + 76472 x 72 − ................................................. − 7581x 3 + 19024 x 2 + 25638x − 90031 = 0
Con l’algoritmo di Bairstow si trova : xm = 46.00074915690124 con un tempo di calcolo di 57 secondi
Con l’algoritmo Q-D si trova : xm = 46.00074915690122 con un tempo di calcolo pari a 0..06 secondi
La differenza fra i due valori trovati è solo sulla cifra decimale meno significativa.
3° esempio:
Trovare la radice reale xm di valore assoluto più grande della equazione di 97° Grado che presenta i seguenti 98
coefficienti:
12
250
-63
294
144
710
818 -221
-995
4
-713 -401
-397 -515
940 -63
408 450
-515
948
-489
940
824
220
-939
-63
54
442
42
464
-63
790
-213 -693
534
872
-647
-261
152
264
-441
146
544
818
-577
782
-263
838
-835 -197
-221 524
732 -365
-277 602
796 256
68
906
736
660
904
-687
-103
358
514
-105
454 -201
698 -431
788 268
944 -59
-511 -953
-951
50
692
-319 -133 -515
-719 -389
564
-861 160 -223
48 -559 -787
444
940
772
466
-269
l’equazione è quindi la seguente:
12 x 97 + 818 x 96 − 221x 95 − ................................................................ + 534 x 3 + 872 x 2 + 146 x + 838 = 0
Con l’algoritmo di Bairstow si trova : xm = -68.42688856393865 con un tempo di calcolo di 85 secondi
Con l’algoritmo Q-D si trova : xm = -68.42688856393869 con un tempo di calcolo pari a 0..06secondi
La differenza fra i due valori trovati è solo sulla cifra decimale meno significativa.
www.matematicamente.it
22
ALLEGATO 1
REM --------------------- ALGORITMO Q-D ----------------------------------REM Programma dedicato allla risoluzione di una equazione algebrica
REM a coefficienti reali con l'algorimo QUOZIENTE-DIFFERENZA (Q-D)
CLS : DEFDBL A-Z
PRINT "Programma relativo all'algoritmo Q-D"
DIM a(200), a1(200), c(100), b(100), r(100), s(100), m(100), p(100), x(100)
DIM z(100), y(100), im(100), re(100)
INPUT "grado dell'equazione"; N: N0 = N: N1 = N + 1
PRINT "introdurre i coefficienti"
FOR k = 1 TO N + 1: PRINT "a("; k; ")"; : INPUT a(k): NEXT k
t1 = TIMER
c = 0
FOR k = 1 TO N + 1: a1(k) = a(k): NEXT k
PRINT : ' INPUT "numero di iterazioni"; it:
it = INT(7800 / N1): ' PRINT "it="; it
FOR k = 1 TO N + 1: a1(k) = a(k): NEXT k
IF it > 300 THEN it = 300
ricom: DIM d(it, N1), q(it, N1)
FOR k = 1 TO N + 1
IF a(k) = 0 THEN ss = 1: GOTO DIV
NEXT k
PRINT : q(1, 1) = -a(2) / a(1):
FOR k = 2 TO N: q(1, k) = 0: NEXT k
FOR k = 1 TO N - 1: d(1, k) = a(k + 2) / a(k + 1): NEXT k
d(1, 0) = 0: d(1, N) = 0
m = 0: p = 0
FOR h = 2 TO it
FOR k = 1 TO N
q(h, k) = d(h - 1, k) - d(h - 1, (k - 1)) + q(h - 1, k):
'PRINT "q(";h; ","; k; ")="; INT(q(h, k) * 100000) / 100000,
IF q(h, k) = 0 GOTO DIV
IF h < it - 50 GOTO nek
IF q(h, k) < 0 THEN m(k) = m(k) + 1
IF q(h, k) > 0 THEN p(k) = p(k) + 1
nek: NEXT k
FOR j = 1 TO N: d(h, j) = d(h - 1, j) * q(h, j + 1) / q(h, j): NEXT j
NEXT h
cc = 0: w = 0
FOR j = 1 TO N:
IF m(j) = 51 OR p(j) = 51 GOTO reale
IF m(j) < 51 OR p(j) < 51 THEN co = co + 1
r(co) = q(it, j) + q(it, j + 1)
s(co) = -q(it - 1, j) * q(it, j + 1)
z = r(co) ^ 2 + 4 * s(co): IF z < 0 THEN z = -z:
re(co) = r(co) / 2: im(co) = SQR(z) / 2
re(c0 + 1) = r(j) / 2: im(co + 1) = -SQR(z) / 2
j = j + 1: GOTO nex
reale: x(j) = q(it, j) + c:
w = w + 1: z(w) = x(j)
nex: NEXT j
PRINT "radici reali:"
FOR h = 1 TO w: PRINT "xr("; h; ") ="; z(h): NEXT h
't2 = TIMER - t1: PRINT t2; "secondi"
'DO: y$ = INKEY$: LOOP WHILE y$ = ""
PRINT "radici complesse:"
FOR h = 1 TO co: cc = cc + 2: IF h = 1 THEN cc = h
PRINT "xc("; cc; ") ="; r(h) / 2 + c; "+ i"; im(h):
xx(h) = r(h) / 2 + c: yy(h) = im(h)
PRINT "xc("; cc + 1; ") ="; r(h) / 2 + c; "- i"; im(h)
xx(h + 1) = r(h) / 2 + c: yy(h + 1) = -im(h):
NEXT h
't2 = TIMER - t1: PRINT t2; "secondi"
www.matematicamente.it
23
'DO: y$ = INKEY$: LOOP WHILE y$ = ""
PRINT "=========================================================="
FOR h = 1 TO co: PRINT "r("; h; ")="; r(h), "s("; h; ")="; s(h): NEXT h
k = 0
FOR h = 1 TO w STEP 2: k = k + 1
r(co + k) = z(h) + z(h + 1): PRINT "r("; co + k; ")="; r(co + k),
s(co + k) = -z(h) * z(h + 1): PRINT "s("; co + k; ")="; s(co + k)
NEXT h
PRINT "=========================================================="
t2 = TIMER - t1: PRINT t2; "secondi"
IF c = 0 OR ss = 0 THEN END
IF c <> 0 OR ss = 1 THEN END
REM --------------------DIVISIONE SINTETICA---------------------DIV: PRINT "DIVISIONE SINTETICA":
FOR k = 1 TO N + 1: a(k) = a1(k): NEXT k
INPUT "INTRODURRE UN VALORE diverso da 0"; c: cc = cc + c
ERASE c, b
N0 = N:
FOR k = 1 TO N0 + 1: b(k) = a(k): NEXT k
111 FOR k = 2 TO N0 + 1
b(k) = b(k) + c * b(k - 1)
IF k = N0 + 1 THEN c(k) = b(k)
NEXT k
IF N0 = 1 GOTO 200
N0 = N0 - 1
GOTO 111
200 : PRINT
NC = N: c(1) = a(1)
FOR k = 1 TO NC + 1
IF c(k) = 0 THEN PRINT " introdurre un altro valore :": GOTO DIV
NEXT k
FOR k = 1 TO N + 1: a(k) = c(k): PRINT a(k);
IF a(k) = 0 THEN PRINT "introdurre un altro valore":
GOTO DIV
NEXT k
ERASE q, b, d, m, p, r, s
GOTO ricom
END
www.matematicamente.it
24
ALLEGATO 2
REM ------------------- ALGORITMO di BAIRSTOW -------------------------CLS : DEFDBL A-Z
DIM a(100), a1(100), b(100), c(100), x(100), re(100), im(100)
DIM G(100), H(100), xx(100), yy(100)
PRINT "
Il programma presenta due opzioni:"
PRINT "1) se si vuole risolvere un'equazione algebrica qualsiasi digitare 111"
PRINT "
e quindi introdurre il suo grado ed i suoi coefficienti"
PRINT
PRINT "2) se si vuole invece risolvere l'equazione di uno degli esempi"
PRINT "
riportati nel listato di questo programma digitare 222 e quindi"
PRINT "
introdurre il grado dell'equazione"
PRINT "------------------------------------------------------"
101 INPUT "quale opzione scegli"; oz$
IF oz$ = "111" GOTO 130
IF oz$ = "222" GOTO 123
IF oz$ <> "111" THEN PRINT "ridigita": GOTO 101
IF oz$ <> "222" THEN PRINT "ridigita": GOTO 101
130 INPUT "introdurre il grado dell'equazione:", n: n2 = n
PRINT "introdurre i coefficienti"
FOR k = 1 TO n + 1: PRINT "a("; k; ")"; : INPUT a(k): NEXT k
'FOR k = 1 TO n + 1: PRINT "a("; k; ")"; a(k): NEXT k
555 n0 = n: n1 = (n - 1) / 2: m = -1
'FOR k = 1 TO n + 1: a1(k) = INT(a(k)): NEXT k
FOR k = 1 TO n + 1: a1(k) = a(k): NEXT k
PRINT "----------------------------------------------------------------------"
PRINT : PRINT "I VALORI TROVATI PER LE"; n; "RADICI DELL'EQUAZIONE SONO:"
PRINT : t1 = TIMER
prox: i = 0: gx = -13
r0 = -101: s0 = -101
100 r0 = r0 + 1
110 s0 = s0 + 1: IF s0 = 101 THEN s0 = -101: GOTO 100
r = r0: s = s0: ' PRINT "rin ="; r, "sin ="; s
iniz: i = i + 1:
b(1) = a(1): b(2) = a(2) + r * b(1)
FOR k = 3 TO n + 1: b(k) = a(k) + r * b(k - 1) + s * b(k - 2):
' PRINT "b("; k; ")="; b(k):
NEXT k
IF ABS(b(n + 1)) > 10 ^ 100 GOTO 110
c(1) = b(1): c(2) = b(2) + r * c(1): ' PRINT "c("; 2; ")="; c(2)
FOR k = 3 TO n + 1: c(k) = b(k) + r * c(k - 1) + s * c(k - 2)
'PRINT "c("; k; ")="; c(k)
NEXT k
IF ABS(c(n + 1)) > 10 ^ 100 GOTO 110
dr1 = -b(n) * c(n - 1) + b(n + 1) * c(n - 2): ' PRINT "dr1 ="; dr1
IF dr1 > 10 ^ 20 GOTO 110
dr2 = c(n - 1) ^ 2 - c(n) * c(n - 2): ' PRINT "dr2 ="; dr2
IF dr2 = 0 GOTO 110
dr = dr1 / dr2: ' PRINT "dr="; dr
ds1 = c(n) * b(n) - b(n + 1) * c(n - 1): ' PRINT "ds1 ="; ds1
IF ds1 > 10 ^ 20 GOTO 110
ds2 = c(n - 1) ^ 2 - c(n) * c(n - 2): ' PRINT "ds2 ="; ds2
IF ds2 = 0 GOTO 110
ds = ds1 / ds2: 'PRINT "dr="; dr: ' PRINT "ds="; ds
IF i > 35000 THEN gx = gx + 1: i = 0: GOTO 110
IF ABS(dr) <= 10 ^ gx AND ABS(ds) <= 10 ^ gx GOTO 120
r = r + dr: 'PRINT "r="; r
s = s + ds: 'PRINT "s="; s
ERASE b, c
GOTO iniz
120 : G = -12: m = m + 2:
z = r ^ 2 + 4 * s
IF z > 0 GOTO reale
IF z < 0 THEN z = -z
www.matematicamente.it
25
re(m) = r / 2: im(m) = SQR(z) / 2: xx(m) = re(m): yy(m) = im(m)
re(m + 1) = r / 2: im(m + 1) = SQR(z) / 2
xx(m + 1) = re(m + 1): yy(m + 1) = -im(m + 1)
PRINT "x("; m; ")="; re(m); "+ i"; im(m)
PRINT "x("; m + 1; ")="; re(m + 1); "- i"; im(m + 1)
GOTO nuova
reale: x(m) = (r + SQR(z)) / 2: PRINT "x("; m; ")="; x(m)
xx(m) = x(m)
x(m + 1) = (r - SQR(z)) / 2: PRINT "x("; m + 1; ")="; x(m + 1)
xx(m + 1) = x(m + 1)
nuova: ERASE a, c
FOR k = 1 TO n - 1: a(k) = b(k): NEXT k
n = n - 2
IF n = 0 GOTO tempo
IF n = 1 GOTO breal
ERASE b
GOTO prox
breal: PRINT "x("; n0; ")="; -b(2) / a(1): xx(n0) = -b(2) / a(1)
tempo: ' PRINT
PRINT "------------------- VERIFICA------------------------------------------"
'DO: y$ = INKEY$: LOOP WHILE y$ = ""
FOR j = 1 TO n2:
xa = xx(j) - INT(xx(j)): ya = yy(j) - INT(yy(j))
IF ABS(xa) < 10 ^ -15 THEN xx(j) = INT(xx(j))
IF ABS(ya) < 10 ^ -15 THEN yy(j) = INT(yy(j))
G(1) = a1(1): H(1) = 0
FOR k = 2 TO n2 + 1:
G(k) = a1(k) + xx(j) * G(k - 1) - yy(j) * H(k - 1)
H(k) = yy(j) * G(k - 1) + xx(j) * H(k - 1)
' DO: y$ = INKEY$: LOOP WHILE y$ = ""
' PRINT G(k), H(k)
NEXT k
PRINT "VALORE di P (x("; j; ")):";
'PRINT "VALORE DEL POLINOMIO ASSUNTO PER x("; j; ")"
IF yy(j) = 0 THEN PRINT G(n2 + 1): GOTO canc
IF H(n2 + 1) < 0 THEN PRINT G(n2 + 1); " - i"; ABS(H(n2 + 1)): GOTO canc
PRINT G(n2 + 1); " + i"; H(n2 + 1)
canc: ERASE G, H:
'DO: y$ = INKEY$: LOOP WHILE y$ = ""
NEXT j
PRINT : PRINT "tempo impiegato:"; TIMER - t1; "secondi"
END
123 REM ------------------ ESEMPI----------------------------------------INPUT "grado dell'equazione"; n
IF n = 3 GOTO 3
IF n = 4 GOTO 4
IF n = 5 GOTO 5
IF n = 6 GOTO 6
IF n = 7 GOTO 7
IF n = 8 GOTO 8
IF n = 9 GOTO 9
IF n = 10 GOTO 10
IF n = 11 GOTO 11
IF n = 12 GOTO 12
IF n = 13 GOTO 13
IF n = 14 GOTO 14
IF n = 15 GOTO 15
IF n = 16 GOTO 16
IF n = 17 GOTO 17
IF n = 18 GOTO 18
IF n = 19 GOTO 19
IF n = 20 GOTO 20
IF n = 21 GOTO 21
IF n = 25 GOTO 25
www.matematicamente.it
26
3 PRINT "---------EQUAZIONE DI 3ø GRADO
articolo? ok------------------"
n = 3: n2 = 3
PRINT " radici esatte : 4321 ; 5678 +- j13 "
a(1) = 1: a(2) = -15677: a(3) = 81309129#: a(4) = -139308404813#
GOTO 444
4 PRINT "---------EQUAZIONE DI 4ø GRADO ok ----------------------------"
n = 4: n2 = 4
PRINT "radici esatte' radici esatte : 2, 1573, 4092 +- j3 "
a(1) = 1: a(2) = -9759: a(3) = 29637419: a(4) = -26398291839#
a(5) = 52678112058#
GOTO 444
5 PRINT "------------ EQUAZIONE DI 5ø grado ---------------------------------"
n = 5: n2 = 5
PRINT " radici esatte: -49; -23; 13;
10+j31;
10-j31"
PRINT " coefficienti:"
a(1) = 1: a(2) = 37: a(3) = -25: a(4) = 44985: a(5) = 528984:
a(6) = -15852382
GOTO 444
6 PRINT "------------ EQUAZIONE DI 6ø GRADO ---------------------------------"
n = 6: n2 = 6
PRINT "radici esatte : 2 ;
-30000 ;
54321 +- j20 ; 1 +- j1"
a(1) = 1: a(2) = -78646: a(3) = -308173985: a(4) = 88524376712380#
a(5) = -354094423536786#: a(6) = 531140093334236#: a(7) = -354092572920000#
GOTO 444
7 PRINT "------------ EQUAZIONE DI 7ø GRADO
si-----------------------------"
n = 7: n2 = 7
a(1) = 1: a(2) = 5: a(3) = -34: a(4) = 3: a(5) = -18: a(6) = 0: a(7) = -64
a(8) = 2
GOTO 444
8 PRINT "----------- EQUAZIONE DI 8ø GRADO
si------------------------------"
n = 8: n2 = 8
PRINT "radici esatte: -5; 5; -j5;
+j5; -4-j3;-4+j3; -3-j4; 3+j4 "
PRINT " coefficienti:"
a(1) = 1: a(2) = 2: a(3) = 2: a(4) = 50: a(5) = 0: a(6) = -1250: a(7) = -1250
a(8) = -31250: a(9) = -390625
GOTO 444
9 PRINT "-------------- EQUAZIONE DI 9ø GRADO
radici doppie --------------"
n = 9: n2 = 9
PRINT "radici esatte: -12; -8; 1; 2; 3; 2 - i; 2 + i; 2 - i10; 2 + i10"
a(1) = 1#: a(2) = 6#: a(3) = 0#: a(4) = 1056#: a(5) = -3377#: a(6) = -40366#
a(7) = 272680#: a(8) = -668336#: a(9) = 737856#: a(10) = -299520#
GOTO 444
10 PRINT "----------- EQUAZIONE DI 10ø grado con radici doppie -------------"
n = 10: n2 = 10
PRINT "radici esatte: 1, 1, 2, 2, 3, 4, 5, 6, 7, 8"
a(1) = 1: a(2) = -39: a(3) = 656: a(4) = -6246: a(5) = 37149
a(6) = -143703: a(7) = 364874: a(8) = -598524: a(9) = 605320
a(10) = -340128: a(11) = 80640
GOTO 444
11 PRINT "------------ EQUAZIONE DI 11ø GRADO (difficile in QD) si----------"
n = 11: n2 = 11
PRINT "con le seguenti radici esatte:"
PRINT " -2; - 6; 2 ; 43; 5+j3 ; 5-i3;
3+i4; 3-i4;
5+i7; 5-i7"
a(1) = 1: a(2) = -68: a(3) = 1368: a(4) = -14194: a(5) = 68175: a(6) = 81350
a(7) = -3148148: a(8) = 18650104: a(9) = -47481556: a(10) = 6164808
a(11) = 235582160: a(12) = -324564000
GOTO 444
www.matematicamente.it
27
12 PRINT " ---------EQUAZIONE DI 12ø GRADO
si-----------------------"
n = 12: n2 = 12
PRINT "REM radici:"
a(1) = 1#: a(2) = -2.5#: a(3) = 4#: a(4) = 7.15#: a(5) = 8#:
a(6) = -6.2#:
a(7) = 4.5#: a(8) = -12#: a(9) = 3.8#: a(10) = 56#: a(11) = -12#:
a(12) = 31#
a(13) = -47#
GOTO 444
13 PRINT " ---------EQUAZIONE DI 13ø grado ---------------------------"
n = 13: n2 = 13
PRINT "radici esatte: x = -3.5; 2; 5; 26; -14; 4+i3; 4-i3; -34+i7;"
PRINT "-34-j7; 11 + j25; 11 + j25; -10+j18; -10-j18"
a(1) = 1: a(2) = 42.5: a(3) = 220.5: a(4) = 10038: a(5) = 302457
a(6) = -12242625.5#: a(7) = -365833767.5#: a(8) = -10866794763#:
a(9) = -69303702473#: a(10) = -1058279627462#: a(11) = -18652829413988#
a(12) = 109451147148120#: a(13) = 314818635387200#: a(14) = -898323761608000#
GOTO 444
14 PRINT " ---------EQUAZIONE DI 14ø grado ---------------------------"
n = 14: n2 = 14
PRINT "radici esatte:"
PRINT " -1; +1;, -2; +2; -3; +3; -4; +4; -5; +5; -6; +6 ; -7; +7"
a(1) = 1: a(2) = 0: a(3) = -140: a(4) = 0: a(5) = 7462: a(6) = 0:
a(7) = -191620: a(8) = 0: a(9) = 2475473: a(10) = 0: a(11) = -15291640:
a(12) = 0: a(13) = 38402064: a(14) = 0: a(15) = -25401600
GOTO 444
15 PRINT " ---------- EQUAZIONE DI 15ø GRADO -----------------------------"
n = 15: n2 = 15
PRINT "con le seguenti radici esatte:"
PRINT "57;
-2;
1; -1;
-3; 5; 7; -9; -8; 4; -10;"
PRINT "-4+j13 ;
-4-j13;
-1+j5;
1-j5"
PRINT "coefficienti:"
a(1) = 1: a(2) = -35: a(3) = -1010: a(4) = -12768: a(5) = -82208:
a(6) = 805684: a(7) = 10193442: a(8) = -6666118: a(9) = -90814849:
a(10) = 357200391: a(11) = -7020420112#: a(12) = -14142748954#
a(13) = 94215875936#: a(14) = 179609437800#: a(15) = -87114751200#
a(16) = -165818016000#
GOTO 444
16 PRINT " ---------EQUAZIONE DI 16ø grado ---------------------------"
n = 16: n2 = 16
PRINT "con le seguenti radici esatte"
PRINT "x= 1; 2; 3; 4; 1+-j1; 1+-j2; 1+-j3; 2+-j1; 2+-j2; 3+-j1"
a(1) = 1: a(2) = -30: a(3) = 435: a(4) = -4060: a(5) = 27337: a(6) = -140790
a(7) = 573105: a(8) = -1877980: a(9) = 4997798: a(10) = -10819380
a(11) = 18959460: a(12) = -26570960: a(13) = 29153864: a(14) = -24178800
a(15) = 14280000: a(16) = -5360000: a(17) = 960000
GOTO 444
17 PRINT " ---------EQUAZIONE DI 17ø grado ---------------------------"
n = 17: n2 = 17
PRINT "con le seguenti radici esatte:"
PRINT "1/9; 1/8; 1/7; 1/6; 1/5; 1/4; 1/3; 1/2; 1; 2; 3; 4; 5; 6; 7; 8; 9"
a(1) = 362880: a(2) = -16993296: a(3) = 346080924: a(4) = -4029751376#
a(5) = 29684981989#: a(6) = -144726016757#: a(7) = 475641755428#:
a(8) = -1057047567272#: a(9) = 1580553850078#: a(10) = -1580553850078#
a(11) = 1057047567272#: a(12) = -475641755428#: a(13) = 144726016757#:
a(14) = -29684981989#: a(15) = 4029751376#: a(16) = -346080924:
a(17) = 16993296: a(18) = -362880
GOTO 444
www.matematicamente.it
28
18 PRINT " ---------EQUAZIONE DI 18ø grado ---------------------------"
n = 18: n2 = 18
PRINT "con le seguenti radici esatte"
PRINT "-10; -9; -8; -7; -6; -5; -4; -3; -2; -1; 1; 2; 3; 4; 5; 6; 7; 8"
a(1) = 1: a(2) = 19: a(3) = -114: a(4) = -3876: a(5) = -1938: a(6) = 312018
a(7) = 808792: a(8) = -12714572: a(9) = -45487767: a(10) = 280043907
a(11) = 1152801858: a(12) = -3300716328#: a(13) = -14617905056#:
a(14) = 19324273456#: a(15) = 89052898464#: a(16) = -47179540224#
a(17) = -221856330240#: a(18) = 30888345600#: a(19) = 146313216000#
GOTO 444
19 PRINT " ---------EQUAZIONE DI 19ø grado ---------------------------"
n = 19: n2 = 19
a(1) = 26: a(2) = 596: a(3) = 676: a(4) = -479: a(5) = -87: a(6) = -463
a(7) = 158: a(8) = -305: a(9) = 268: a(10) = -725: a(11) = 378#: a(12) = -641
a(13) = -559: a(14) = -787: a(15) = -269: a(16) = 712: a(17) = -403
a(18) = -479: a(19) = 84: a(20) = 900
GOTO 444
20 PRINT " ---------EQUAZIONE DI 20ø grado ---------------------------"
n = 20: n2 = 20
a(1) = 72: a(2) = 0: a(3) = 0: a(4) = 0: a(5) = 0: a(6) = 0
a(7) = 66: a(8) = 0: a(9) = 0: a(10) = 0: a(11) = -29: a(12) = 0:
a(13) = 0: a(14) = 0: a(15) = -91: a(16) = 0: a(17) = 0: a(18) = 0
a(19) = -53: a(20) = 0: a(21) = -19
GOTO 444
21 PRINT " ---------EQUAZIONE DI 21ø grado ---------------------------"
n = 21: n2 = 21
PRINT "le radici esatte sono le radici 22-me dell'unit…,escluso il valore 1"
a(1) = 1: a(2) = 1: a(3) = 1: a(4) = 1: a(5) = 1: a(6) = 1: a(7) = 1
a(8) = 1: a(9) = 1: a(10) = 1: a(11) = 1: a(12) = 1: a(13) = 1: a(14) = 1
a(15) = 1: a(16) = 1: a(17) = 1: a(18) = 1: a(19) = 1: a(20) = 1: a(21) = 1
a(22) = 1
GOTO 444
25 PRINT " ---------EQUAZIONE DI 25ø grado ---------------------------"
PRINT " radici esatte: vedi Durand , pag.256, fig.17-VIII"
n = 25: n2 = 25
a(1) = 1: a(2) = -55: a(3) = 1485: a(4) = -26235: a(5) = 340795
a(6) = -3465825: a(7) = 28675185: a(8) = -197951435: a(9) = 1159983185
a(10) = -5839433275#: a(11) = 25460591535#: a(12) = -96663948285#:
a(13) = 320541965665#: a(14) = -929393064675#: a(15) = 2354425719435#
a(16) = -5197895304185#: a(17) = 9955509155930#: a(18) = -16430443707250#
a(19) = 23143638078360#: a(20) = -27457678009860#: a(21) = 26937650394424#
a(22) = -21288811528920#: a(23) = 13034405334000#: a(24) = -5805523160000#
a(25) = 1674066160000#: a(26) = -234436800000#
GOTO 444
REM =========================================================
444 PRINT "coefficienti:"
FOR k = 1 TO n + 1: PRINT "a("; k; ")="; a(k): NEXT k
GOTO 555
END
www.matematicamente.it
29
ALLEGATO 3
REM --------------------- ALGORITMO DI HORNER -----------------------------REM per il calcolo del valore numerico di un polinomio P(x) relativo
REM alla equazione algebrica P(x)=0 di grado n quando x assume un
REM un valore prefissato x = xo reale ovvero x = (xo + iyo) complesso
REM ------------------------------------------------------------------------CLS : DEFDBL A-Z: DIM a(100), G(100), H(100)
REM il grado n del polinomio non deve essere maggiore di 100
INPUT "grado del polinomio P(x)"; n
PRINT "introdurre i coefficienti";
PRINT : FOR k = 1 TO n + 1: PRINT "a("; k; ")"; : INPUT a(k): NEXT k
PRINT "introdurre per xo e yo il valore desiderato"
INPUT "xo"; xo
INPUT "yo"; yo
G(1) = a(1): H(1) = 0
FOR k = 2 TO n + 1
G(k) = a(k) + xo * G(k - 1) - yo * H(k - 1)
H(k) = yo * G(k - 1) + xo * H(k - 1)
PRINT G(k), H(k)
NEXT k
PRINT "====================================="
PRINT "valore del polinomio ";
'PRINT " P(x) = "; G(n + 1); "+ i"; H(n + 1): END
IF yo = 0 THEN PRINT "per x ="; xo; ": P(x)=";
IF yo > 0 THEN PRINT "per x ="; xo; "+ i"; yo; ":"
IF yo < 0 THEN PRINT "per x ="; xo; "- i"; ABS(yo); ":"
IF H(n + 1) = 0 THEN PRINT "P(x) ="; G(n + 1): END
IF G(n + 1) = 0 THEN PRINT "P(iyo) = "; "+ i"; H(n + 1): END
IF H(n + 1) < 0 THEN PRINT "P(x) = "; G(n + 1); "- i"; ABS(H(n + 1)): END
PRINT " P(x) = "; G(n + 1); "+ i"; H(n + 1)
END
www.matematicamente.it
30
Scarica