Написание программы на языке ФОРТРАН, реализующей требуемые действия над матрицами произвольной размерности: умножение ленточной симметричной матрицы на вектор (Лабораторная работа № 3)

Страницы работы

Содержание работы

Министерство образования и науки Российской Федерации

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

Кафедра прикладной математики

Лабораторная работа №3

По дисциплине

«Программирование вычислений»

Факультет: ПМИ

Группа: ПМ-64

Студенты: Ганжа Е.М.

                   Матвеева Н.М.

Преподаватели: Рояк М.Э.

                            Рояк С.Х.

Вариант: 10.1

Новосибирск, 2008

1.  Условие задачи

Написать программу, реализующую на языке ФОРТРАН требуемые действия над матрицами произвольной (задаваемой пользователем) размерности: умножение ленточной симметричной матрицы на вектор (с выделением диагонали).

2.  Представление матрицы

А – исходная квадратная матрица, размерностью N и с полушириной ленты L. AL  прямоугольная матрицы размерностью N*(L-1), в которых хранятся нижний треугольник (так как матрица симметричная верхний треугольник хранить не надо) по строкам, доопределяется нулями в начале диагонали; DA – диагональ матрицы

3.  Структура программы

Программы включает в себя 5 модулей:

main.for – программа перемножения матрицы на столбец, исходные данные хранятся в текстовом файле    

to_bin.for – программа перевода текстового файла в файл прямого доступа

main_for_bin – программа перемножения матрицы на столбец, исходные данные хранятся в файле прямого доступа

generator.for – программа генерации файлов прямого доступа с матрицей, размерность которой задается пользователем

print.for – программа распечатки матрицы ленточного формата (симметричной) в виде плотной матрицы

4.  Текст программы

main.for

     ! funktsia vvoda matritsi

      SUBROUTINE input_matrix

      COMMON /array/ a(200000000)

      COMMON /size/ max_i, max_j

      COMMON /error/ er

      er=0

      OPEN(1,FILE='in_mat.txt',ERR=10)

      OPEN(2,FILE='in_diag.txt',ERR=10)

      READ(1,*,ERR=11) max_i,max_j      

      IF (((max_i.GT.max_j).OR.(max_i.LE.0)).OR.(max_i*(max_j+2)

     *.GT.200000000)) THEN

         er=1

         GOTO 6

      ENDIF

      k=max_j

      DO 7 j=1,max_j       

7        READ(2,*,ERR=11) a((max_i-1)*max_j+j)                 

      DO 5 j=1,max_j     

5        READ(1,*,ERR=11) (a(i),i=(max_i-1)*(j-1)+1,(max_i-1)*(j-1)

     *+max_i-1)                

      GOTO 6

10    PRINT *,'O6ibka otkritiya faila'

      er=1

      GOTO 6

11    PRINT *,'O6ibka 4teniya 1'

      er=1

      GOTO 6

6     CLOSE(1)

      CLOSE(2)   

      END

      !funktsia vvoda vectora

      SUBROUTINE input_vector

      COMMON /array/ a(200000000)

      COMMON /error/ er

      COMMON /size/ max_i,max_j

      OPEN(3,FILE='in_vec.txt',ERR=20)

      READ(3,*,ERR=21) max_k

      IF (max_k.NE.max_j) THEN

         er=1

         GOTO 16

      ENDIF    

      DO 15 i=1,max_j,1        

15       READ(3,*,ERR=21) a(max_i*max_j+i)      

      GOTO 16   

20    PRINT *,'O6ibka otkritiya faila'

      er=1

      GOTO 16

21    PRINT *,'O6ibka 4teniya 2'

      er=1

      GOTO 16

16    CLOSE(3)   

      END 

      !funktsia umnozhenia matritsi na vector

      SUBROUTINE multiplication(d_mat,diag,vec,rez)          

      COMMON /error/ er

      COMMON /size/ max_i,max_j 

      DIMENSION d_mat(max_i-1,max_j), diag(max_j), vec(max_j),

     *rez(max_j)                

      DO 28 j=1,max_i-1

         rez(j)=rez(j)+diag(j)*vec(j)

         k=2

         DO 28 i=1,max_i-1

            IF (d_mat(i,j).NE.0) THEN

               rez(j)=rez(j)+vec(i+j-max_i)*d_mat(i,j)              

               rez(j-k)=rez(j-k)+vec(i+j-max_i+k)*d_mat(i,j)

            ENDIF

28          k=k-1

      DO 29 j=max_i,max_j

         rez(j)=rez(j)+diag(j)*vec(j)

         k=2

         DO 29 i=1,max_i-1           

            rez(j)=rez(j)+vec(i+j-max_i)*d_mat(i,j)           

            rez(j-k)=rez(j-k)+vec(i+j-max_i+k)*d_mat(i,j)        

29       k=k-1

      END

      !functsia vivoda vectora resultata

      SUBROUTINE output

      COMMON /array/ a(200000000)

      COMMON /size/ max_i,max_j

      COMMON /error/ er

      OPEN (4,FILE='output.txt',ERR=40)

      DO 35 j=max_j*(max_i+1)+1,max_j*(max_i+2)

35       WRITE (4,31,ERR=37) a(j)

      GOTO 36

31    FORMAT (E10.4)

40    PRINT *,'O6ibka otkritiya faila'

      er=1

      GOTO 36

37    PRINT *,'O6ibka zapisi'

      er=1

      GOTO 36

36    CLOSE(4)   

      END 

      !glavnaya funktsia

      PROGRAM main

      COMMON /error/ er

      COMMON /array/ a(200000000)

      COMMON /size/ max_i,max_j     

      CALL input_matrix

      IF (er.NE.0) GOTO 50

      CALL input_vector

      IF (er.NE.0) GOTO 50

      CALL multiplication(a(1),a((max_i-1)*max_j+1),a(max_i*max_j+1),

     *a((max_i+1)*max_j+1))

      CALL output

      IF (er.NE.0) GOTO 50

      PRINT *,'programma vipolnena, resultat v faile'

      GOTO 51

50    PRINT *,'programma ne vipolnena'

51    PAUSE

      END

to_bin.for

 ! perevod textovih failov v 2i4nie

      PROGRAM to_bin

      DIMENSION s(2000000)

      OPEN(1,FILE='in_mat.txt',ERR=10)

      OPEN(2,FILE='in_vec.txt',ERR=10)

      OPEN(5,FILE='in_diag.txt',ERR=10)

      OPEN(3,FILE='in_mat.bin',ACCESS='direct',RECL=4,ERR=10)

      OPEN(4,FILE='in_vec.bin',ACCESS='direct',RECL=4,ERR=10)

      OPEN(6,FILE='in_diag.bin',ACCESS='direct',RECL=4,ERR=10)

      !perevod matrirsi

      READ(1,*,ERR=11) max_i,max_j

      WRITE(3,REC=1,ERR=11) max_i

      WRITE(3,REC=2,ERR=11) max_j  

      l=2

      DO 5 i=1,max_j

         READ(1,*,ERR=11) (s(k),k=1,max_i-1,1)        

         DO 5 j=1,max_i-1

Похожие материалы

Информация о работе