Il motivo per queste istruzioni di scrittura è di preparare un file di dati utilizzabile da gnuplot per la visualizzazione dei risultati. Gnuplot connette punti con segmenti e quindi per far disegnare una poligonale chiusa con N vertici occorre dare N+1 coordinate, con le ultime coincidenti con le prime.
module geom
implicit none
type :: punto
real ::x,y
end type punto
type :: triangolo
type(punto) :: vertice_A
type(punto) :: vertice_B
type(punto) :: vertice_C
end type triangolo
contains
function sum_points(p,q) result(r)
type(punto), intent(in) :: p,q
type(punto) :: r
r%x = p%x + q%x
r%y = p%y + q%y
end function sum_points
function invert(p) result(r)
type(punto), intent(in) :: p
type(punto) :: r
r%x = -p%x
r%y = -p%y
end function invert
end module geom
program piano
use geom
implicit none
type(punto) :: A,B,C
type(triangolo) :: T1, T2
print*,'coordinate 2D primo vertice'
read*,A
print*,'coordinate 2D secondo vertice'
read*,B
print*,'coordinate 2D terzo vertice'
read*,C
T1 = triangolo(A,B,C) ! il nome del tipo dati "costruisce" una variabile
! dello stesso tipo a partire dai 3 campi
print*,' vertice A: ',T1%vertice_A
print*,' vertice B: ',T1%vertice_B
print*,' vertice C: ',T1%vertice_C
T2%vertice_A = invert(T1%vertice_A)
T2%vertice_B = invert(T1%vertice_B)
T2%vertice_C = invert(T1%vertice_C)
print*,'coppie di coordinate dei vertici del triangolo T2', T2
end program piano
function raddoppia(x) result(dop)
real,dimension(:),intent(in) ::x
real,dimension(size(x,1)) ::dop
dop= 2*x
end function raddoppia
xn+1=(2-xn3)/4 (ottenuta isolando il termine 4x e dividendo per 4)Inoltre, dal metodo di Newton se ne può ottenere una quarta:
xn+1=(2-4xn)/xn2 (ottenuta isolando il termine x3 e dividendo per x2 )
xn+1=2 - 3 xn - xn3 (ottenuta scrivendo 4x come x+3x e isolando il termine in x )
xn+1=(2 xn3 + 2)/(3 xn2 + 4)Scrivere un programma che implementi queste formule e scriva i risultati per ciascuna formula su un file diverso. Verificare (approssimativamente, per tentativi) quale ha il massimo bacino di attrazione (il bacino di attrazione di un punto fisso è costituito dall' insieme dei punti iniziali che danno luogo ad una successione convergente a quel punto fisso). Verificare che le instabilità sono legate alla presenza di regioni in cui |g'(x)|>1, dove g(x) è il membro a destra di ciascuna formula.Si suggerisce di iterare ogni formula per non più di 100 passi, facendo scrivere ad ogni passo il valore della variabile x e della derivata prima della funzione (g'). Non è richiesto di implementare criteri di stop ma solo di scrivere i valori ad ogni passo.
module prec
implicit none
integer,parameter :: rk=selected_real_kind(12)
end module prec
module ieee_test
use prec
implicit none
contains
function is_normal(x) result(ans)
real(kind=rk),intent(in) :: x
logical :: ans
ans=.true.
if(abs(x)>huge(x)) ans=.false.
if(x/=x) ans=.false.
end function is_normal
end module ieee_test