Dopo aver visto alcuni esempi come COBOL per l'analisi numerica: calcolo integrali definiti e COBOL: equazione diffusione - metodo numerico FTCS, vediamo un altro caso interessante ovvero il metodo di Newton-Raphson, celebre metodo numerico di iterazione punto fisso (trovare le radici di una funzione, ovviamente in genere non lineare, f(x)=0), risolto in... COBOL! Ovviamente nessuno fa uso del linguaggio COBOL per situazioni di questo tipo, ambito scientifico/matematico, essendo molto macchinoso e richiede la valutazione di un'operazione alla volta. Per questo motivo, "Just for Fun", noi lo usiamo! 😀
Nel caso in esame è stata considerata un'equazione semplice ovvero:
f(x)=x2-1
La cui derivata prima df/dx è pari a 2x.
Le radici in questo caso sono due (-1 e +1), il metodo numerico arriva a convergenza della più vicina fra le soluzioni, quando esse sono multiple. In questo caso abbiamo preso come dato di partenza x0=3.5 e la convergenza arriva alla soluzione x=1.
Il codice è compreso della formattazione (000100, 000200 ecc a inizio di ogni riga). Questo perché i moderni compilatori non lo rendono necessario, mentre alcuni come GnuCOBOL su Linux sì. Nel caso di questo compilatore, i comandi (compilazione ed esecuzione) sono:
cobc -x newton.cbl
./newton
Si riporta ora tutto il codice del programma.
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. NEWTON-RAPHSON.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 N PIC 99 VALUE 10.
000600 01 i PIC 99 VALUE 0.
000700 01 X PIC 9(3)V9(6).
000800 01 X0 PIC 9(3)V9(6) VALUE 3.5.
000900 01 F PIC 9(6)V9(6).
001000 01 dF PIC 9(6)V9(6).
001100 01 TEMP PIC 9(6)V9(6).
001200 PROCEDURE DIVISION.
001300 SET X TO X0.
001400 PERFORM N TIMES
001500 DISPLAY "X[" i "]=" X
001600 MULTIPLY X BY X GIVING F
001700 ADD -1 TO F GIVING F
001800 MULTIPLY 2 BY X GIVING dF
001900 DIVIDE dF INTO F GIVING TEMP
002000 SUBTRACT TEMP FROM X GIVING X
002100 ADD 1 TO i
002200 END-PERFORM.
002300 STOP RUN.
Infine uno screenshot del terminale, che mostra a video i risultati (10 iterazioni, convergenza che è stata anche rapida). Ovviamente questo codice può essere modificato a piacere, per applicare il metodo di Netwon-Raphson alla funzione f(x)=0 desiderata (occorre solo aggiustare le varie operazioni e il calcolo di df/dx), così come variare il punto di partenza x0 e il numero di iterazioni N.