NSA - Non Solo Amiga

SOFTWARE => Linguaggi di programmazione e scripting => Topic aperto da: TheKaneB - 05 Giugno 2011, 16:49:18

Titolo: [Commodore Basic] Calcolo degli integrali con metodo Simpson
Inserito da: TheKaneB - 05 Giugno 2011, 16:49:18
Ecco un programmino che ho fatto in questi giorni per il Commodore 16.

Funziona su Commodore 16 e (credo) su Plus 4 e Commodore 128 (in modalità C128).

Qui il codice:

Codice: [Seleziona]
10 DEF FN F(X) = 3*X + 5*X*X - SIN(X)
20 PRINT "INTEGRAZIONE CON METODO DI SIMPSON"
30 PRINT "ESTREMO A"
40 INPUT A
50 PRINT "ESTREMO B"
60 INPUT B
70 PRINT "SUDDIVISIONI"
80 INPUT N%
90 PRINT "ATTENDERE PREGO..."
100 N% = N% * 2
110 H = (B-A) / N%
120 I% = 1
130 S = FNF(A)
140 DO WHILE I% < N%
150 X = A + H * I%
160 S = S + 4 * FNF(X)
170 I% = I% + 2
180 LOOP
190 I% = 2 : N1% = N% - 1
200 DO WHILE I% < N1%
210 X = A + H * I%
220 S = S + 2 * FNF(X)
230 I% = I% + 2
240 LOOP
250 S = S + FNF(B)
260 F = H * S / 3
270 PRINT "INTEGRALE DA ";A;" A ";B;" = ";F

Il funzionamento è molto semplice:
Innanzitutto accendere la macchina o digitare NEW per cancellare la memoria programma.
Inserire tutto il codice. Bisogna inserire la propria funzione da integrare nella definizione della riga 10, in questo caso ho inserito la funzione f(x) = 3x + 5x^2 - sin(x).
Poi bisogna lanciare il programma con RUN.
Inserire l'estremo di partenza A per l'integrazione e battere RETURN.
Inserire l'estremo di fine B per l'integrazione e battere RETURN.
Inserire il numero di suddivisioni da usare nell'algoritmo per trovare l'integrale approssimato. Un numero maggiore di suddivisioni aumenta il tempo di esecuzione (complessità O(N) ) ma aumenta di molto la precisione. Per funzioni polinomiali basta una decina di suddivisioni per avere risultati molto accurati, mentre per funzioni complicate con variazioni molto rapide (esponenziali, trigonometriche e funzioni composte) bisogna fare qualche centinaio di suddivisioni.
Battere RETURN e attendere il risultato.

Note:
le variabili A, B, S ecc sono variabili "double" a 40 bit
I%, N% sono variabili intere a 16 bit
nella riga 200 potevo fare DO WHILE I% < N% - 1, ma l'interprete Basic del C16 non accetta espressioni nel DO WHILE, quindi ho usato una variabile intermedia chiamata N1%.
Per approfondimenti sugli integrali e sul metodo di integrazione di Simpson vedi http://numerici.liceofoscarini.it/quadr ... mpson.html (http://numerici.liceofoscarini.it/quadrature/javasimpson.html)

Enjoy  :dance:
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: AmigaCori - 05 Giugno 2011, 17:13:39
:techie-computer:

Mi quasi pento di non avere una macchina C= non Amiga :(
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: TheKaneB - 05 Giugno 2011, 23:01:53
puoi usare l'emulatore VICE... emula tutte le macchine commodore dal PET2001 al C128 (inclusa la parte Z80 e l'uscita video a 80 colonne)  :dance:
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: rebraist - 06 Giugno 2011, 18:19:21
Non conosco nè il basic del c16 nè quello del 128.
Sicuro in quello del 64 non c'era l'istruzione loop-do-while.
Ma il 128 gestiva dati da 40bit? :o  spettacolare.
p.s. complimenti per la scelta di realizzare il prg in questione per una macchina retro-alternativa!
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: AmigaCori - 06 Giugno 2011, 18:22:09
Citazione da: "TheKaneB"
puoi usare l'emulatore VICE... emula tutte le macchine commodore dal PET2001 al C128 (inclusa la parte Z80 e l'uscita video a 80 colonne)  :dance:


Mmmm io sono tipo hardware, mi piace "il vecchio" perche' e' diverso da nuovo  :mrgreen:  il rumore dei tasti, le plastiche ingiallite, smontare e vedere la componentistica pensando che quando gira un programma i "bit" passano per quei transistor, resistenze...di 20-30-40 anni fa.
 


:drool:
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: rebraist - 06 Giugno 2011, 18:31:09
Citazione da: "AmigaCori"
Mmmm io sono tipo hardware, mi piace "il vecchio" perche' e' diverso da nuovo  :mrgreen:  il rumore dei tasti, le plastiche ingiallite, smontare e vedere la componentistica pensando che quando gira un programma i "bit" passano per quei transistor, resistenze...di 20-30-40 anni fa.
 :drool:
molto fisica come cosa ma anche molto bella.
qualche sera fa ho riacceso il vecchio 64.
l'interruttore del monitor della philips a fosfori verdi non regge più se non con un pezzetto di carta infilato dentro per tenerlo.
ho preso mio figlio di 3 anni gli ho acceso il computer, ho messo un floppy a caso di quelli che ho e gli ho detto: "adesso ti faccio vedere un bel gioco!". I dischi fanno rumore, la luce del 1541 lampeggia come a dire: ce la faccio. non ce la faccio.
Il piccolo la prima cosa che mi ha detto abbastanza schifato da sto coso impolverato: "papà perchè non ha il mouse?".
"Il mouse non c'è perchè questo computer quando papà ha avuto questo computer il mouse non c'era proprio! però prendi qua e vedi questo gioco".Gli ho piazzato in mano un joystick e il gioco caricato era superman. Morale ci sono voluti 3 secondi per capire come far funzionare il joystick e 0 per spiegargli come funzionasse il gioco. Non si è staccato dal 64 per una buona mezzora. Poi è arrivata l'ora di cena ;)
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: TheKaneB - 06 Giugno 2011, 18:36:25
Citazione da: "rebraist"
Non conosco nè il basic del c16 nè quello del 128.
Sicuro in quello del 64 non c'era l'istruzione loop-do-while.
Assolutamente sicuro... dovevi fare IF condizione GOTO riga. Dovevi simulare in questo modo anche eventuali FOR che non avessero un numero fisso di iterazioni, cioè non potevi fare FOR I = 0 TO N, ma soltanto FOR I = 0 TO 20 (per esempio).
Non avendo nemmeno l'ELSE, dovevi giocare opportunamente con i GOTO per simulare WHILE...LOOP e FOR con numero variabile di iterazioni
Citazione
Ma il 128 gestiva dati da 40bit? :o  spettacolare.
numeri double con 1 byte per l'esponente e 4 per la mantissa (in pratica sono 8 cifre dopo la virgola) :-)
Sul Basic dell'Olivetti M10 la precisione è ancora più alta (credo 48 o 56 bit) perchè mi da 13 cifre dopo la virgola, però non avendo il DEF FN devo modificare il programma usando il GOSUB.
Citazione
p.s. complimenti per la scelta di realizzare il prg in questione per una macchina retro-alternativa!
Fa parte dei miei studi :-)
Sono convinto che studiare computer semplici nei minimi dettagli (compresi gli schemi elettrici) rafforzi la mia capacità di programmatore :-)
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: AmigaCori - 06 Giugno 2011, 18:44:53
Citazione da: "TheKaneB"
Fa parte dei miei studi :-)
Sono convinto che studiare computer semplici nei minimi dettagli (compresi gli schemi elettrici) rafforzi la mia capacità di programmatore :-)

Condivido e credo che la cosa valga per qualsiasi campo. :)
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: cdimauro - 06 Giugno 2011, 20:26:08
Citazione da: "TheKaneB"
Citazione da: "rebraist"
Non conosco nè il basic del c16 nè quello del 128.
Sicuro in quello del 64 non c'era l'istruzione loop-do-while.
Assolutamente sicuro... dovevi fare IF condizione GOTO riga. Dovevi simulare in questo modo anche eventuali FOR che non avessero un numero fisso di iterazioni, cioè non potevi fare FOR I = 0 TO N, ma soltanto FOR I = 0 TO 20 (per esempio).
E' passato ormai troppo tempo, ma se non ricordo male il FOR dovrebbe accettare due espressioni per l'inizio e la fine del ciclo.
Titolo: Re: [Commodore Basic] Calcolo degli integrali con metodo Sim
Inserito da: TheKaneB - 06 Giugno 2011, 20:35:10
sul C128 si mentre sul C16 no... si incaxxa come una iena...

Anche il manuale conferma il mio esperimento