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

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

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

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

Новосибирский государственный технический университет

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

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

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

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

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

Группа: ПМ-64

Студенты: Ведерникова М.А., Довгаль С.Ю., Чепарев С.С.

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

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

1.  Задание

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

2.  Теоретическая часть

Ленточный строчно-столбцовый формат.

А – исходная квадратная матрица, размерностью N и с полушириной ленты L, доопределенная нулями в начале диагоналей. AL и AU – прямоугольные матрицы размерностью N*L, в которых хранятся нижний треугольник по строкам и верхний треугольник по столбцам соответственно. В задании лабораторной работы задается симметричная матрица и не требуется хранить диагональ отдельно, поэтому все данные о содержимом матрицы хранятся в AL.

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

модуль mul.for – программа перемножения матрицы на столбец с использованием файлов последовательного доступа

subroutine input(x_mem)

      dimension x_mem(1000000)!pamyat' vydelena v glavnoi programme

      open(1,file='x_par.txt')!otkryvaem faily

      open(2,file='x_matrix.txt')

      open(3,file='x_vector.txt')

      read(1,*) n,l!chitaem parametry

      x_mem(1)=n

      x_mem(2)=l

      if(l.ge.n.or.l.le.0) then!proverka na korrectnost' dannyh

      print *, 'Nevernye dannye'

      pause

      stop

      endif

      if(n*l+2*n+2.gt.1000000) then!proverka na perpolnenie

      print *, 'Perepolnenie pamyati'

      pause

      stop

      endif

      read(2,*) (x_mem(i+2),i=1,n*l)!chitaem AL

      read(3,*) (x_mem(i+n*l+2),i=1,n)!chitaem vektor

      close(1)

      close(2)

      close(3)

      end!input

      subroutine multip(n,l,AL,vect,rez)!podprogramma peremnozheniya

      dimension AL(l,n),vect(n),rez(n)

      do i=1,n

        jb=max(1,l-i+1)!otkuda nachinat'

        m=max(1,i-l+1)

        rez(i)=0

        do j=jb,l

        rez(i)=rez(i)+AL(j,i)*vect(m)!idem po stroke

        m=m+1

        enddo

        j=l-1

        do while(j.gt.0 .and. i+l-j.le.n)

        rez(i)=rez(i)+AL(j,i+l-j)*vect(m)!potom po diagonali

        m=m+1

        j=j-1

        enddo

      enddo

      end!multip

      subroutine output(n,rez)

      dimension rez(n)

      open(4,file='out.txt')!otkryvaem  fail

      write(4,99) (rez(i),i=1,n)!pishem

99    format(g11.2) 

      end!output

      Program matrix

      dimension x_mem(1000000)!vydelenie pamyati

      call input(x_mem)!vvod

      n=x_mem(1)

      l=x_mem(2)

      call multip(n,l,x_mem(3),x_mem(n*l+3),x_mem(n*l+n+3)) !sobstvenno schet

      call output(n,x_mem(n*l+n+3))!vyvod

      print *,'Success'

      pause

      end!main

модуль tobin.for – программа перевода данных из файла с последовательным доступом в файл с прямым доступом

subroutine input(x_mem)

      dimension x_mem(1000000)!pamyat' vydelena v glavnoi programme

      open(1,file='x_par.txt')!otkryvaem faily

      open(2,file='x_matrix.txt')

      open(3,file='x_vector.txt')

      read(1,*) n,l!chitaem parametry

      x_mem(1)=n

      x_mem(2)=l

      if(l.ge.n.or.l.le.0) then!proverka na korrectnost' dannyh

      print *, 'Nevernye dannye'

      pause

      stop

      endif

      if(n*l+2*n+2.gt.1000000) then!proverka na perpolnenie

      print *, 'Perepolnenie pamyati'

      pause

      stop

      endif

      read(2,*) (x_mem(i+2),i=1,n*l)!chitaem AL

      read(3,*) (x_mem(i+n*l+2),i=1,n)!chitaem vektor

      close(1)

      close(2)

      close(3)

      end!input

      program tobin

      dimension x_mem(1000000)!vydelenie pamyati

      call input(x_mem)!vvod

      n=x_mem(1)

      l=x_mem(2)

      open(unit=11,access='direct',recl=l*4,file='x_matrix.bin')

      open(unit=12,access='direct',recl=n*4,file='x_vector.bin')

      do i=1,n

      write(11,rec=i) (x_mem((i-1)*l+j+2),j=1,l) !pishem AL

      enddo

      write(12,rec=1) (x_mem(i+n*l+2),i=1,n)

      !pishem vektor

      print *,'Success'

      pause

      end!main

модуль muld.for – программа перемножения матрицы на столбец с использованием файлов с прямым доступом

      subroutine input(x_mem)

      dimension x_mem(1000000)!pamyat' vydelena v glavnoi programme

      open(1,file='x_par.txt')!otkryvaem faily

      read(1,*) n,l!chitaem parametry

      x_mem(1)=n

      x_mem(2)=l

      if(l.ge.n.or.l.le.0) then!proverka na korrectnost' dannyh

      print *, 'Nevernye dannye'

      pause

      stop

      endif

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

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