Fortran90数值计算chap2c2f9
- 格式:pdf
- 大小:98.79 KB
- 文档页数:50
FORTRAN90用法总结
Fortran90是Fortran的最新标准程序设计语言,它是在Fortran77
基础上的新增功能,支持面向对象的功能,同时也支持可变参数,数据语
句和开发语句,使其具有更高的强大功能。
它也支持宏的使用,以帮助程
序编写者更好的实现一些高级程序功能,以提高程序性能,提高程序易用性。
下面将重点介绍Fortran90的五大用法。
第一,利用Fortran90进行函数的编写。
Fortran90的函数可实现参
数的多次组合,通过对用户函数的调用,就可达到想要的结果,而不用写
复杂的循环程序,这有助于提高程序的可管理性,降低程序的出错率。
第二,通过宏的使用来完成Fortran90的程序编写。
宏语言有助于程
序的复杂编写和优化,通过它可以大大提高程序的性能,节约程序的开发
时间,从而提高程序的可用性。
第三,Fortran90的数组操作功能。
Fortran90支持数组的多维操作,能够进行大数组操作,从而编写出简洁的程序,节约存储空间,提高程序
的执行效率。
第四,Fortran90的指针操作功能。
它可以完成复杂数据的指针操作,以实现数据的重排、排序、和传输,可以让程序编写者有效地运用指针操作,提高程序性能和稳定性。
最后,Fortran90的结构化编程功能。
附录 F O R T R A N90标准函数符号约定:l I代表整型;R代表实型;C代表复型;C H代表字符型;S代表字符串;L代表逻辑型;A代表数组;P代表指针;T代表派生类型;A T为任意类型。
l s:P表示s类型为P类型(任意k i n d值)。
s:P(k)表示s类型为P类型(k i n d值=k)。
l[…]表示可选参数。
l*表示常用函数。
表1数值和类型转换函数函数名 说明A B S(x)*求x的绝对值∣x∣。
x:I、R,结果类型同x;x:C,结果:RA I M A G(x)求x的实部。
x:C,结果:RA I N T(x[,k i n d])*对x取整,并转换为实数(k i n d)。
x:R,k i n d:I,结果:R(k i n d)A M A X0(x1,x2,x3,…)*求x1,x2,x3,…中最大值。
x I:I,结果:RA M I N0(x1,x2,x3,…)*求x1,x2,x3,…中最小值。
x I:I,结果:RA N I N T(x[,k i n d])*对x四舍五入取整,并转换为实数(k i n d)。
x:R,k i n d:I,结果:R(k i n d)C E I L I N G(x)*求大于等于x的最小整数。
x:R,结果:IC M P L X(x[,y][,k i n d]))将参数转换为x、(x,0.0)或(x,y)。
x:I、R、C,y:I、R,k i n d:I,结果:C(k i n d)C O N J G(x)求x的共轭复数。
x:C,结果:CD B L E(x)*将x转换为双精度实数。
x:I、R、C,结果:R(8)D C M P L X(x[,y])将参数转换为x、(x,0.0)或(x,y)。
x:I、R、C,y:I、R,结果:C(8)D F L O A T(x)将x转换为双精度实数。
x:I,结果:R(8)D I M(x,y)*求x-y和0中最大值,即M A X(x-y,0)。
采用Fortran 90程序实现生成任意随机数列的方法——谷辰先生在科学计算/数值计算中的很多场合(比如蒙特卡洛模拟)都需要用到随机数。
当然首先需注意,通过计算机产生的随机数都是伪随机数,并不是真正的随机数,因为真正意义上的随机数在某次产生过程中是按照物理实验过程(如掷骰子)中表现的分布概率随机产生的,其结果是不可预测的。
而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。
所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。
但是,这个一般来说不影响我们在数值模拟中的使用。
Fortran自带一个random_number(x)函数可以产生一个0~1之间的随机数(x可以是向量),但是如果你要让每一次运行产生的随机数都不一样,则还应该调用random_seed()函数,然后系统就会根据日期和时间随机产生种子,从而得到“真正的”随机数。
下面将从最简单生成均匀分布随机数开始,逐步到复杂的瑞利分布,通过Fortran代码范例实战的方式讲解如何生成满足任一分布的随机数。
(1) 以下代码可以生成10组0~1之间的随机数(每组),而且每次运行结果都不一样:!*****************************************************************program tutorial01_random_numberimplicit noneinteger(4) :: kreal(8) :: x(3)call random_seed()do k = 1,10call random_number(x)write(*,*) xwrite(*,*)end dostopend program tutorial01_random_number!*****************************************************************运行结果如下:请务必注意,call random_seed()应该在循环之外,如果放到循环内的话,即:!*****************************************************************program tutorial01_random_numberimplicit noneinteger(4) :: kreal(8) :: x(3)do k = 1,10call random_seed()call random_number(x)write(*,*) xwrite(*,*)end dostopend program tutorial01_random_number!*****************************************************************在我windows下intel fortran编译器上运行的结果会是这样子的:所以请务必注意。
1、运行fortran时出现forrt1:severe<59>:list-directed I/O syntax error,unit 1,file G:\1\1\meat.dat怎么办这是通道1 ,链接到文件meat.dat 的读写出错了。
这问题你得认真检查类似read( 1 , * ) 或write( 1 , * ) 这样的语句,错误原因挺多的。
比如二进制文件用了文本方式读取,比如变量列表与文件不匹配。
问:另外forrt1:severe<161>:program exception -array bounds exceeded是怎么回事?回答:数组越界,也是很常见的错误。
比如real a(100)如果你使用了a(101) 就会越界,因为a 数组只有100 个元素。
2、fortran运行提示error M6201:math-**,现将代码贴出,求高手帮忙看看,急求解答!我不能确定你的错误是怎么引起的。
可能咱们的编译器不同。
你的代码在我这里的问题是:虚参和实参精度不同。
在程序中,你定义了部分real*8,但是对应的虚参和返回值却定义为real。
比如主程序里的z1(双精度),传入函数g里面的x却定义为单精度。
主程序Do 死循环了。
z2_jiashe和z2_suan每一次循环都没有发生改变,于是永远跳不出循环。
我给你的建议是:同一个程序,统一使用real*8 或real*4,尽量不要混用,除非你很自信能理清他们的关系。
检查Do 循环,尤其是z2_jiashe 和z2_suan,是否应该每次循环不同?fortran_排除错误(2012-04-20 23:22:44)安装好VISUAL FORTRAN后1、运行Developer studio即可开始编译FORTRAN程序2、选择File菜单中的New选项3、在弹出的对话框选择projects标签,其他标签不用管,projects格式选用Fortran console application;在project name里命名(最好英文名),点击“ok ”4、接下来画面中,选择“an empty project”,点击“finish”5、接下来画面点击“ok”6、再选择一次File菜单中的new7、对话框选用files标签,选择Fortran free format source file ,并在file里命名8、点击“ok”数Source Files 放源文件(.c、.cpp)程序的实现代码全放在这里Header Files 放头文件(.h)声明放在这里Resource Files 资源文件(.rc)放图标、图片、菜单、文字之类的,主要用来做界面的东东一般都放这里External Dependencies 除上三种以外的,程序编译时用到的文件全放这里fortran内部函数出错信息解释内部函数出错信息解释[sourcefile(line)]run-time error M62××MATH错误号函数级数学错误信息M6201 functionnames:DOMAIN error函数的自变量超出了约定的取值域,例如sqrt(-1)M6202 functionname:SING error无意义的变量。
数值计算方法FORTRAN程序—函数插值和方程组求解函数插值是通过已知的数据点构造一个满足要求的函数,使得该函数在已知数据点上与已知数据点的函数值相等。
常见的插值方法有拉格朗日插值和牛顿插值。
拉格朗日插值是通过构造一个多项式函数来拟合已知数据,而牛顿插值是通过构造一个牛顿插值多项式来拟合已知数据。
下面是一个用FORTRAN语言实现拉格朗日插值的程序:```fortranPROGRAM Lagrange_InterpolationIMPLICITNONEINTEGER::N,I,JREAL::X(100),Y(100),L(100),T,PPRINT *, 'Enter the number of data points (N): 'READ*,NPRINT *, 'Enter the data points (x, y): 'DOI=1,NREAD*,X(I),Y(I)ENDDOPRINT *, 'Enter the value of x (T): 'READ*,TP=0.0DOI=1,NL(I)=Y(I)DOJ=1,NIF(J/=I)THENL(I)=L(I)*(T-X(J))/(X(I)-X(J))ENDIFENDDOP=P+L(I)ENDDOPRINT *, 'The interpolated value of y at x = ', T, ' is: ', PEND PROGRAM Lagrange_Interpolation```方程组求解是通过求解多个方程的未知数来得到方程组的解。
常见的求解方法有高斯消元法和追赶法。
高斯消元法是通过将方程组转化为对角矩阵的形式来求解,而追赶法是通过逐步消去变量来求解。
下面是一个用FORTRAN语言实现追赶法求解方程组的程序:```fortranPROGRAM Tridiagonal_System_SolverIMPLICITNONEINTEGER::N,IREAL::A(100),B(100),C(100),D(100),X(100),P(100)PRINT *, 'Enter the number of equations (N): 'READ*,NPRINT *, 'Enter the coefficients of matrix A: 'DOI=1,NREAD*,A(I)ENDDOPRINT *, 'Enter the coefficients of matrix B: 'DOI=1,NREAD*,B(I)ENDDOPRINT *, 'Enter the coefficients of matrix C: 'DOI=1,NREAD*,C(I)ENDDOPRINT *, 'Enter the right hand side of the equations (D): ' DOI=1,NREAD*,D(I)ENDDOP(1)=C(1)/B(1)X(1)=D(1)/B(1)DOI=2,NP(I)=C(I)/(B(I)-A(I)*P(I-1))X(I)=(D(I)-A(I)*X(I-1))/(B(I)-A(I)*P(I-1))ENDDODOI=N-1,1,-1X(I)=X(I)-P(I)*X(I+1)ENDDOPRINT *, 'The solution of the system of equations: 'DOI=1,NPRINT*,'x(',I,')=',X(I)ENDDOEND PROGRAM Tridiagonal_System_Solver```以上是FORTRAN语言实现函数插值和方程组求解的程序。
fortran90整型定义初始化摘要:1.Fortran90 简介2.Fortran90 整型定义3.Fortran90 整型初始化4.示例代码正文:1.Fortran90 简介Fortran90 是一种高级编程语言,主要用于数值计算和科学计算。
它是Fortran 语言的一个版本,于1990 年发布。
Fortran90 具有丰富的数学函数库和强大的数据处理能力,广泛应用于工程、科学和研究领域。
2.Fortran90 整型定义在Fortran90 中,整型是一种数据类型,用于表示整数。
整型数据类型的名称为integer,它可以是正数、负数或零。
Fortran90 中整型的大小为默认为整数位数,可以根据需要进行调整。
3.Fortran90 整型初始化在Fortran90 中,可以通过以下方式对整型变量进行初始化:(1)直接赋值:在声明变量后,通过等号=赋值。
例如:```integer :: a = 10```(2)使用赋值语句:通过使用赋值语句进行初始化。
例如:```integer :: bb = 20```(3)使用子程序或函数:通过调用子程序或函数进行初始化。
例如:```integer :: cc = init_value(10)```其中,init_value 为子程序或函数,用于初始化c 的值。
4.示例代码下面是一个简单的Fortran90 程序,演示了整型的定义和初始化:```fortranprogram mainimplicit noneinteger :: a, b, sum! 定义整型变量a 和binteger :: a = 10integer :: b = 20! 计算a 和b 的和sum = a + b! 输出结果print *, "The sum of a and b is:", sumend program main```以上就是Fortran90 整型定义和初始化的相关内容。
FORTRAN90程序设计实验指导FORTRAN90程序设计实验指导第一节 FORTRAN PowerStation 4.0快速入门1.1 安装FORTRAN PowerStation 4.01.1.1 系统要求安装Microsoft FORTRAN PowerStation 4.0需要具备以下软硬件条件:●80486或以上处理器,运行Windows 95/Windows NT 3.51或以上操作系统。
●如果安装标准版,需要3.5英寸软盘驱动器或光盘驱动器,如安装专业版,则必须具有光盘驱动器。
●16MB或以上内存。
●足够的硬盘空间。
安装程序根据安装选项提示所需的硬盘空间。
标准版和专业版的典型安装分别需要约45MB和70MB硬盘空间。
●VGA显示器(推荐使用SVGA显示器)。
●鼠标。
1.1.2 安装步骤下面以Windows 95操作系统为例,对于Windows NT操作系统,安装过程与此类似。
首先,将含FORTRAN PowerStation 4.0的光盘插入光盘驱动器,在资源管理器中运行Setup程序,屏幕显示MicrosoftFORTRAN PowerStation Setup窗口;安装程序自动搜索已有组件,单击【Continue】(继续)按钮,并按提示输入CD-Key后,安装程序会显示安装选项对话框(图 1.1);如果要改变安装FORTRAN PowerStation 4.0的文件夹,单击【Change Folder...】(改变文件夹)按钮,选择或输入所需的文件夹名;如果输入的文件夹不存在,安装程序会自动生成该文件夹,并生成几个下级文件夹以存放相应的各类文件。
图1.1还显示了各安装选项的简短说明和安装时所需的硬盘空间。
选择下列四个安装选项之一继续安装:Typical(典型)Custom/Complete(定制/完全)Compact(紧凑)图1.1 Setup程序的安装选项对话框Run from CD-ROM(从光盘运行) Typical(典型)安装选项将安装最常用的部分,约需70MB硬盘空间。
Sample page from NUMERICAL RECIPES IN FORTRAN 90: THE Art of PARALLEL Scientific Computing (ISBN 0-521-57439-0)Copyright (C) 1986-1996 by Cambridge University Press.Programs Copyright (C) 1986-1996 by Numerical Recipes Software. Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes booksor CDROMs, visit websitehttp://www.nr.com or call 1-800-872-7423 (North America only),or send email to directcustserv@cambridge.org (outside North America).C2.AlphabeticalListingof
ExplicitInterfaces
Thefilesuppliedasnr.f90containsexplicitinterfacesforalltheNumericalRecipesroutines(exceptthosealreadyinthemodulenrutil).Theinterfacesareinalphabeticalorder,bythegenericinterfacename,ifoneexists,orbythespecificroutinenameifthereisnogenericname.Thefilenr.f90isnormallyinvokedviaaUSEstatementwithinamainprogramorsubroutinethatreferencesaNumericalRecipesroutine.See§21.1foranexample.
MODULEnrINTERFACESUBROUTINEairy(x,ai,bi,aip,bip)USEnrtypeREAL(SP),INTENT(IN)::xREAL(SP),INTENT(OUT)::ai,bi,aip,bipENDSUBROUTINEairyENDINTERFACEINTERFACESUBROUTINEamebsa(p,y,pb,yb,ftol,func,iter,temptr)USEnrtypeINTEGER(I4B),INTENT(INOUT)::iterREAL(SP),INTENT(INOUT)::ybREAL(SP),INTENT(IN)::ftol,temptrREAL(SP),DIMENSION(:),INTENT(INOUT)::y,pbREAL(SP),DIMENSION(:,:),INTENT(INOUT)::pINTERFACEFUNCTIONfunc(x)USEnrtypeREAL(SP),DIMENSION(:),INTENT(IN)::xREAL(SP)::funcENDFUNCTIONfuncENDINTERFACEENDSUBROUTINEamebsaENDINTERFACEINTERFACESUBROUTINEamoeba(p,y,ftol,func,iter)USEnrtypeINTEGER(I4B),INTENT(OUT)::iterREAL(SP),INTENT(IN)::ftolREAL(SP),DIMENSION(:),INTENT(INOUT)::yREAL(SP),DIMENSION(:,:),INTENT(INOUT)::pINTERFACEFUNCTIONfunc(x)USEnrtypeREAL(SP),DIMENSION(:),INTENT(IN)::xREAL(SP)::funcENDFUNCTIONfuncENDINTERFACE
1384AppendixC2.AlphabeticalListingofExplicitInterfaces1385Sample page from NUMERICAL RECIPES IN FORTRAN 90: THE Art of PARALLEL Scientific Computing (ISBN 0-521-57439-0)Copyright (C) 1986-1996 by Cambridge University Press.Programs Copyright (C) 1986-1996 by Numerical Recipes Software. Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes booksor CDROMs, visit websitehttp://www.nr.com or call 1-800-872-7423 (North America only),
or send email to directcustserv@cambridge.org (outside North America).
ENDSUBROUTINEamoebaENDINTERFACEINTERFACESUBROUTINEanneal(x,y,iorder)USEnrtypeINTEGER(I4B),DIMENSION(:),INTENT(INOUT)::iorderREAL(SP),DIMENSION(:),INTENT(IN)::x,yENDSUBROUTINEannealENDINTERFACEINTERFACESUBROUTINEasolve(b,x,itrnsp)USEnrtypeREAL(DP),DIMENSION(:),INTENT(IN)::bREAL(DP),DIMENSION(:),INTENT(OUT)::xINTEGER(I4B),INTENT(IN)::itrnspENDSUBROUTINEasolveENDINTERFACEINTERFACESUBROUTINEatimes(x,r,itrnsp)USEnrtypeREAL(DP),DIMENSION(:),INTENT(IN)::xREAL(DP),DIMENSION(:),INTENT(OUT)::rINTEGER(I4B),INTENT(IN)::itrnspENDSUBROUTINEatimesENDINTERFACEINTERFACESUBROUTINEavevar(data,ave,var)USEnrtypeREAL(SP),DIMENSION(:),INTENT(IN)::dataREAL(SP),INTENT(OUT)::ave,varENDSUBROUTINEavevarENDINTERFACEINTERFACESUBROUTINEbalanc(a)USEnrtypeREAL(SP),DIMENSION(:,:),INTENT(INOUT)::aENDSUBROUTINEbalancENDINTERFACEINTERFACESUBROUTINEbanbks(a,m1,m2,al,indx,b)USEnrtypeINTEGER(I4B),INTENT(IN)::m1,m2INTEGER(I4B),DIMENSION(:),INTENT(IN)::indxREAL(SP),DIMENSION(:,:),INTENT(IN)::a,alREAL(SP),DIMENSION(:),INTENT(INOUT)::bENDSUBROUTINEbanbksENDINTERFACEINTERFACESUBROUTINEbandec(a,m1,m2,al,indx,d)USEnrtypeINTEGER(I4B),INTENT(IN)::m1,m2INTEGER(I4B),DIMENSION(:),INTENT(OUT)::indxREAL(SP),INTENT(OUT)::dREAL(SP),DIMENSION(:,:),INTENT(INOUT)::aREAL(SP),DIMENSION(:,:),INTENT(OUT)::alENDSUBROUTINEbandecENDINTERFACEINTERFACESUBROUTINEbanmul(a,m1,m2,x,b)USEnrtypeINTEGER(I4B),INTENT(IN)::m1,m2REAL(SP),DIMENSION(:),INTENT(IN)::xREAL(SP),DIMENSION(:),INTENT(OUT)::bREAL(SP),DIMENSION(:,:),INTENT(IN)::a