本文先向大家简单介绍一个二分法的fortran程序,然后推荐大家使用一些轻便的编译器,最后推荐一下学习的书籍、论坛。
Fortran程序分为自由格式与固定格式,固定格式太太太难看了,阅读起来也很费力,但大多数遗留下来的有限元程序是按照固定格式来编译的(木得办法),自由格式阅读起来就比较友好了,接下来就用自由格式来编写一个二分法程序,固定格式相关的将会在以后的推文中涉及。
! 二分法求解
module numerical
implicit none
real,parameter :: zero=0.00001
contains
! 二分法求解程序
real function bisect(A,B,func)
implicit none
real A,B !输入的值
real C !用来算(A+B)/2
real FA !记录F(A)
real FB !记录F(B)
real FC !记录F(C)
real,external :: func !求解的函数
! 先求出C,F(C)的值
C=(A+B)/2.0
FC=func(C)
! FC小于zero时,就视F(C)=0,结束循环
do while(abs(fc)>zero)
FA=func(A)
FB=func(B)
if(FA*FC<0) then
! f(a)*f(c)<0, 以a,c为新的区间
B=C
C=(A+B)/2.0
else
! 不然就是以b,c为新的区间
A=C
C=(A+B)/2.0
end if
! 求出新的f(c)的值
FC=func(c)
end do
bisect = C
return
end function
! 求解用的函数
real function f(x)
implicit none
real x
f=(x+3)*(x-3)
return
end function
end module numerical
program main
use numerical
implicit none
real A,B !两个猜测值
real ANS !算出
do while(.true.)
write(*,*) '输入两个猜测值'
read(*,*) A,B
! f(a)*f(b)<0 的猜测值才是有效的猜测值
if(f(a)*f(b)<0)exit
write(*,*) "不正确的猜测值"
end do
! 调用二分法求根的函数
ANS=bisect(A,B,f)
! 显示结果
write(*,"('x=',F6.3)")ans
stop
end program main
本程序采用Module将代码块进行封装,程序中用到的变量、function、subroutine,整理到Module中,用的时候只需要Use一下就可,如行48。程序中一些语法、注意的细节将会在以后专门设立一个Fortran的栏目中进行讲解。
木木最开始用的编译器是VS+IVF,后来发现VS占用系统资源很多,卸载也很麻烦,用起来不顺手,现在我用的是Simply Fortran编译器,小巧轻便(100M左右),很很很好用,Simply Fortran安装包及简单的说明手册在文末获取。界面大致长这个样子:
B站有的教学视频也用的是这个编译器,大家有兴趣可以看一下。还有一个有意思的在线编译FORTRAN网站:http://fortran.jsrun.net/ 。界面大致长介个样子:
接下来就是推荐书籍和论坛了。书籍毫无疑问当然是台湾大学彭国伦先生的《Fortran 95 程序设计》,书里面有自由格式的程序,也有对应固定格式的程序,双管齐下,大家有兴趣可以点击了解一下。国内论坛的话推荐:http://fcode.cn/guide-61-1.html 很不错的Fortran交流论坛,里面有大量的资料,代码,工具免 费 使 用,国外的话,大家都懂得(Github)。
往期精彩内容:
相关文章,在仿真秀官网搜索:
基于Mathematica插值函数的振荡现象
UEL单元开发(1)——二维弹簧单元
基于节点位移的应力强度因子外推法
基于单元应力的应力强度因子外推法
数值计算&Matlab——Lagrange插值