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