11.06.2013 Views

Esercizi in Fortran - Progettoatena.It

Esercizi in Fortran - Progettoatena.It

Esercizi in Fortran - Progettoatena.It

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

NOTAZIONI ..................................................................................................................................................... 2<br />

SOMMA DI 2 MATRICI QUADRATE ........................................................................................................... 2<br />

PRODOTTO MATRICE (QUADRATA) PER VETTORE ............................................................................. 2<br />

PRODOTTO DI 2 MATRICI QUALSIASI C=A*B ........................................................................................ 2<br />

PRODOTTO di una MATRICE QUALSIASI (mxn) per un VETTORE......................................................... 3<br />

TRASPOSTA di una MATRICE ...................................................................................................................... 3<br />

CONTROLLO DI SIMMETRIA DI UNA MATRICE (QUADRATA)........................................................... 3<br />

CONTROLLO DI MATRICE STRETTAMENTE DIAGONALE DOMINANTE PER RIGHE ................... 4<br />

1°VERSIONE: .............................................................................................................................................. 4<br />

2°VERSIONE: .............................................................................................................................................. 4<br />

METODO DELLE POTENZE per il CALCOLO dell'AUTOVALORE MAX IN MODULO........................ 5<br />

di una MATRICE (SIMMETRICA) A.............................................................................................................. 5<br />

CONTROLLO DI MATRICE con a(i,i) > 0 e a(i,j) 0 e a(i,j)


NOTAZIONI<br />

Nel <strong>Fortran</strong> tutte le costanti e variabili che <strong>in</strong>iziano per:<br />

sono implicitamente dichiarate di tipo <strong>in</strong>teger<br />

SOMMA DI 2 MATRICI QUADRATE<br />

subrout<strong>in</strong>e sommamatrici(a,b,c,ld,n)<br />

real a(ld,*), b(ld,*), c(ld,*)<br />

do i = 1, n<br />

do j = 1, n<br />

c(i,j) = a(i,j) + b(i,j)<br />

enddo<br />

enddo<br />

return<br />

end<br />

i j k l m n<br />

PRODOTTO MATRICE (QUADRATA) PER VETTORE<br />

subrout<strong>in</strong>e matvet(a,v,b,n,ld)<br />

real a(ld,*), v(*), b(*)<br />

do i=1,n<br />

b(i)=0<br />

do j=1,n<br />

b(i)=b(i)+a(i,j)*v(j)<br />

enddo<br />

enddo<br />

return<br />

end<br />

PRODOTTO DI 2 MATRICI QUALSIASI C=A*B<br />

subrout<strong>in</strong>e matqmatq(a,b,c,ma,n,nb,ld)<br />

ma = righe di a,c n = colonne di a e righe di b, nb = colonne di b,c<br />

real a(ld,*), b(ld,*), c(ld,*)<br />

do i=1,ma<br />

do j=1,nb<br />

c(i,j)=0.0<br />

do k=1,n<br />

c(i,j)=c(i,j)+a(i,k)*b(k,j)<br />

enddo<br />

enddo<br />

enddo<br />

return<br />

end<br />

2


PRODOTTO di una MATRICE QUALSIASI (mxn) per un VETTORE<br />

subrout<strong>in</strong>e matqvet (a,v,b,m,n,ld)<br />

m=righe di a, n=colonne di a e righe di v<br />

real a(ld,*), v(*), b(*)<br />

do i = 1,m<br />

b(i) = 0.0<br />

do k = 1,n<br />

b(i) = b(i) + a(i,k) * v(k)<br />

enddo<br />

enddo<br />

return<br />

end<br />

TRASPOSTA di una MATRICE<br />

subrout<strong>in</strong>e trasposta(a,at,m,n,ld)<br />

real a(ld,*), at(ld,*)<br />

m=numero righe n=numero colonne (di A)<br />

do i=1,n<br />

do j=1,m<br />

at(i,j)=a(j,i)<br />

enddo<br />

enddo<br />

CONTROLLO DI SIMMETRIA DI UNA MATRICE (QUADRATA)<br />

subrout<strong>in</strong>e simmetrica(a,n,ld,<strong>in</strong>fo)<br />

real a(ld,*)<br />

<strong>in</strong>fo=0<br />

do i=1,n<br />

do j=1,i-1<br />

if (a(i,j).EQ.a(j,i) then<br />

<strong>in</strong>fo=1<br />

else<br />

<strong>in</strong>fo=0<br />

write(*,*)'Matrice non simmetrica'<br />

stop<br />

endif<br />

enddo<br />

enddo<br />

return<br />

end<br />

3


CONTROLLO DI MATRICE STRETTAMENTE DIAGONALE DOMINANTE PER<br />

RIGHE<br />

1°VERSIONE:<br />

subrout<strong>in</strong>e ddr(a,n,ld,<strong>in</strong>fo)<br />

real a(ld,*)<br />

<strong>in</strong>fo=0<br />

s=0<br />

do i=1,n<br />

do j=i,i-1<br />

s=s+abs(a(i,j))<br />

enddo<br />

do j=i+1,n<br />

s=s+abs(a(i,j))<br />

enddo<br />

if(abs(a(i,i)).GT.s) then<br />

<strong>in</strong>fo=1<br />

else<br />

<strong>in</strong>fo=0<br />

write(*,*)'Matrice non strett. diag. dom. per righe'<br />

stop<br />

endif<br />

return<br />

end<br />

2°VERSIONE:<br />

subrout<strong>in</strong>e ddr(a,n,ld,<strong>in</strong>fo)<br />

real a(ld,*)<br />

<strong>in</strong>fo=0<br />

s=0<br />

do i=1,n<br />

do j=i,n<br />

if(i.NE.j) then<br />

s=s+abs(a(i,j))<br />

endif<br />

enddo<br />

if(abs(a(i,i)).GT.s) then<br />

<strong>in</strong>fo=1<br />

else<br />

<strong>in</strong>fo=0<br />

write(*,*)'Matrice non strett. diag. dom. per righe'<br />

stop<br />

endif<br />

return<br />

end<br />

4


METODO DELLE POTENZE per il CALCOLO dell'AUTOVALORE MAX IN MODULO<br />

di una MATRICE (SIMMETRICA) A<br />

program metodopotenze<br />

parameter(ld=20,kmax=100)<br />

real a(ld,ld), v0=(ld), u(ld), gamma(kmax), beta(kmax)<br />

write(*,*)'ord<strong>in</strong>e di A'<br />

read(*,*), n<br />

write(*,*)'elementi di A'<br />

do i=1,n<br />

read(*,*)(a(i,j), j=1,n)<br />

enddo<br />

<strong>in</strong>fo=0<br />

call simmetrica(a,n,ld,<strong>in</strong>fo)<br />

if(<strong>in</strong>fo.EQ.1) then<br />

write(*,*)'OK matrice simmetrica'<br />

endif<br />

call ddr(a,n,ld,<strong>in</strong>fo)<br />

if(<strong>in</strong>fo.EQ.1) then<br />

write(*,*)'OK matrice strett. diag. dom. per righe'<br />

endif<br />

write(*,*)'Tolleranza e iterato <strong>in</strong>iziale con norma=1'<br />

read epsilon, (v0(i), i=1,n)<br />

do k=1, kmax<br />

call matvet(a,v0,u,n,ld) CALL PRODOTTO MATRICE x VETTORE<br />

beta(k)=0.0<br />

do i=1,n<br />

beta(k)=beta(k)+u(i)*v0(i)<br />

enddo<br />

if(k.NE.1) then<br />

if(abs(beta(k)-beta(k-1)).LE.epsilon*abs(beta(k))) then<br />

write(*,*)'iterazione #', k<br />

write(*,*)'autovalore max ', beta(k)<br />

write(*,3) k, (v0(i), i=1, n)<br />

stop<br />

endif<br />

endif<br />

gamma(k)=0<br />

do i=1,n<br />

gamma(k)=gamma(k)+u(i)*u(i)<br />

enddo<br />

gamma(k)=sqrt(gamma(k))<br />

do i=1,n<br />

v0(i)=u(i)/gamma(k)<br />

enddo<br />

enddo<br />

write(*,*)'iterazione max #', kmax<br />

write(*,*)'autovalore max #', beta(kmax)<br />

stop<br />

end<br />

5


CONTROLLO DI MATRICE con a(i,i) > 0 e a(i,j) 0 e a(i,j)


write(*,*),'matrice con el. non diag >0'<br />

stop<br />

endif<br />

enddo<br />

if((abs(a(i,j)).GT.som1).AND.(a(i,i).GT.0)) then<br />

<strong>in</strong>fo=1<br />

else<br />

<strong>in</strong>fo=0<br />

write(*,*)'matrice non strett. diag. dom. o con el diag.


eal x(ld)<br />

<strong>in</strong>d=1<br />

do i=2,n<br />

if(abs(x(i)).gt.abs(x(<strong>in</strong>d))) <strong>in</strong>d=i<br />

enddo<br />

ormavett=abs(x(<strong>in</strong>d))<br />

return<br />

end<br />

8


METODO DELLA MEDIA ARITMETICA per la RISOLUZIONE di SISTEMI LINEARI<br />

program mediaaritmetica<br />

parameter(ld=20,kmax=100)<br />

real a(ld,ld), b(ld), x0(ld), xn(ld), m1(ld,ld), m2(ld,ld), m3(ld,ld),<br />

real m4(ld,ld), c1(ld), c2(ld), y(ld), z1(ld), z2(ld)<br />

write(*,*) 'ord<strong>in</strong>e problema, ro, tolleranza'<br />

read(*,*) n, ro, epsilon<br />

write(*,*)'matrice per righe'<br />

do i=1,n<br />

read(a(i,j), j=1,n)<br />

enddo<br />

write(*,*)'term<strong>in</strong>e noto ed <strong>in</strong>terazione <strong>in</strong>iziale'<br />

do i=1,n<br />

read(*,*) b(i), x0(i)<br />

enddo<br />

Controlla che la matrice sia diag. strett. dom<strong>in</strong>., che a(i,i)>0<br />

e a(i,j)


call tri<strong>in</strong>f(m1,z1,c1,n,ld)<br />

call trisup(m3,z2,c2,n,ld)<br />

do i=1,n<br />

xn(i)=(z1(i)+z2(i))/2<br />

enddo<br />

do i=1,n<br />

x0(i)=xn(i)-x0(i)<br />

enddo<br />

if(orma(x0,n,ld).LE.(epsilon*orma(xn,n,ld))) then<br />

write(*,*)'iterazione # ',k<br />

write(*,*)'x= ',(xn(i),i=1,n)<br />

stop<br />

else<br />

write(*,*)'norma',orma(x0,n,ld),orma,xn,n,ld)<br />

endif<br />

do I=1,n<br />

x0(i)=xn(i)<br />

enddo<br />

enddo<br />

write(*,*)'iterazione # ',kmax<br />

write(*,*)'x= ',(xn(i), I=1,n)<br />

end<br />

RISOLUZIONE DI SISTEMA LINEARE mediante l'ALGORITMO di GAUSS (SENZA<br />

PIVOTING)<br />

subrout<strong>in</strong>e gauss(a,b,n,ld)<br />

real a(ld,*), b(*)<br />

do k=1,n-1<br />

do i=k+1,n<br />

a(i,k)=a(i,k)/a(k,k)<br />

b(i)=b(i)-a(i,k)*b(k)<br />

do j=k+1,n<br />

a(i,j)=a(i,j)-a(i,k)*a(k,j)<br />

enddo<br />

enddo<br />

enddo<br />

return<br />

end<br />

+<br />

subrout<strong>in</strong>e risolvi(a,x,b,n,ld) (risoluzione con A triang. sup.)<br />

real a(ld,*), x(*), b(*)<br />

x(n)=b(n)/a(n,n)<br />

do i=n-1,1,-1<br />

som=0<br />

do j=i+1,n<br />

som=som+a(i,j)*x(j)<br />

enddo<br />

x(i)=(b(i)-som)/a(i,i)<br />

10


enddo<br />

return<br />

end<br />

OPPURE(<strong>in</strong> una sola subrout<strong>in</strong>e)<br />

subrout<strong>in</strong>e gausstot(a,x,b,n,ld)<br />

real a(ld,*), b(*)<br />

Passo 1: ricava a triang. sup. e il b corrispondente<br />

do k=1,n-1<br />

do i=k+1,n<br />

a(i,k)=a(i,k)/a(k,k)<br />

b(i)=b(i)-a(i,k)*b(k)<br />

do j=k+1,n<br />

a(i,j)=a(i,j)-a(i,k)*a(k,j)<br />

enddo<br />

enddo<br />

enddo<br />

Passo 2: risolve il sistema con sostituzione all'<strong>in</strong>dietro<br />

x(n)=b(n)/a(n,n)<br />

do i=n-1,1,-1<br />

som=0<br />

do j=i+1,n<br />

som=som+a(i,j)*x(j)<br />

enddo<br />

x(i)=(b(i)-som)/a(i,i)<br />

enddo<br />

CALCOLO dell'AUTOVALORE MINIMO di una MATRICE (QUADRATA) con il<br />

METODO DELLE POTENZE INVERSE<br />

program autovalm<strong>in</strong><br />

parameter(ld=20,kmax=100)<br />

real a(ld,ld), v0(ld), u(ld), beta(kmax)<br />

write(*,*)'dimensione matrice'<br />

read(*,*), n<br />

write(*,*)'matrice per righe'<br />

do i=1,n<br />

read(*,*)(a(i,j), j=1,n)<br />

enddo<br />

write(*,*)'tolleranza e vettore normalizzato'<br />

read(*,*) eps, (v0(i), i=1,n)<br />

do k=1,kmax<br />

call gauss(a,v0,n,ld)<br />

call risolvi(a,u,v0,n,ld)<br />

beta(k)=0.0<br />

do i=1,n<br />

11


eta(k)=beta(k)+u(i)*v0(i)<br />

enddo<br />

if(k.NE.1) then<br />

if(abs(beta(k)-beta(k-1)).LE.eps*abs(beta(k))) then<br />

open(unit=3, name='nomefile', form='formatted', status='new')<br />

write(*,3) 'iterazione n° ', k<br />

write(*,3) 'autovalore m<strong>in</strong>imo = ',1/beta(k)<br />

write(*,3) (v0(i), i=1,n)<br />

close(3)<br />

stop<br />

endif<br />

endif<br />

gamma(k)=0.0<br />

do i=1,n<br />

gamma(k)=gamma(k)+u(i)*u(i)<br />

enddo<br />

gamma(k)=gamma(k)*v0<br />

gamma(k)=sqrt(gamma(k))<br />

do i=1,n<br />

v0(i)=u(i)/gamma(k)<br />

enddo<br />

enddo<br />

open(unit=3, name='nomefile', form='formatted', status='new')<br />

write(*,3) 'iterazione n° ', kmax<br />

write(*,3) 'autovalore m<strong>in</strong>imo = ',1/beta(kmax)<br />

write(*,3) (v0(i), i=1,n)<br />

close(3)<br />

end<br />

RISOLUZIONE di un SISTEMA LINEARE Ax=b con MATRICE A PENTADIAGONALE<br />

con il METODO di GAUSS (SENZA PIVOTING)<br />

subrout<strong>in</strong>e gausspentad(A,x,b,n,ld)<br />

real a(ld,*), x(*), b(*)<br />

Passo 1: ricava a triang. sup. e il b corrispondente<br />

do k=1,n-1<br />

do i=k+1,k+2<br />

a(i,k)=a(i,k)/a(k,k)<br />

b(i)=b(i)-a(i,k)*b(k)<br />

do j=k+1,k+2<br />

a(i,j)=a(i,j)-a(i,k)*(k,j)<br />

enddo<br />

enddo<br />

enddo<br />

Passo 2: risolve il sistema con sostituzione all'<strong>in</strong>dietro<br />

x(n)=b(n)/a(n,n)<br />

do i=n-1,1,-1<br />

s=0<br />

do j=i+1,n<br />

12


s=s+a(i,j)*b(j)<br />

enddo<br />

x(i)=(b(i)-s)/a(i,i)<br />

enddo<br />

return<br />

end<br />

RISOLUZIONE di un SISTEMA LINEARE Ax=b con MATRICE A EPTADIAGONALE<br />

con il METODO di GAUSS (SENZA PIVOTING)<br />

subrout<strong>in</strong>e gausseptad(A,x,b,n,ld)<br />

real a(ld,*), x(*), b(*)<br />

Passo 1: ricava a triang. sup. e il b corrispondente<br />

do k=1,n-1<br />

do i=k+1,k+3<br />

a(i,k)=a(i,k)/a(k,k)<br />

b(i)=b(i)-a(i,k)*b(k)<br />

do j=k+1,k+3<br />

a(i,j)=a(i,j)-a(i,k)*(k,j)<br />

enddo<br />

enddo<br />

enddo<br />

Passo 2: risolve il sistema con sostituzione all'<strong>in</strong>dietro<br />

x(n)=b(n)/a(n,n)<br />

do i=n-1,1,-1<br />

s=0<br />

do j=i+1,n<br />

s=s+a(i,j)*b(j)<br />

enddo<br />

x(i)=(b(i)-s)/a(i,i)<br />

enddo<br />

return<br />

end<br />

RISOLUZIONE di un SISTEMA LINEARE Ax=b con MATRICE A TRIDIAGONALE con<br />

il METODO di GAUSS (SENZA PIVOTING)<br />

subrout<strong>in</strong>e gausstrid(A,x,b,n,ld)<br />

real a(ld,*), x(*), b(*)<br />

Passo 1: ricava a triang. sup. e il b corrispondente<br />

do k=1,n-1<br />

a(k+1,k)=a(k+1,k)/a(k,k)<br />

b(k+1)=b(k+1)-a(k+1,k)*b(k)<br />

a(k+1,k+1)=a(k+1,k+1)-a(k+1,k)*(k,k+1)<br />

enddo<br />

Passo 2: risolve il sistema con sostituzione all'<strong>in</strong>dietro<br />

x(n)=b(n)/a(n,n)<br />

do i=n-1,1,-1<br />

13


s=0<br />

do j=i+1,n<br />

s=s+a(i,j)*b(j)<br />

enddo<br />

x(i)=(b(i)-s)/a(i,i)<br />

enddo<br />

return<br />

end<br />

PROVA SCRITTA 13/01/1998: ALGORITMO DELLA DECOMPOSIZIONE LU A<br />

BLOCCHI<br />

program 130198<br />

parameter(ld=20)<br />

real d1(ld,ld), d2(ld,ld), e(ld,ld), f(ld,ld), lf(ld,ld), ly(ld), fx(ld)<br />

real f1(ld), f2(ld), f3(ld), e1(ld), e2(ld), e3(ld), u2(ld,ld)<br />

real b1(ld), b2(ld), c1(ld), x1(ld), x2(ld)<br />

open(unit=3, file='risul', form='formatted', status='new')<br />

write(*,*)'Ord<strong>in</strong>e delle matrici: '<br />

read(*,*) n<br />

write(*,*)'Diagonale pr<strong>in</strong>cipale della matrice diagonale D1'<br />

read(*,*)(d1(i), i=1,n)<br />

write(*,*)'Diagonale pr<strong>in</strong>cipale della matrice diagonale D2'<br />

read(*,*)(d2(i), i=1,n)<br />

write(*,*)'Diagonali della matrice tridiagonale F1'<br />

diagonale sopra la pr<strong>in</strong>cipale<br />

read(*,*)(f1(i), i=2,n)<br />

diagonale pr<strong>in</strong>cipale<br />

read(*,*)(f2(i), i=1,n)<br />

diagonale sotto la pr<strong>in</strong>cipale<br />

read(*,*)(f3(i), i=1,n-1)<br />

write(*,*)'Diagonali della matrice tridiagonale F1'<br />

diagonale sopra la pr<strong>in</strong>cipale<br />

read(*,*)(e1(i), i=2,n)<br />

diagonale pr<strong>in</strong>cipale<br />

read(*,*)(e2(i), i=1,n)<br />

diagonale sotto la pr<strong>in</strong>cipale<br />

read(*,*)(e3(i), i=1,n-1)<br />

costruzione delle matrici diagonali<br />

do i=1,n<br />

do j=1,n<br />

if(j.eq.i) then<br />

e(i,j)=e2(i)<br />

f(i,j)=f2(i)<br />

else<br />

if(j.eq.i-1) then<br />

e(i,j)=e1(i)<br />

f(i,j)=f1(i)<br />

else<br />

14


if(j.eq.i+1) then<br />

e(i,j)=e3(i)<br />

f(i,j)=f3(i)<br />

else<br />

e(i,j)=0<br />

f(i,j)=0<br />

endif<br />

endif<br />

endif<br />

enddo<br />

enddo<br />

write(*,*)'elementi dei term<strong>in</strong>i noti'<br />

read(*,*)(b1(i), i=1,n), (b2(i), i=1,n)<br />

do i=1,n<br />

write(*,*)(e(i,j), j=1,n)<br />

enddo<br />

do i=1,n<br />

do j=1,n<br />

e(i,j)=e(i,j)/d1(j)<br />

enddo<br />

enddo<br />

do i=1,n<br />

write(*,*)(e(i,j), j=1,n)<br />

enddo<br />

call matmat(e,f,lf,n,n,ld)<br />

do i=1,n<br />

write(*,*)(lf(i,j), j=1,n)<br />

enddo<br />

do i=1,n<br />

do j=1,n<br />

if(j.eq.i) then<br />

u2(i,j)=d2(i)-lf(i,j)<br />

else<br />

u2(i,j)=-lf(i,j)<br />

endif<br />

enddo<br />

enddo<br />

do i=1,n<br />

write(*,*)(u2(i,j), j=1,n)<br />

enddo<br />

call matmat(e,b1,ly,n,1,ld)<br />

write(*,*)(ly(i), i=1,n)<br />

do i=1,n<br />

b2(i)=b2(i)-ly(i)<br />

enddo<br />

write(*,*)(b2(i), i=1,n)<br />

call gauss(u2,x2,b2,n,ld)<br />

write(*,*)(x2(i), i=1,n)<br />

call matmat(f1,x2,fx,n,1,ld)<br />

write(*,*)(fx(i), i=1,n)<br />

do i=1,n<br />

15


c1=b1(i)-fx(i)<br />

enddo<br />

write(*,*)(c1(i), i=1,n)<br />

do i=1,n<br />

x1(i)=c1(i)/d1(i)<br />

enddo<br />

write(*,*)(x1(i), i=1,n)<br />

write(*,3)(x1(i), i=1,n)<br />

stop<br />

close(3)<br />

end<br />

NORMA di un VETTORE<br />

real function norma(x,n,ld)<br />

real x(*)<br />

s=0.0<br />

do i=1,n<br />

s=s+x(i)**2<br />

enddo<br />

norma=sqrt(s)<br />

return<br />

end<br />

NORMA all'INFINITO di una MATRICE QUADRATA<br />

function ormat(a,n,ld)<br />

real a(ld,*)<br />

amax=0.0<br />

do i=1,n<br />

s=0.0<br />

do j=1,n<br />

s=s+abs(a(i,j))<br />

enddo<br />

if (amax.lt.s) then<br />

amax=s<br />

endif<br />

enddo<br />

ormat=amax<br />

return<br />

end<br />

16


NORMA all'INFINITO di una MATRICE QUALSIASI<br />

function ormatq(a,m,n,ld)<br />

m righe n colonne<br />

real a(ld,*)<br />

amax=0.0<br />

do i=1,m<br />

s=0.0<br />

do j=1,n<br />

s=s+abs(a(i,j))<br />

enddo<br />

if (amax.lt.s) then<br />

amax=s<br />

endif<br />

enddo<br />

ormat=amax<br />

return<br />

end<br />

FUNZIONE PRODOTTO SCALARE fra 2 VETTORI<br />

real function prodscal(x,y,n,ld)<br />

real x(*), y(*)<br />

do i=1,n<br />

p=p+x(i)*y(i)<br />

enddo<br />

prodscal=p<br />

return<br />

end<br />

RISOLUZIONE di SISTEMA Ax=B con il METODO del GRADIENTE CONIUGATO<br />

subrout<strong>in</strong>e gradientec(a,xk,b,k,eps,n,ld)<br />

real a(ld,*), xk(*), b(*), xk1(ld), rk(ld) rk1(ld), wk(ld), wk1(ld), pk(ld), pk1(ld)<br />

kmax deve essere def<strong>in</strong>ito come parameter nel ma<strong>in</strong> del programma<br />

call matvett(a,xk,rk,n,ld)<br />

do i=1,n<br />

rk(i)=b(i)-rk(i)<br />

pk(i)=rk(i)<br />

enddo<br />

do k=0,kmax<br />

if(norma(rk,n,ld).le.eps*norma(b,n,ld)) then<br />

return<br />

endif<br />

17


call matvett(a,pk,wk,n,ld)<br />

den=0.0<br />

do i=1,n<br />

den=den+wk(i)*pk(i)<br />

enddo<br />

alphak=norma(rk,n,ld)<br />

alphak=(alphak**2)/den<br />

do i=1,n<br />

xk1(i)=xk(i)+alphak*pk(i)<br />

rk1(i)=rk(i)-alphak*wk(i)<br />

enddo<br />

betak1=norma(rk1)<br />

betak1=betak1**2<br />

den=norma(rk)<br />

den=den**2<br />

betak1=betak1/den<br />

do i=1,n<br />

pk1(i)=rk1(i)+betak1*pk(i)<br />

enddo<br />

do i=1,n<br />

rk(i)=rk1(i)<br />

pk(i)=pk1(i)<br />

enddo<br />

enddo<br />

return<br />

end<br />

PROVA SCRITTA 15/01/1999: METODO DI NEWTON GLOBALE<br />

program 150199<br />

parameter (ld=100,kmax=100)<br />

real x0(ld), f(ld), fx(ld), jx(ld), dx(ld), z(ld), nfx(ld), fz(ld)<br />

read (*,*) n, lambda, epsilon<br />

read (*,*) (x0(i), i=1,n)<br />

do i=1,n<br />

do j=1,n<br />

f(i,j) = 0<br />

enddo<br />

f(i,i)=4<br />

enddo<br />

do i=2,n<br />

f(i,i-1) = -1<br />

enddo<br />

enddo<br />

do i=3,n<br />

f(i,i-2) = -1<br />

enddo<br />

18


do k=0,kmax<br />

call matvet(f,x0,fx,n,ld)<br />

do 1=1,n<br />

fx(i)=fx(i) + lambda*(e**x0(i))<br />

nfx(i)=-fx(i)<br />

enddo<br />

do i=1,n<br />

do j=1,n<br />

if (i.EQ.j) then<br />

jx(i,j)=f(i,j)<br />

endif<br />

enddo<br />

enddo<br />

call tri<strong>in</strong>f(jx,dx,nfx,n,ld)<br />

do i=1,n<br />

z(i) = x0(i)+ dx(i)<br />

enddo<br />

100 cont<strong>in</strong>ue<br />

call matvet(f,z,fz,n,ld)<br />

do i=1,n<br />

fz(i) = lambda*(e**z(i))<br />

enddo<br />

if (ormvett(fz,n,ld).GE.ormvett(fx,n,ld)) then<br />

do i=1,n<br />

dx(i)=dx(i)/2<br />

z(i)=x0(i) + dx(i)<br />

enddo<br />

goto 100<br />

endif<br />

do i=1,n<br />

x0(i)=z(i)<br />

enddo<br />

call matvet(f,x0,fx,n,ld)<br />

do i=1,n<br />

fx(i)=fx(i) + lambda*(e**x0(i)<br />

enddo<br />

if (ormvet(fx,n,ld).LE.epsilon) then<br />

write(*,*)’soluzione: ‘ (x0(i),i=1,n)<br />

stop<br />

endif<br />

enddo<br />

write(*,*)’soluzione: ‘ (x0(i),i=1,n)<br />

end<br />

PROVA SCRITTA 7/07/1999: RICHIAMA IL METODO DEL GRADIENTE CONIUGATO<br />

program 070799<br />

parameter(ld=100, kmax=1000)<br />

real a(ld,ld), b(ld), x0(ld)<br />

open(unit=3, file='<strong>in</strong>put', format='unformatted', access='sequential', status='old')<br />

19


do i=1,n<br />

read(3,*)(a(i,j), j=1,n)<br />

enddo<br />

read(3,*) (b(i), i=1,n)<br />

read(3,*) (x0(i), i=1,n)<br />

enddo<br />

read(3,*) eps<br />

close(3)<br />

call gradientec(a,x0,b,k,epsn,ld)<br />

open(unit=4, file='output', format='formatted', access='sequential', status='new')<br />

write(*,4)(x0(i), i=1,n), k<br />

close(4)<br />

end<br />

20


CALCOLO della MATRICE INVERSA di una MATRICE TRIANGOLARE INFERIORE<br />

subrout<strong>in</strong>e <strong>in</strong>versatri<strong>in</strong>f(a,z,n,ld)<br />

real a(ld,*), z(ld,*)<br />

do i=1,n<br />

do j=1,n<br />

if(i.eq.j) then<br />

z(i,j)=1/a(j,j)<br />

elseif(i.lt.j) then<br />

z(i,j)=0.0<br />

elseif(i.gt.j) then<br />

s=0.0<br />

do k=j,i-1<br />

s=s+a(i,k)*a(k,j)<br />

enddo<br />

z(i,j)=((-1)**(i+j))*s/a(i,i)<br />

endif<br />

enddo<br />

enddo<br />

return<br />

end<br />

PROVA SCRITTA 11/01/2000: SISTEMA LINEARE DI m EQUAZIONI LINEARI A T x = b<br />

program 11012000<br />

parameter(ld=100)<br />

real a(ld,ld), xk(ld), b(ld), ar(ld), xk1(ld), diff(ld)<br />

legge il numero di righe (n) e di colonne (m) di A<br />

read(*,*) n,m<br />

do i=1,m<br />

read(*,*)(a(i,j), j=1,n)<br />

enddo<br />

read(*,*)(xk(i), i=1,n)<br />

read(*,*)(b(i), i=1,m)<br />

read(*,*) eps<br />

write(*,*)'Norma <strong>in</strong>f<strong>in</strong>ito di A = ', ormatq(a,n,m,ld)<br />

k=0<br />

100 cont<strong>in</strong>ue<br />

r=mod(k,m)+1<br />

do i=1,n<br />

ar(i)=a(i,r)<br />

enddo<br />

alphak=(b(r)-prodscal(ar,xk,n,ld))/prodscal(ar,ar,n,ld)<br />

do i=1,n<br />

xk1(i)=xk(i)+alphak*ar(i)<br />

diff(i)=xk1(i)-xk(i)<br />

enddo<br />

if(ormavett(diff,n,ld).le.eps*ormavett(xk1,n,ld)) then<br />

21


goto 1000<br />

endif<br />

k=k+1<br />

do i=1,n<br />

xk(i)=xk1(i)<br />

enddo<br />

goto 100<br />

1000 cont<strong>in</strong>ue<br />

write(*,*)'iterazione ', k<br />

write(*,*)'risultato = ',(xk1(i), i=1,n)<br />

end<br />

PRODOTTO di KRONECKER<br />

subrout<strong>in</strong>e cronecker(a,b,c,n,ld1,ld2)<br />

ld2=ld1**2<br />

real a(ld1,*), b(ld1,*), c(ld2,*)<br />

<strong>in</strong>teger p, q<br />

p=0<br />

do i=1,n<br />

q=0<br />

do j=1,n<br />

do k=1,n<br />

do l=1,n<br />

c(k+p,l+q)=a(i,j)*b(k,l)<br />

enddo<br />

enddo<br />

q=q+n<br />

enddo<br />

p=p+n<br />

enddo<br />

return<br />

end<br />

PROVA SCRITTA 23/02/2000: CALCOLO DELLA MATRICE p(A) = I + A + A 2 + … + A K<br />

program 23022000<br />

parameter(ld=100)<br />

real a(ld,ld), pa(ld,ld), ak(ld,ld), ak1(ld,ld)<br />

read(*,*) n, k<br />

do i=1,n<br />

read(*,*)(a(i,j), j=1,n)<br />

enddo<br />

do i=1,n<br />

do j=1,n<br />

22


if(i.eq.j) then<br />

pa(i,j)=a(i,j)+1.0<br />

else<br />

pa(i,j)=a(i,j)<br />

endif<br />

ak(i,j)=a(i,j)<br />

enddo<br />

enddo<br />

do l=2,k<br />

call matqmatq(a,ak,ak1,n,n,n,ld)<br />

call sommamatrici(pa,ak1,pa,n,ld)<br />

do i=1,n<br />

do j=1,n<br />

ak(i,j)=ak1(i,j)<br />

enddo<br />

enddo<br />

enddo<br />

write(*,*)'Norma <strong>in</strong>f<strong>in</strong>ito = ',ormat(pa,n,ld)<br />

end<br />

23

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!