高斯消元法Fortran90程序
- 格式:doc
- 大小:35.50 KB
- 文档页数:3
fortran90整理1语句编译1.Build—Compile:编译;Build—Build:连接;Build—Exetuce:运⾏;或单击⼯具栏相应按钮。
注意:a、保存⽂件时将⾃动创建同名的project⽂件,形成*.dsp⽂件;b、同时还将⾃动创建同名的workspace,形成*.opt和*.dsw⽂件;c、编译连接后⾃动形成Debug⽬录,该⽬录中存放编译连接后⽂件。
如:*.obj,*.lnk,*.exe等2.Free Format(⾃由格式)1.!感叹号后⾯的⽂本都是注释。
2.每⾏可以编写132个字符。
3.⾏号放在每⾏程序的最前⾯。
4.⼀⾏程序代码的最后如果是符号&,代表下⼀⾏程序会和这⼀⾏连接。
如果⼀⾏程序代码的开头是符号&,代表它会和上⼀⾏程序连接。
3.书写格式⾏的书写(⾏的长度、分⾏、续⾏)1⼀⾏可以是0~132个字符,空格有意义,2语句最长不超过2640个字符3⼀⾏可以有多个语句,⽤“;”分隔4⼀个语句可分⾏写,读⾏标记为&(放在尾部),但如为关键字,⾸尾均加&。
5最多可有511个续⾏。
4.语句的分类注释语句:!后的所有字符都被编译器忽略1.可独占⼀⾏,可在其它语句之后,a)空⾏为注释⾏(固定格式⽤C和*)2.说明语句:⽤于说明变量的类型、属性等3.可执⾏语句:输⼊、赋值、输出……5.语句有位置规定:说明语句必须出现在可执⾏语句之前,格式说明语句(FORMAT语句)除外。
6.标志符⼩结注释标志符:1⾃由格式:!固定格式:C *2语句分隔符:分号;(仅⾃由格式可以使⽤)3续⾏符:⾃由格式:&4申明标号:1到5位⽆符号整数5空格:关键字、变量、常量内部不能⽤空格,但相邻两者之间须⽤空格6.FORTRA90源程序基本结构1、FORTRAN90程序是⼀种分块结构,由若⼲个程序单元块组成:主程序、外部⼦程序、模块、块数据单元⽆论是主程序单元,还是⼦程序单元,都是独⽴的程序单位,应该独⽴编写,它们的形式相似。
本文末给出Gauss-Jordan消去法的Fortran90源程序。
!/************************************************************* !程序:Gauss_Jordan消去法!过程:Gauss_Jordan(aa,b,n,sgn)!作用:aa为方阵,b为aa的逆,n为aa的阶! sgn为标识符,1表示求逆成功,0表示求逆失败!调用格式为:call Gauss_Jordan(aa,b,n,sgn)!*************************************************************/ subroutine Gauss_Jordan(aa,b,n,sgn)implicit noneinteger(4):: n,sgnreal(8):: aa(n,n),b(n,n)integer(4):: i,j,kreal(8),allocatable:: a(:,:)real(8):: tallocate(a(n,n))a=aa ! a代替aa进行运算sgn=1! 初始化b为单位阵do i=1,ndo j=1,nif(i==j) thenb(i,j)=1elseb(i,j)=0end ifend doend do! Gauss_Jordan消去法过程do k=1,nif(a(k,k)==0) thensgn=0;EXITend if! 化第k行使得a(k,k)为1t=1.0d0/a(k,k)do j=k,na(k,j)=a(k,j)*tend dodo j=1,nb(k,j)=b(k,j)*tend do! 完成第k列的计算do i=1,nif(i/=k)thent=a(i,k)do j=k,na(i,j)=a(i,j)-a(k,j)*tend dodo j=1,nb(i,j)=b(i,j)-b(k,j)*tend doend ifend doend doend subroutine Gauss_Jordanprogram equation_solveimplicit noneinteger n,sgnparameter(n=2)real tinteger i,j,kreal aa(n,n),b(n,n),c(n,1),x(n,1)real,allocatable:: a(:,:)read*,aa,callocate(a(n,n))a=aa ! a代替aa进行运算sgn=1! 初始化b为单位阵do i=1,ndo j=1,nif(i==j) thenb(i,j)=1elseb(i,j)=0end ifend doend do! Gauss_Jordan消去法过程do k=1,nif(a(k,k)==0) thensgn=0EXITend if! 化第k行使得a(k,k)为1t=1.0/a(k,k)do j=k,na(k,j)=a(k,j)*tend dodo j=1,nb(k,j)=b(k,j)*tend do ! 完成第k列的计算do i=1,nif(i/=k)thent=a(i,k)do j=k,na(i,j)=a(i,j)-a(k,j)*tend dodo j=1,nb(i,j)=b(i,j)-b(k,j)*tend doend ifend doend dox=matmul(b,c)write(*,20) ((b(i,j),j=1,n),i=1,n)20 format(5X,2F9.3)write(*,10) (x(i,1),i=1,n)10 format(5X,F5.3)end!正确的编程,但是需要能求得出逆矩阵的矩阵方程! write(*,20) ((b(i,j),j=1,n),i=1,n)! 20 format(5X,2F9.3) !print*," aa的逆矩阵 ",b !x=matmul(b,c)!write(*,10) (x(i,1),i=1,n)!10 format(5X,F5.3) !print*," aa的逆矩阵 ",b !end。
FORTRAN语言课程设计摘要:科技的日新月异使得计算机领域不断取得新的研究成果。
计算机在代替和延伸脑力劳动方面发挥越来越重要的作用,不仅在工业方面而且在日常生活和科研中也越来越离不开计算机。
特别是在天体运动方面需要运用到计算机处理大量的数据。
这次我选的实践课题是用Jacobi迭代和Gauss-Seidel迭代法求解线性方程组AX=B,这其中涉及的就是天体运动的轨迹问题,我利用从FORTRAN 90中学到的迭代、循环、子程序等知识设计程序,通过Fortran PowerStation 4.0进行运行、调试,不得不提的是QuickWin,它在绘制行星的运动轨迹上发挥出了相当大的贡献。
通过这次的实践我从中充分体会到了Fortran语言接近数学公式的自然描述,在计算机里具有很高的执行效率的最大特性。
同时我也看到了Fortran语言是一种极具发展潜力的语言,在数值计算中,Fortran语言仍然不可替代。
Fortran90标准引入了数组计算等非常利于矩阵运算的功能。
在数组运算时,Fortran能够自动进行并行运算,这是很多编程语言不具备的。
运用Fortran 语言,你能够运用很多现成的函数软件包,所以非常便利。
关键词:Fortran ;Jacobi迭代和Gauss-Seidel迭代;天体运动1设计思想这次的课程设计我选的是第三个课题,关于求解天体的运行轨道,原题如下:●用Jacobi迭代和Gauss-Seidel迭代法求解线性方程组AX=b。
一天文学家要确定一颗小行星绕太阳运行的轨道,他在轨道平面内建立以太阳为原点的直角坐标系,在五个不同的点对小行星作了五次观察,测得轨道上五个点的坐标数据(单位:万公里)如下表所示:由开普勒第一定律知,小行星轨道为一椭圆,椭圆的一般方程可表示为:a1x2+2a2xy+a3y2+2a4x+2a5y+1=0分别将五个点的数据代入椭圆一般方程中,得到线性方程组,求出待定系数a1,a2,a3,a4,a5。
本文末给出Gauss-Jordan消去法的Fortran90源程序。
!/************************************************************* !程序:Gauss_Jordan消去法
!过程:Gauss_Jordan(aa,b,n,sgn)
!作用:aa为方阵,b为aa的逆,n为aa的阶
! sgn为标识符,1表示求逆成功,0表示求逆失败
!调用格式为:call Gauss_Jordan(aa,b,n,sgn)
!*************************************************************/ subroutine Gauss_Jordan(aa,b,n,sgn)
implicit none
integer(4):: n,sgn
real(8):: aa(n,n),b(n,n)
integer(4):: i,j,k
real(8),allocatable:: a(:,:)
real(8):: t
allocate(a(n,n))
a=aa ! a代替aa进行运算
sgn=1
! 初始化b为单位阵
do i=1,n
do j=1,n
if(i==j) then
b(i,j)=1
else
b(i,j)=0
end if
end do
end do
! Gauss_Jordan消去法过程
do k=1,n
if(a(k,k)==0) then
sgn=0;EXIT
end if
! 化第k行使得a(k,k)为1
t=1.0d0/a(k,k)
do j=k,n
a(k,j)=a(k,j)*t
end do
do j=1,n
b(k,j)=b(k,j)*t
end do
! 完成第k列的计算
do i=1,n
if(i/=k)then
t=a(i,k)
do j=k,n
a(i,j)=a(i,j)-a(k,j)*t
end do
do j=1,n
b(i,j)=b(i,j)-b(k,j)*t
end do
end if
end do
end do
end subroutine Gauss_Jordan
program equation_solve
implicit none
integer n,sgn
parameter(n=2)
real t
integer i,j,k
real aa(n,n),b(n,n),c(n,1),x(n,1)
real,allocatable:: a(:,:)
read*,aa,c
allocate(a(n,n))
a=aa ! a代替aa进行运算
sgn=1
! 初始化b为单位阵
do i=1,n
do j=1,n
if(i==j) then
b(i,j)=1
else
b(i,j)=0
end if
end do
end do
! Gauss_Jordan消去法过程
do k=1,n
if(a(k,k)==0) then
sgn=0
EXIT
end if
! 化第k行使得a(k,k)为1
t=1.0/a(k,k)
do j=k,n
a(k,j)=a(k,j)*t
end do
do j=1,n
b(k,j)=b(k,j)*t
end do ! 完成第k列的计算
do i=1,n
if(i/=k)then
t=a(i,k)
do j=k,n
a(i,j)=a(i,j)-a(k,j)*t
end do
do j=1,n
b(i,j)=b(i,j)-b(k,j)*t
end do
end if
end do
end do
x=matmul(b,c)
write(*,20) ((b(i,j),j=1,n),i=1,n)
20 format(5X,2F9.3)
write(*,10) (x(i,1),i=1,n)
10 format(5X,F5.3)
end
!正确的编程,但是需要能求得出逆矩阵的矩阵方程
! write(*,20) ((b(i,j),j=1,n),i=1,n)
! 20 format(5X,2F9.3) !print*," aa的逆矩阵 ",b !x=matmul(b,c)
!write(*,10) (x(i,1),i=1,n)
!10 format(5X,F5.3) !print*," aa的逆矩阵 ",b !end。