Una procedura per tutte le equazioni

Questo articolo è dedicato a chi abbia la necessità di risolvere equazioni in modo semplice e, soprattutto, veloce. Esistono, in verità, molti algoritmi per lo scopo, ma la maggior parte di essi sono complessi da implementare su computer, specie da programmatori principianti. I due algoritmi proposti, invece, oltre ad essere molto semplici, hanno anche la caratteristica di essere universali, ossia di poter risolvere (quasi) tutti i tipi di equazioni, quindi anche equazioni logaritmiche, trigonometriche, eccetera.

La teoria

I due metodi ci basano sul fatto che qualunque equazione può essere scritta nella forma f(x) = 0, in cui f(x) rappresenta una funzione della variabile indipendente x.Di questa funzione è possibile tracciare, in un sistema di assi cartesiani, un grafico che ne rappresenta l’andamento al variare della variabile indipendente. È chiaro che, nei punti in cui il grafico interseca l’asse delle ascisse [fig. 1], risulta verificata la relazione f(x) = 0 dal momento che tali punti corrispondono agii zeri (cioè alle soluzioni) dell’equazione di partenza.

II primo dei due metodi è detto delle Secanti, esemplificato in figura 2. Se consideriamo un intervallo [a, b] in cui la funzione sia definita e, ad esempio, nel punto A sia positiva e nel punto B negativa (o viceversa), unendo con una retta r (detta retta secante) i punti A[a, f(a)] e B[b, f(b)], troveremo un punto C(0, c) che risulta più vicino allo zero della funzione (punto P) di quanto non lo siano i punti A e B. Se ora ripetiamo l’algoritmo sostituendo il punto D[c, f(c)] al punto B, troveremo un punto E ancora più vicino a P. Proseguendo in questo modo raggiungeremo il tanto desiderato zero, anche se con un valore approssimato.

Tangenti

Il secondo metodo, detto delle Tangenti (figura 3), è del tutto analogo a quello già descritto. Tracciando la tangente al grafico di f(x) in un punto A, troveremo un punto Ta, più vicino a zero (P) di quanto non lo siano A’ e B’. Ripetendo l’algoritmo nel modo già visto per le secanti, si otterrà lo zero, anche in questo caso in modo approssimato. Molti avranno capito che i due metodi sono complementari, in quanto uno approssima per difetto e l’altro per eccesso.

L’implementazione

La prima parte è comune ai due programmi, e si compone di una fase dichiarativa, nella quale vengono dichiarate le funzioni usate dal programma (linea 100 per il programma secanti e le linee 100, 110, 120 per tangenti). La funzione DEFinita in linea 100, corrispondente all’equazione da risolvere, rappresenta una parabola non simmetrica rispetto all’asse y. Le tre linee successive richiedono gli estremi dell’intervallo di ricerca e la precisione del risultato.

Per quanto riguarda il metodo delle secanti sarà sufficiente ricorrere ad alcune formule di geometria analitica. Risulta necessario tracciare una retta passante per i punti A e B che, come tutte le rette, e individuata dall’equazione y = mx + n. Si determinano i parametri m ed n risolvendo un sistema di due equazioni in due incognite (linee 140 -150). Per trovare il punto C (intersezione della retta con l’asse delle ascisse), si risolve l’equazione di primo grado mx +n=0 (linea 160). Le linee 170 e 180 sostituiscono al punto A (oppure B) il nuovo punto trovato, mentre la 190 controlla se il risultato è sufficientemente preciso in base al valore di precisione richiesto; in caso contrario ripete il ciclo.

L’implementazione del metodo delle tangenti è leggermente più complessa in quanto dobbiamo scomodare l’analisi matematica, in particolare il concetto di derivata di una funzione. Senza entrare in lunghi (e noiosi) discorsi teorici, vi basti sapere che la derivazione è un’operazione utile per determinare il coefficiente angolare (cioè il parametro m) della retta tangente ad una curva in un certo punto, ed è definita come il limite, per h tendente a 0, di (f (x+h)- f (x)) / h. Se alla funzione così ottenuta applichiamo nuovamente l’operazione di derivazione, perveniamo alla derivata seconda della funzione di partenza. Le derivate prima e seconda cono definite alle linee 110 – 120. Esistono altre applicazioni delle derivate nello studio della crescenza e della concavità delle funzioni ma questo argomento, almeno per i nostri scopi, non è importante. Nel programma, la derivata prima determina il coefficiente angolare della tangente, mentre con la derivata seconda si individua l’estremo (A oppure B) per il quale far passare la tangente: questa infatti deve passare per il punto in cui la funzione ha lo stesso segno della derivata seconda. In moltissimi casi, infatti, si potrà notare che, facendo passare la tangente per un punto piuttosto che un altro, ci si allontana dallo zero invece di avvicinarsi (punto H, figura 3). La parte finale del programma è simile a quella del primo listato.

Uso pratico

Dopo aver caricato il programma, bisogna modificare la linea 100 per definire la funzione corrispondente all’equazione da risolvere. Ad esempio, per risolvere l’equazione X^4 – 5*X^2 – 3 = 0 si dovrà modificare la linea come 100 DEF FNF (X) = X^4 - 5*X^2 - 3

Dopo aver dato il Run, basterà inserire i valori dell’intervallo di ricerca e la precisione desiderata. Per evitare di perdere tempo in tentativi inutili, definite a priori gli intervalli da studiare tracciando, almeno a grandi linee, il grafico della funzione, magari con l’aiuto di un programma per grafici matematici. La parabola presente in riga 100, risolta con i metodi tradizionali, ammette due soluzioni per x = 1 ed x = 3. Vi suggeriamo di provare un’altra
equazione: Cos(x)- Log(x)+ 5 = 0 impossibile da risolvere con metodi esatti, che presenta una delle sue soluzioni compresa tra 149 e 150. Per quanto riguarda la precisione, generalmente le-7 (10^-7) è un valore idoneo. A volte è possibile stabilire valori più piccoli, ma in molti casi questi non potranno essere raggiunti a causa del limitato numero di cifre utilizzabili dal computer.

Controindicazioni

II metodo delle secanti si può usare soltanto se i valori della funzione, ai due estremi dell’intervallo, sono di segno opposto. In caso contrario la secante incontrerebbe l’asse delle ascisse al di fuori dell’intervallo, rendendo impossibile l’applicazione corretta dell’algoritmo. Col metodo delle tangenti l’inconveniente è eliminato, ma alcuni problemi possono insorgere nel caso di funzioni particolari. Per questo motivo, quindi, si consiglia di studiare attentamente il grafico della funzione prima di decidere il metodo da utilizzare.

Miglioramenti

Grazie alla loro semplicità, i listati pubblicati si prestano a personalizzazioni da parte dell’utente. Ad esempio, si potrebbe modificare il controllo della precisione del risultato in modo da fissare un numero minimo di cifre decimali esatte, invece che applicare il controllo al valore della funzione. Se provate ad aggiungere una linea che stampi, ad ogni ciclo, il valore ottenuto di X, vedrete che dopo alcuni passaggi questo valore si “stabilizza”, ed è in base a
questa proprietà che ci può effettuare il controllo.

Un’altra possibilità è quella di unificare i due programmi, utilizzandoli come subroutine, al fine di risolvere la stessa equazione con entrambi i metodi; ciò allo scopo di confrontare i risultati che saranno comunque sempre molto simili (se non identici) qualunque sia il metodo scelto.

Si suggerisce anche la possibilità di inserire la funzione direttamente da programma invece di modificare, ogni volta, la riga 100. Su sistemi MS-DOS, e precisamente con il Gw-Basic, si può leggere la funzione come se fosse una stringa, salvarla in un file ASCII e usare il comando Chain Merge per usarla nell’istruzione DEF di linea 100.

Le definizioni delle derivate in linea ll0 – 120 determinano valori approssimati, ma chi conosce l’analisi matematica può sostituirle con la definizione delle derivate vere e proprie. Ad esempio, le derivate della funzione Fnf (x) = Cos(x)- Log(x) + 5 sono Fnf1 (x) = -sin (x) – 1/x (derivata prima) e Fnf2 (x)= -cos(x)+ 1/(x^2) (derivata seconda).

L’ideale sarebbe inserire anche una routine che tracci il grafico della funzione. Giunti a questo punto, però, è più corretto inserire le routine pubblicate all’interno di procedure matematiche molto più complesse e complete. Comunque, tentar non nuoce!

Anche su disco

Nonostante la brevità dei listati, questi sono inclusi nel dischetto Computer Club Disco presente questo mese in tutte Le edicole. Grazie alla universalità delle procedure, li troverete nella sezione “comune” ad Amiga ed Ms-DOS. Coloro che, come suggerito nello stesso articolo, ritengano di aver apportato sostanziali modifiche ai listati pubblicati, sono pregati di telefonare in Redazione (02/–.–.–.–) il giovedì pomeriggio per concordarne la pubblicazione che, se meritevole, sarà adeguatamente compensata.

Figure

Fig. 1:

Figura 1

Fig. 2:

Figura 2

Fig. 3:

Figura 3

Listati

N.B.: il programma è stato scritto nel 1991, in un linguaggio all’epoca già obsoleto. È fornito al solo scopo di mostrare una possibile implementazione dell’algoritmo.

Listato 1

10 PRINT "**  Soluzione  di  equazioni **"
20 PRINT "**  col metodo della secanti *""
30 PRINT "** Vers. C/64, Amiga, Ms-dos **"
40 REM parabola
100 DEF fnf (x)  =  (1/2) * x^2 - 2*x + 3/2
105 PRINT "(L'equazione e' in riga 100)"
110 INPUT "Estremo sinistro "; a
120 INPUT "Estremo destro "; b
130 INPUT "precisione "; ep
135 REM applicazione metodo secanti
140 m = (fnf(a) - fnf(b)) / (a - b)
150 n = fnf(a) - m * a
160 x = -n / m
170 IF SGN(fnf(x)) = SGN (fnf(a)) THEN a = x: GOTO 190
180 b = x
190 IF ABC(fnf(x)) > ep THEN 140
200 PRINT " x="; x
210 END

Listato 2

10 PRINT "** Soluzione  di   equazioni **"
20 PRINT "** col metodo delle tangenti **"
30 PRINT "**  by   Tarizzo   Fabrizio  **"
40 REM    **  per Computer Club 1991   **
50 REM    **  versione     universale  **
60 REM    **   C/64, Amigal Ms-dos     **
90 h = .00001
95 REM equazione di una parabola
100 DEF fnf (x) = (1/2) * x^2 - 2*x + 3/2
110 DEF fnf1 (x) = (fnf(x + h) - fnf(x)) / h
120 DEF fnf2 (x) = (fnf1(x + h) - fnf1(x)) / h
125 PRINT "(La funzione e' in riga 100)"
130 INPUT "Estremo sinistro "; a
140 INPUT "Estremo destro "; b
150 INPUT "Precisione "; ep
155 REM applicazione metodo tangenti
160 x = b
170 IF SGN(fnf(a)) = SGN(fnf2(a)) THEN x = a
180 m = fnf1(x)
190 n = fnf(x) - m
200 x = -n / m
210 IF ABS(fnf(x)) > ep THEN 180
220 PRINT " x="; x
230 END

Copyright © Fabrizio Tarizzo

Quest'opera è stata rilasciata sotto la licenza Creative Commons Attribuzione-Condividi allo stesso modo 3.0 Italia. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/it/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.