Esercizi in Fortran - Progettoatena.It
Esercizi in Fortran - Progettoatena.It
Esercizi in Fortran - Progettoatena.It
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