Abbiamo già visto COBOL per l'analisi numerica - integrali definiti e altri esempi come COBOL - calcolo potere calorifico superiore, irraggiamento termico in COBOL. Vediamo ora la risoluzione numerica dell'equazione della diffusione (caso 1D) tramite metodo numerico FTCS (Forward in Time, Central in Space).
Come sempre: perché usare COBOL? La risposta è semplicemente perché è scomodo, macchinoso, e richiedendo la valutazione di un'operazione matematica alla volta... Assolutamente controindicato per il calcolo scientifico/matematico. Per questo noi lo usiamo 😄
Avevamo già trattato l'equazione della diffusione con Python - Matplotlib, sicuramente più indicato e con possibilità di mostrare il grafico.
Questa volta, anziché usare il compilatore online tutorialspoint.com - COBOL compiler, usiamo GnuCOBOL su Linux, la cui compilazione funziona se e solo se a inizio riga è presente l'intestazione, cosa che invece i moderni compilatori hanno risolto e non la rendono necessaria (scriverla a mano per ogni riga, immaginate che gioia 😀). Giusto per mostrare un codice ancora più old-style, ancora più "macchinoso".
Avendo creato il proprio file, in questo caso diffusion.cbl, da terminale prima si compila con gnucobol e poi si esegue:
cobc -x diffusion.cbl
sudo ./diffusion
Il caso in esame prende dei dati di esempio, che eventualmente si possono cambiare. È interessante vedere quanto sia "macchinoso" il codice, avendo dovuto anche creare una variabile di appoggio (TEMP). Inizialmente volevo snellire l'operazione di programmazione grazie a ChatGPT, noto tool di tendenza in ambito IA, il caso risultava forse un po' troppo complesso da interpretare (anche comprensibile!) e infine ho fatto prima a scriverlo a mano.
Riportiamo finalmente il codice!
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. FTCS.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 i PIC 999 VALUE 0.
000600 01 D PIC 9V9999 VALUE 0.1.
000700 01 TEMP PIC 999V999.
000800 01 ARRAY.
000900 05 V PIC 99V999 OCCURS 20 TIMES.
001000 PROCEDURE DIVISION.
001100 PERFORM 20 TIMES
001200 COMPUTE V(i) = 0
001300 ADD 1 TO i
001400 END-PERFORM.
001500 SET V(10) TO 50.
001600 PERFORM 20 TIMES
001700 IF i>1 AND i<20
001800 MULTIPLY D BY V(i - 1) GIVING TEMP
001900 ADD V(i) TO TEMP GIVING V(i)
002000 MULTIPLY -2 BY D GIVING TEMP
002100 MULTIPLY TEMP BY V(i) GIVING TEMP
002200 ADD TEMP TO V(i) GIVING V(i)
002300 MULTIPLY D BY V(i + 1) GIVING TEMP
002400 ADD V(i) TO TEMP GIVING V(i)
002500 END-IF
002600 DISPLAY V(i)
002700 ADD 1 TO i
002800 END-PERFORM.
002900 STOP RUN.