-- Spline.ada programma che da un pol. di 3o grado per ogni punto -- Aydemir Cihan e Giosia Poma -- -- ----------------------------------------------------- -- Algoritmo testato con dati esercizio 1 serie 13 -- ----------------------------------------------------- with Text_IO, Float_Text_IO; use Text_IO, Float_Text_IO; procedure Spline_Naturale is --------------- -- Variabili -- --------------- punti_max: constant INTEGER := 5; type PUNTO is record x: FLOAT; y: FLOAT; end record; type COEFF is record a: FLOAT; b: FLOAT; c: FLOAT; d: FLOAT; end record; type Lista_Punti is array(0..punti_max) of PUNTO; -- array di record type Differenza is array(0..punti_max-1) of FLOAT; -- array di float type Polinomi is array(0..punti_max-1) of COEFF; -- array di record type Vettore is array(INTEGER range <>) of FLOAT; type Derivate_II is array(0..punti_max) of FLOAT; lista : LISTA_PUNTI; -- punti inseriti delta_x : DIFFERENZA; -- delta x_n - x_n-1 delta_y : DIFFERENZA; -- delta y_n - y_n-1 derivate : DERIVATE_II; -- soluz. del sistema deriv IInde soluzioni : POLINOMI; -- soluzioni n polinomi (con n+1 punti) d, b : VETTORE(1..punti_max-1); -- matrice quandrata e, f : VETTORE(1..punti_max-2); -- per sistema tridiagonale --------------------- -- Richiesta Punti -- --------------------- -- procedure Richiesta(lista : out LISTA_PUNTI) is -- var_x, var_y : FLOAT; -- x e y locali -- numero : INTEGER := 0; -- numero di punti -- begin -- New_Line(2); -- Put_Line("Inserire il numero dei punti:"); -- Get(numero); -- end Richiesta; --------------------- --------------------- ---------------------- -- Differenze x e y -- !! OK !! ---------------------- procedure Differenza_x_y( lista : in LISTA_PUNTI; delta_x : out DIFFERENZA; delta_y : out DIFFERENZA) is begin for i in 0..punti_max-1 loop delta_x(i):= lista(i+1).x - lista(i).x; delta_y(i):= lista(i+1).y - lista(i).y; end loop; end Differenza_x_y; ------------------------------------------------ -- Costruzione equazione matrice tridiagonale -- !! OK !! ------------------------------------------------ procedure Crea_eq( delta_x : in DIFFERENZA; delta_y : in DIFFERENZA; d, b, e, f : out VETTORE) is begin for i in 1..punti_max-1 loop d(i) := 2.0*(delta_x(i-1)+delta_x(i)); b(i) := -6.0 * ((delta_y(i) / delta_x(i)) - (delta_y(i-1)/delta_x(i-1))); end loop; for i in 1..punti_max-2 loop e(i) := delta_x(i); f(i) := delta_x(i); end loop; end Crea_eq; ---------------------------- -- Procedure Tridiagonale -- !! OK !! ---------------------------- procedure Tridiagonale( d, e, f, b : in VETTORE; derivate : in out DERIVATE_II ) is r : VETTORE(1..punti_max-1); c : VETTORE(1..punti_max-1); l : VETTORE(1..punti_max-2); begin r(1) := d(1); c(1) := b(1); for i in 1..punti_max-2 loop l(i) := f(i) / r(i); r(i+1) := d(i+1) - l(i) * e(i); c(i+1) := b(i+1) - l(i) * c(i); end loop; derivate(punti_max-1):= -c(punti_max-1) / r(punti_max-1); for i in reverse 1..punti_max-2 loop derivate(i) := -(c(i) + derivate(i+1) * e(i)) / r(i); end loop; derivate(0) := 0.0; derivate(punti_max):= 0.0; end Tridiagonale; ---------------------------------------------------- -- Calcolo i vari polinomi per le coppie di punti -- ---------------------------------------------------- procedure Coeff_Polinomi( derivate : in DERIVATE_II; delta_x : in DIFFERENZA; delta_y : in DIFFERENZA; lista : in LISTA_PUNTI; soluzioni : out POLINOMI) is begin for i in 0..punti_max-1 loop soluzioni(i).a := lista(i).y; soluzioni(i).b := (delta_y(i) / delta_x(i)) - (delta_x(i) / 6.0) * (derivate(i+1) + 2.0 * derivate(i)); soluzioni(i).c := 0.5 * derivate(i); soluzioni(i).d := (1.0/(6.0 * delta_x(i)))*(derivate(i+1)-derivate(i)); end loop; end Coeff_Polinomi; procedure Stampa(soluzioni : in POLINOMI) is begin for i in 0..punti_max-1 loop Put("("); Put(soluzioni(i).a,0,3,0); Put(")"); Put("x^3 +"); Put("("); Put(soluzioni(i).b,0,3,0); Put(")"); Put("x^2 +"); Put("("); Put(soluzioni(i).c,0,3,0); Put(")"); Put("x +"); Put("("); Put(soluzioni(i).d,0,3,0); Put(")"); New_Line(2); end loop; end Stampa; -------------------------- -- Programma principale -- -------------------------- begin lista(0).x:= 1.0; lista(0).y:= 1.0; lista(1).x:= 2.0; lista(1).y:= 3.0; lista(2).x:= 3.0; lista(2).y:= 2.0; lista(3).x:= 5.0; lista(3).y:= 3.0; lista(4).x:= 6.0; lista(4).y:= 5.0; lista(5).x:= 7.0; lista(5).y:= 6.0; Differenza_x_y(lista, delta_x, delta_y); Crea_eq(delta_x, delta_y, d, b, e, f); Tridiagonale(d, e, f, b, derivate); Coeff_Polinomi(derivate, delta_x, delta_y, lista, soluzioni); Stampa(soluzioni); end Spline_Naturale;