Nel linguaggio di programmazione Fortran, le operazioni di conversione tra numeri binari e decimali sono fondamentali, specialmente nell'ambito dell'analisi numerica. Queste conversioni sono alla base di numerosi algoritmi e applicazioni in vari settori scientifici e ingegneristici. In questo capitolo, esploreremo diverse tecniche per convertire numeri da binari a decimali e viceversa, fornendo anche esempi di programmi che implementano queste operazioni.

Un'operazione comune è la conversione di un numero decimale in un numero binario. Il seguente programma in Fortran mostra come eseguire questa conversione, utilizzando una serie di divisioni successive per ottenere i bit binari:

fortran
N = IQ
! prendi il quoziente come numero N J = J + 1 GOTO 5 10 IR(J+1) = IQ WRITE(*,*) 'Numero decimale', M, ' Numero binario equivalente', (IR(J), J=J+1, 1, -1) END

Conversione da Binario a Decimale

Nel caso in cui dobbiamo convertire un numero binario in un numero decimale, il processo diventa più complesso, ma altrettanto fondamentale. Supponiamo di voler convertire il numero binario 10101 nel suo equivalente decimale. La formula per questa conversione è la seguente:

1 0 1 0 1
Posizione 4 3 2 1 0 Valore 1x2^4 + 0x2^3 + 1x2^2 + 0x2^1 + 1x2^0 = 21

Per ottenere il valore decimale corrispondente alla posizione zero, si utilizza l'operazione di modulo (mod) per trovare il valore alla posizione zero. Successivamente, si eseguono divisioni intere per ogni posizione successiva, fino a che il risultato non diventa 1. La somma dei valori ottenuti fornisce il numero decimale equivalente.

Conversione di un Numero Decimale Frazionario in Binario

La conversione di numeri frazionari da decimale a binario segue una procedura simile ma con un approccio leggermente diverso. In questo caso, si moltiplica la parte frazionaria del numero per 2, prendendo la parte intera del risultato come il primo bit binario. Il processo continua, moltiplicando la frazione risultante per 2 fino a che non diventa zero o si ottiene una rappresentazione binaria approssimativa.

Ecco un programma che implementa questa conversione:

fortran
WRITE(*,*) 'Inserire il numero decimale frazionario' READ(*,*) F FOLD = F I = 1 10 F2 = 2 * F G = INT(F2) ! Trova la parte intera di F2 IR(I) = G F = F2 - G IF ((F .EQ. 0) .OR. (I .GE. 19)) GOTO 20 I = I + 1 GOTO 10 20 WRITE(*,*) 'Numero decimale frazionario', FOLD IF (I .LE. 18) THEN WRITE(*,*) 'Numero binario equivalente', (IR(J), J = 1, I) ELSE WRITE(*,*) 'Numero binario equivalente (approssimato)', (IR(J), J = 1, I) END IF

Numeri Reali: Decimali e Frazionari Insieme

Nel caso di numeri reali, che comprendono sia una parte intera che una frazionaria, il processo di conversione diventa una combinazione dei due metodi precedenti. Prima si converte la parte intera in binario, poi la parte frazionaria. Il programma di seguito unisce questi due approcci:

fortran
WRITE(*,*) 'Inserire il numero reale' READ(*,*) F FOLD = F N = INT(F) ! Trova la parte intera J = 1 5 IIR(J) = MOD(N, 2) IQ = N / 2 IF (IQ .EQ. 1) GOTO 10 N = N / 2 J = J + 1 GOTO 5 10 IIR(J + 1) = IQ I = 1 F = F - INT(F) ! Trova la parte frazionaria 20 F2 = 2 * F G = INT(F2) IR(I) = G F = F2 - G IF (F .EQ. 0) GOTO 40 I = I + 1 GOTO 20 40 WRITE(*,*) 'Numero decimale frazionario', FOLD WRITE(*,*) 'Numero binario equivalente', (IIR(J), J = J + 1, 1, -1), '.', (IR(J), J = 1, I) END

Lavorare con le Matrici

Le operazioni su matrici, come la lettura, la scrittura e le operazioni elementari come l'addizione o la trasposizione, sono essenziali in vari campi scientifici. Nel programma che segue, vediamo come leggere e scrivere una matrice in Fortran:

fortran
DIMENSION A(10,10)
WRITE(*,*) 'Inserisci il numero di righe (M) e colonne (N)' READ(*,*) M, N WRITE(*,*) 'Inserisci la matrice (riga per riga)' DO I = 1, M READ(*,*) (A(I,J), J = 1, N) END DO WRITE(*,*) 'La matrice è:' DO I = 1, M WRITE(*,*) (A(I,J), J = 1, N) END DO

Per operare con matrici di dimensioni maggiori, è necessario gestire correttamente le righe e le colonne, spesso usando cicli annidati. Ad esempio, se vogliamo sommare due matrici di dimensioni uguali, il programma seguente mostra come eseguire questa operazione:

fortran
DIMENSION A(10,10), B(10,10), S(10,10) WRITE(*,*) 'Inserisci le righe e colonne delle due matrici da sommare' READ(*,*) N, M WRITE(*,*) 'Inserisci la 1° matrice riga per riga' DO I = 1, N READ(*,*) (A(I,J), J = 1, M) END DO WRITE(*,*) 'Inserisci la 2° matrice riga per riga' DO I = 1, N READ(*,*) (B(I,J), J = 1, M) END DO ! Somma delle matrici DO I = 1, N DO J = 1, M S(I,J) = A(I,J) + B(I,J) END DO END DO

La Trasposizione di una Matrice

Un’altra operazione utile nelle matrici è la trasposizione. La trasposizione di una matrice comporta il cambio delle righe con le colonne. Per una matrice quadrata, ogni elemento aij diventa aji. Nel caso di matrici non quadrate, i numeri di riga e colonna vengono invertiti.

Importanza del Controllo delle Condizioni di Arresto

Quando si lavora con conversioni numeriche o matrici, è fondamentale tenere in considerazione le condizioni di arresto dei programmi. In alcuni casi, come nel caso della conversione di frazioni decimali in binari, il processo potrebbe non terminare mai se non viene impostato un criterio di tolleranza o un numero massimo di iterazioni.

Come trovare tutte le radici di un polinomio di grado n: un metodo sistematico

La ricerca delle radici di un polinomio è una delle problematiche fondamentali in numerosi campi scientifici e ingegneristici. In questo capitolo, esploreremo un approccio sistematico per determinare tutte le radici di un polinomio di grado n, dove le radici possono essere reali, complesse o una combinazione di entrambe. Iniziamo assumendo che tutte le radici siano reali, un caso che ci permette di applicare metodi noti come il metodo di Newton-Raphson e la divisione sintetica.

Consideriamo un polinomio di grado n:

f(x)=anxn+an1xn1++a1x+a0f(x) = a_n x^n + a_{n-1} x^{n-1} + \cdots + a_1 x + a_0

Per risolvere questo polinomio, una prima tecnica utile è la valutazione del polinomio mediante il metodo di Horner, che consente di calcolare il valore del polinomio in modo più efficiente. L'espressione del polinomio attraverso Horner si scrive come segue:

f(x)=(((((anx+an1)x+an2)x++a1)x+a0)f(x) = (((((a_n x + a_{n-1}) x + a_{n-2}) x + \cdots + a_1) x + a_0)

Partendo da una stima iniziale x0x_0, possiamo trovare una radice accurata applicando il metodo di Newton-Raphson, che aggiorna la stima delle radici mediante la relazione:

x1=x0f(x0)f(x0)x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}

Dove f(x)f'(x) è la derivata del polinomio, che può anch'essa essere calcolata utilizzando il metodo di Horner. La derivata seconda di f(x)f(x), necessaria per una più precisa approssimazione, si ottiene come:

f(x)=nanxn1+(n1)an1xn2++2a2x+a1f''(x) = n a_n x^{n-1} + (n-1) a_{n-1} x^{n-2} + \cdots + 2 a_2 x + a_1

Dopo aver trovato una radice xrx_r del polinomio, possiamo ridurre il grado del polinomio originale dividendo il polinomio per (xxr)(x - x_r). Il polinomio risultante, chiamato polinomio quoziente, ha grado n1n-1. La divisione sintetica è uno strumento potente per calcolare il quoziente senza dover eseguire una divisione tradizionale. Si applica seguendo la formula:

p(x)=(xxr)q(x)p(x) = (x - x_r) q(x)

Dove p(x)p(x) è il polinomio originale e q(x)q(x) è il polinomio quoziente di grado n1n-1. Utilizzando i coefficienti di p(x)p(x), possiamo calcolare i coefficienti di q(x)q(x) senza fare la divisione completa. La formula per calcolare i coefficienti di q(x)q(x) è:

bn1=an+xrbnb_{n-1} = a_n + x_r \cdot b_n

Una volta ottenuto il polinomio quoziente, possiamo ripetere il processo di Newton-Raphson per trovare ulteriori radici. Questo processo si ripete fino a quando il polinomio quoziente diventa di grado 1, ovvero raggiungiamo l'ultima radice.

Questo metodo è descritto in dettaglio attraverso il codice fornito, che utilizza la divisione sintetica e il metodo di Newton-Raphson per trovare tutte le radici reali di un polinomio. Il programma consente di inserire i coefficienti del polinomio e una stima iniziale per ciascuna radice, aggiornando la stima ad ogni iterazione. Il metodo convergerà rapidamente, a condizione che la stima iniziale sia adeguata.

È fondamentale notare che questo approccio funziona esclusivamente per polinomi con radici reali. Se un polinomio ha radici complesse, il metodo descritto sopra non sarà sufficiente, e sarà necessario ricorrere a metodi più avanzati, come la decomposizione di polinomi in fattori complessi o l'uso di metodi numerici per il calcolo delle radici complesse.

Inoltre, è importante comprendere che la scelta di una stima iniziale adeguata è cruciale per la convergenza del metodo di Newton-Raphson. Una stima iniziale errata può portare a risultati imprecisi o, nel peggiore dei casi, a una non convergenza. Pertanto, la conoscenza della forma del polinomio o l’analisi preliminare delle radici può migliorare notevolmente l'efficacia del metodo.

Il codice e le procedure descritte consentono di ridurre un polinomio di grado n a una serie di polinomi di grado inferiore, facilitando il calcolo iterativo delle radici. Questo approccio è molto utile in numerosi ambiti applicativi, come l’ingegneria, la fisica e la modellazione numerica, dove la determinazione accurata delle radici è un passo essenziale per risolvere problemi complessi.