Strumenti Utente

Strumenti Sito


fisica:informatica:201617:esercitazione3bis

Esercitazione 2: libreria matematica ed array

Per la soluzione di alcuni di questi esercizi serve utilizzare la libreria matematica

La libreria matematica ''math.h'' Includendo all'inizio l'header file

#include <math.h>

e compilando con

gcc -Wall -pedantic file.c -o nome_eseguibile -lm

Esercizio 1: Approssimazione dell'integrale

Consideriamo la funzione

f(x) = 5x^3 + 4x^2 + 7x + 5:

Si vuole calcolare l'integrale di f(x) su un intervallo [a, b] dividendo l'intervallo in n intervalli di lunghezza (b-a)/n e calcolando l'integrale come somma dell'area di n trapezi, come spiegato in questo documento.

Il programma chiede all'utente due reali positivi a e b e un intero positivo nmax numero di intervalli in cui suddividere l'intervallo [a, b]. Il programma deve calcolare le approssimazioni dell' integrale di f(x) ottenute con il procedimento dei trapezio per n = 2, 3, 4,…nmax. Stampando su standard output i valori ottenuti e la differenza con l'integrale esatto calcolato analiticamente.

Esercizio 2: Somma e prodotto di matrici

Scrivere un programma C costituito da un main() che legge da standard input due matrici quadrate di reali, le somma, calcola il prodotto e stampa i risultati sullo standard output.

Esercizio 3: Calcolo della radice quadrata

Dato un numero reale positivo a si consideri la sequenza dei numeri reali x definita da

x[0] = 1
x[i+1] = 1/2*(x[i] + a/x[i])

si puo' dimostrare che x[i] tende alla radice quadrata di a per i che tende all'infinito.

Scrivere un programma che legga il valore di a da standard input e calcoli la radice quadrata di a utilizzando la sequenza. In particolare, si calcoli la sequenza fino a che x[i] non diventa uguale a x[i+1], il valore ottenuto e' l'approssimazione cercata per la radice quadrata di a.

Ad ogni ciclo, far stampare su standard output il numero dell'iterazione i, il valore di x[i] ed il valore di a-x[i]*x[i] per controllare la convergenza.

Esercizio 4: MSS, Maximum Segment Sum

Dato un array di interi positivi e negativi, il segmento di somma massima e' la porzione contigua dell'array in cui la somma deigli elementi ha valore piu' alto. Ad esempio l'array

[2,-4,2,-1,6-3] 

ha come SSM il segmento [2,-1,6] di valore 7. Si chiede di realizzare in programma C che legge dallo standard input N interi, li inserisce in un array lungo N, calcola il segmento di somma massima e lo stampa sullo standard output.

Esercizio 5: Mandelbrot (Avanzato)

L'insieme di Mandelbrote' un insieme frattale definito come l'insieme dei numeri complessi c per i quali la successione definita da:

z(0) = 0
z(n+1) = z(n)^2 + c

e' limitata, cioe' |z( n )|< 2 per ogni n >=0. Infatti al variare di c, la sequenza puo' tendere all’infinito o rimanere confinata in un disco di raggio 2 del piano complesso centrato nell’origine.

L’algoritmo piu' semplice per visualizzare (una approssimazione de) l’insieme di Mandelbrot ´e l’Escape Time Algorithm. In questo algoritmo, dati A (l’area del piano complesso da visualizzare) ed r (una precisione fissata) si effettuano i seguenti passi:

  1. Si suddivide A in una griglia di punti a distanza uniforme (pixel)
  2. per ogni pixel (x, y)
    1. si calcolano r valori della sequenza con c=(x,y)
    2. se dopo r iterazioni |z( r )|⇐ 2 si considera c appartenente all'insieme e si assegna a c il colore NERO
  3. altrimenti si assegna a c il colore j, che e' il minimo indice per cui | z(j) |>=2

Di seguito viene mostrato un possibile pseudocodice per il calcolo del singolo pixel:

Per ogni pixel:
{
x = x0 = x co-ordinate of pixel
y = y0 = y co-ordinate of pixel
x2 = x*x
y2 = y*y
iteration = 0
maxiteration = 1000
while ( x2 + y2 < (2*2)
AND iteration < maxiteration )
{
y = 2*x*y + y0
x = x2 - y2 + x0
x2 = x*x
y2 = y*y
iteration = iteration + 1
}
if ( iteration == maxiteration )
colour = black
else
colour = iteration
}

Nel codice, le coordinate del pixel (x, y) sono usate come valore iniziale per il calcolo. Il risultato di ogni iterazione e' usato come punto d’inizio della successiva. Ad ogni iterazione si controlla se siamo usciti dal cerchio di raggio 2 (e quindi se (x,y) non appartiene a M), se questo e' vero si assegna il numero di iterazioni come colore a (x, y) e si considera il prossimo punto, altrimenti si calcola la nuova iterazione. Quindi, rispetto alla definizione iniziale:

z = x + iy 
c = x0 + iy0 
z^2 = x^2 + i2xy − y^2. 

Inoltre, r e' maxiteration(1000).

Scrivere un programma C che calcola l'insieme di Mandelbrot per il rettangolo di estremi (-2,1) (1,-1) e stampando sullo standard output i colori dei pixel suppenendo di dividere il rettangolo in 100×100 pixel.

fisica/informatica/201617/esercitazione3bis.txt · Ultima modifica: 28/02/2017 alle 13:29 (7 anni fa) da Susanna Pelagatti