esercizi fortran

Download Esercizi Fortran

Post on 28-Dec-2015

15 views

Category:

Documents

4 download

Embed Size (px)

DESCRIPTION

fORTRAN Exercises

TRANSCRIPT

  • 1

    NOTAZIONI ..................................................................................................................................................... 2 SOMMA DI 2 MATRICI QUADRATE ........................................................................................................... 2 PRODOTTO MATRICE (QUADRATA) PER VETTORE ............................................................................. 2 PRODOTTO DI 2 MATRICI QUALSIASI C=A*B ........................................................................................ 2 PRODOTTO di una MATRICE QUALSIASI (mxn) per un VETTORE......................................................... 3 TRASPOSTA di una MATRICE ...................................................................................................................... 3 CONTROLLO DI SIMMETRIA DI UNA MATRICE (QUADRATA)........................................................... 3 CONTROLLO DI MATRICE STRETTAMENTE DIAGONALE DOMINANTE PER RIGHE ................... 4

    1VERSIONE: .............................................................................................................................................. 4 2VERSIONE: .............................................................................................................................................. 4

    METODO DELLE POTENZE per il CALCOLO dell'AUTOVALORE MAX IN MODULO........................ 5 di una MATRICE (SIMMETRICA) A.............................................................................................................. 5 CONTROLLO DI MATRICE con a(i,i) > 0 e a(i,j) 0 e a(i,j)

  • 2

    NOTAZIONI Nel Fortran tutte le costanti e variabili che iniziano per:

    i j k l m n

    sono implicitamente dichiarate di tipo integer SOMMA DI 2 MATRICI QUADRATE subroutine sommamatrici(a,b,c,ld,n) real a(ld,*), b(ld,*), c(ld,*) do i = 1, n do j = 1, n c(i,j) = a(i,j) + b(i,j) enddo enddo return end PRODOTTO MATRICE (QUADRATA) PER VETTORE subroutine matvet(a,v,b,n,ld) real a(ld,*), v(*), b(*) do i=1,n b(i)=0 do j=1,n b(i)=b(i)+a(i,j)*v(j) enddo enddo return end PRODOTTO DI 2 MATRICI QUALSIASI C=A*B subroutine matqmatq(a,b,c,ma,n,nb,ld) ma = righe di a,c n = colonne di a e righe di b, nb = colonne di b,c real a(ld,*), b(ld,*), c(ld,*) do i=1,ma do j=1,nb c(i,j)=0.0 do k=1,n c(i,j)=c(i,j)+a(i,k)*b(k,j) enddo enddo enddo return end

  • 3

    PRODOTTO di una MATRICE QUALSIASI (mxn) per un VETTORE subroutine matqvet (a,v,b,m,n,ld) m=righe di a, n=colonne di a e righe di v real a(ld,*), v(*), b(*) do i = 1,m b(i) = 0.0 do k = 1,n b(i) = b(i) + a(i,k) * v(k) enddo enddo return end TRASPOSTA di una MATRICE subroutine trasposta(a,at,m,n,ld) real a(ld,*), at(ld,*) m=numero righe n=numero colonne (di A) do i=1,n do j=1,m at(i,j)=a(j,i) enddo enddo CONTROLLO DI SIMMETRIA DI UNA MATRICE (QUADRATA) subroutine simmetrica(a,n,ld,info) real a(ld,*) info=0 do i=1,n do j=1,i-1 if (a(i,j).EQ.a(j,i) then info=1 else info=0 write(*,*)'Matrice non simmetrica' stop endif enddo enddo return end

  • 4

    CONTROLLO DI MATRICE STRETTAMENTE DIAGONALE DOMINANTE PER RIGHE

    1VERSIONE: subroutine ddr(a,n,ld,info) real a(ld,*) info=0 s=0 do i=1,n do j=i,i-1 s=s+abs(a(i,j)) enddo do j=i+1,n s=s+abs(a(i,j)) enddo if(abs(a(i,i)).GT.s) then info=1 else info=0 write(*,*)'Matrice non strett. diag. dom. per righe' stop endif return end

    2VERSIONE: subroutine ddr(a,n,ld,info) real a(ld,*) info=0 s=0 do i=1,n do j=i,n if(i.NE.j) then s=s+abs(a(i,j)) endif enddo if(abs(a(i,i)).GT.s) then info=1 else info=0 write(*,*)'Matrice non strett. diag. dom. per righe' stop endif return end

  • 5

    METODO DELLE POTENZE per il CALCOLO dell'AUTOVALORE MAX IN MODULO di una MATRICE (SIMMETRICA) A program metodopotenze parameter(ld=20,kmax=100) real a(ld,ld), v0=(ld), u(ld), gamma(kmax), beta(kmax) write(*,*)'ordine di A' read(*,*), n write(*,*)'elementi di A' do i=1,n read(*,*)(a(i,j), j=1,n) enddo info=0 call simmetrica(a,n,ld,info) if(info.EQ.1) then write(*,*)'OK matrice simmetrica' endif call ddr(a,n,ld,info) if(info.EQ.1) then write(*,*)'OK matrice strett. diag. dom. per righe' endif write(*,*)'Tolleranza e iterato iniziale con norma=1' read epsilon, (v0(i), i=1,n) do k=1, kmax call matvet(a,v0,u,n,ld) CALL PRODOTTO MATRICE x VETTORE beta(k)=0.0 do i=1,n beta(k)=beta(k)+u(i)*v0(i) enddo if(k.NE.1) then if(abs(beta(k)-beta(k-1)).LE.epsilon*abs(beta(k))) then write(*,*)'iterazione #', k write(*,*)'autovalore max ', beta(k) write(*,3) k, (v0(i), i=1, n) stop endif endif gamma(k)=0 do i=1,n gamma(k)=gamma(k)+u(i)*u(i) enddo gamma(k)=sqrt(gamma(k)) do i=1,n v0(i)=u(i)/gamma(k) enddo enddo write(*,*)'iterazione max #', kmax write(*,*)'autovalore max #', beta(kmax) stop end

  • 6

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

  • 7

    write(*,*),'matrice con el. non diag >0' stop endif enddo if((abs(a(i,j)).GT.som1).AND.(a(i,i).GT.0)) then info=1 else info=0 write(*,*)'matrice non strett. diag. dom. o con el diag.

  • 8

    real x(ld) ind=1 do i=2,n if(abs(x(i)).gt.abs(x(ind))) ind=i enddo ormavett=abs(x(ind)) return end

  • 9

    METODO DELLA MEDIA ARITMETICA per la RISOLUZIONE di SISTEMI LINEARI program mediaaritmetica parameter(ld=20,kmax=100) real a(ld,ld), b(ld), x0(ld), xn(ld), m1(ld,ld), m2(ld,ld), m3(ld,ld), real m4(ld,ld), c1(ld), c2(ld), y(ld), z1(ld), z2(ld) write(*,*) 'ordine problema, ro, tolleranza' read(*,*) n, ro, epsilon write(*,*)'matrice per righe' do i=1,n read(a(i,j), j=1,n) enddo write(*,*)'termine noto ed interazione iniziale' do i=1,n read(*,*) b(i), x0(i) enddo Controlla che la matrice sia diag. strett. domin., che a(i,i)>0 e a(i,j)

  • 10

    call triinf(m1,z1,c1,n,ld) call trisup(m3,z2,c2,n,ld) do i=1,n xn(i)=(z1(i)+z2(i))/2 enddo do i=1,n x0(i)=xn(i)-x0(i) enddo if(orma(x0,n,ld).LE.(epsilon*orma(xn,n,ld))) then write(*,*)'iterazione # ',k write(*,*)'x= ',(xn(i),i=1,n) stop else write(*,*)'norma',orma(x0,n,ld),orma,xn,n,ld) endif do I=1,n x0(i)=xn(i) enddo enddo write(*,*)'iterazione # ',kmax write(*,*)'x= ',(xn(i), I=1,n) end RISOLUZIONE DI SISTEMA LINEARE mediante l'ALGORITMO di GAUSS (SENZA PIVOTING) subroutine gauss(a,b,n,ld) real a(ld,*), b(*) do k=1,n-1 do i=k+1,n a(i,k)=a(i,k)/a(k,k) b(i)=b(i)-a(i,k)*b(k) do j=k+1,n a(i,j)=a(i,j)-a(i,k)*a(k,j) enddo enddo enddo return end + subroutine risolvi(a,x,b,n,ld) (risoluzione con A triang. sup.) real a(ld,*), x(*), b(*) x(n)=b(n)/a(n,n) do i=n-1,1,-1 som=0 do j=i+1,n som=som+a(i,j)*x(j) enddo x(i)=(b(i)-som)/a(i,i)

  • 11

    enddo return end

    OPPURE(in una sola subroutine) subroutine gausstot(a,x,b,n,ld) real a(ld,*), b(*) Passo 1: ricava a triang. sup. e il b corrispondente do k=1,n-1 do i=k+1,n a(i,k)=a(i,k)/a(k,k) b(i)=b(i)-a(i,k)*b(k) do j=k+1,n a(i,j)=a(i,j)-a(i,k)*a(k,j) enddo enddo enddo Passo 2: risolve il sistema con sostituzione all'indietro x(n)=b(n)/a(n,n) do i=n-1,1,-1 som=0 do j=i+1,n som=som+a(i,j)*x(j) enddo x(i)=(b(i)-som)/a(i,i) enddo CALCOLO dell'AUTOVALORE MINIMO di una MATRICE (QUADRATA) con il METODO DELLE POTENZE INVERSE program autovalmin parameter(ld=20,kmax=100) real a(ld,ld), v0(ld), u(ld), beta(kmax) write(*,*)'dimensione matrice' read(*,*), n write(*,*)'matrice per righe' do i=1,n read(*,*)(a(i,j), j=1,n) enddo write(*,*)'tolleranza e vettore normalizzato' read(*,*) eps, (v0(i), i=1,n) do k=1,kmax call gauss(a,v0,n,ld) call risolvi(a,u,v0,n,ld) beta(k)=0.0 do i=1,n

  • 12

    beta(k)=beta(k)+u(i)*v0(i) enddo if(k.NE.1) then if(abs(beta(k)-beta(k-1)).LE.eps*abs(beta(k))) then open(unit=3, name='nomefile', form='formatted', status='new') write(*,3) 'iterazione n ', k write(*,3) 'autovalore minimo = ',1/beta(k) write(*,3) (v0(i), i=1,n) close(3) stop endif endif gamma(k)=0.0 do i=1,n gamma(k)=gamma(k)+u(i)*u(i) enddo gamma(k)=gamma(k)*v0 gamma(k)=sqrt(gamma(k)) do i=1,n v0(i)=u(i)/gamma(k) enddo enddo open(unit=3, name='nomefile', form='formatted', status='new') write(*,3) 'iterazione n ', kmax write(*,3) 'autovalore minimo = ',1/beta(kmax) write(*,3) (v0(i), i=1,n) close(3) end RISOLUZIONE di un SISTEMA LINEARE Ax=b con MATRICE A PENTADIAGONALE con il METODO di GAUSS (SENZA PIVOTING) subroutine gausspentad(A,x,b,n,ld) real a(ld,*), x(*), b(*) Passo 1: ricava a triang. sup. e il b corrispondente do k=1,n-1 do i=k+1,k+2 a(i,k)=a(i,k)/a(k,k) b(i)=b(i)-a(i,k)*b(k) do j=k+1,k+2 a(i,j)=a(i,j)-a(i,k)*(k,j) enddo enddo enddo Passo 2: risolve il sistema con sostituzione all'indietro x(n)=b(n)/a(n,n) do i=n-1,1,-1 s=0 do j=i+1,n

  • 13

    s=s+a(i,j)*b(j) enddo x(i)=(b(i)-s)/a(i,i) enddo return end RISOLUZIONE di un SISTEMA LINEARE Ax=b con MATRICE A EPTADIAGONALE con il METODO di GAUSS (SENZA PIVOTING) subroutine gausseptad(A,x,b,n,ld) real a(ld,*), x(*), b(*) Passo 1: ricava a triang. sup. e il b corrispondente do k=1,n-1 do i=k+1,k+3 a(i,k)=a(i,k)/a(k,k) b(i)=b(i)-a(i,k)*b(k) do j=k+1,k+3 a(i,j)=a(i,j)-a(i,k)*(k,j) enddo enddo enddo Pass

Recommended

View more >