Fortran experiment_8 实验报告

黄佳玮 2014301020139 物基二班

8.1 ex0801.f90

要求

编写一个子程序,对任意阶方阵进行上三角化。并编写主程序演示该子程序的功能。

代码

program ex0801

implicit none

real,allocatable::a(:,:)
integer::n,i,j,status
write(*,'(a,$)')'input'
read(*,*) n
allocate(a(n,n),stat=status)
if (status/=0) write(*,*) 'error'
a=0
write(*,*)'input the number'
do i=1,n
  do j=1,n
        read(*,*) a(i,j)
  end do
end do

call upperTriangularMatrix(n,a)
call showResult(n,a)

end

subroutine check(k,n,a)
implicit none
integer::n,i,j,k
real::a(n,n)
if(a(k,k)/=0) then
  return
else
  do i=k,n
    if(a(i,k)/=0) then
      call swap(i,k,n,a)
      return
    end if
  end do
end if
end subroutine check

subroutine swap(i,k,n,a)
implicit none
integer::n,i,j,k
real::a(n,n),temp
do j=1,n
  temp=a(i,j)
  a(i,j)=a(k,j)
  a(k,j)=temp
end do
end subroutine swap

subroutine upperTriangularMatrix(n,a)
implicit none
integer::n,i,j,k
real::a(n,n),temp
do k=1,n-1
  call check(k,n,a)
  do i=k+1,n
    if(a(k,k)/=0) then
      temp=a(i,k)/a(k,k)
      do j=k,n
        a(i,j)=-a(k,j)*temp+a(i,j)
      end do
    end if
  end do
end do
return
end subroutine upperTriangularMatrix

subroutine showResult(n,a)
implicit none
integer::n,i,j
real::a(n,n)
write(*,'(a,i2,a)') 'result'
do i=1,n
    do j=1,n
        write(*,'(f8.1,$)') a(i,j)
    end do
    write(*,*) ' '
end do
return
end subroutine showResult

结果

Fortran experiment_8 实验报告_第1张图片

分析

  • 描述算法
    主程序:
    首先建立一个n*n的矩阵,也就是多维数组,动态分配其大小,输入阶数以及矩阵中各元素的值,调用子程序upperTriangularMatrix(n,a)(其中又包括子程序check,check中又包括子程序swap),再调用showResult,结束程序。
    子程序:
    upperTriangularMatrix(n,a):
    首先检查矩阵对角线上有没有值为零的项, 确认没有之后选取要进行操作的一行,乘以它与下一行的比值后再减去下一行,重复操作,即可得到上三角化的矩阵。
    check(k,n,a):
    检查矩阵对角线上有没有值为零的项,若没有则回到upperTriangularMatrix,若有,则找到该列上不为零的另一行,进入swap程序。
    swap:
    将check中选定的两行中所对应的每一项交换位置,使对角线上的项不为零。
    showResult(n,a):
    按照矩阵的形式输出结果。
  • 分析缺陷
    输入的形式只能一个数一行,容易出错,如果能在输入数据时就以矩阵的形式读数据会更好一些,也方便校对。另外如果两行数据基本相同,只有一个数字有较小的区别,则计算结果可能会出错。

你可能感兴趣的:(Fortran experiment_8 实验报告)