主题:[讨论]任意函数表达式求值模块
不久之前,我发过一张贴——《我见过最牛B的程序》。讲的是函数表达式求值。很可惜是C
语言描述。
今天我特地贴一张fortran 版的!
这个模块是 www.fortran.com 这个网站 Dr Stuart Midgley 写的。
他的电子邮箱:sdm900@gmail.com,大家如有疑问可以找他(该老外有问必答,我试过)。
废话不多说,程序见附件。
program test
use params
use extrafunc
use interpreter
implicit none
character(len=255) :: s, f,error1,error2
real(fdp) :: r
real(fdp), dimension(:),allocatable :: varvals
integer :: funcnum
write(*,*)"依次输入函数的自变量:"
read(*,'(a)')s
allocate(varvals(f_numbervars(s))) ! f_numbervars(s)为自变量的个数
write(*,*)"输入关于自变量的函数:"
read(*,'(a)')f
write(*,*)"依次输入对应自变量的值:"
read(*,*)varvals
call s_createfn(f, s, funcnum,error1) ! 创建函数
write(*,'(a)')trim(error1) ! 提示出错信息
call s_evaluatefn(funcnum, varvals, r,error2) ! 计算函数值
write(*,'(a)')trim(error2) ! 提示出错信息
write(*,*)"函数值等于:",r
call s_destroyfn(funcnum) ! 销毁函数
stop
end program test
应用举例:
输入函数的自变量:
x
输入关于自变量的函数:
x**2+sqrt(x)/x
输入自变量的值:
2.0
输出:
OK
OK
函数值等于: 4.7071067811865475
另外模块还提供别外两个接口:s_errprecision 和 s_evaluateerr
前者好象是把实数的左数第二位起四舍五入(我个人理解,不常用)
后者如果自变量输入:x[2.0] y[3.0] 则计算二元函数 f(x,y) 在△x=2.0 △y=3.0 时的全微分。
此外模块还提供了数学上常用的函数如gamma函数等,详见 module extrafunc,输入表达式过程
中,**和^同为乘方,支持小、中、大括号,其中if函数非常类似于C语言中的三元操作符。
我个人认为,该模块结合dislin可以画出任意函数的图像,是不是有点matlab的意味?
语言描述。
今天我特地贴一张fortran 版的!
这个模块是 www.fortran.com 这个网站 Dr Stuart Midgley 写的。
他的电子邮箱:sdm900@gmail.com,大家如有疑问可以找他(该老外有问必答,我试过)。
废话不多说,程序见附件。
program test
use params
use extrafunc
use interpreter
implicit none
character(len=255) :: s, f,error1,error2
real(fdp) :: r
real(fdp), dimension(:),allocatable :: varvals
integer :: funcnum
write(*,*)"依次输入函数的自变量:"
read(*,'(a)')s
allocate(varvals(f_numbervars(s))) ! f_numbervars(s)为自变量的个数
write(*,*)"输入关于自变量的函数:"
read(*,'(a)')f
write(*,*)"依次输入对应自变量的值:"
read(*,*)varvals
call s_createfn(f, s, funcnum,error1) ! 创建函数
write(*,'(a)')trim(error1) ! 提示出错信息
call s_evaluatefn(funcnum, varvals, r,error2) ! 计算函数值
write(*,'(a)')trim(error2) ! 提示出错信息
write(*,*)"函数值等于:",r
call s_destroyfn(funcnum) ! 销毁函数
stop
end program test
应用举例:
输入函数的自变量:
x
输入关于自变量的函数:
x**2+sqrt(x)/x
输入自变量的值:
2.0
输出:
OK
OK
函数值等于: 4.7071067811865475
另外模块还提供别外两个接口:s_errprecision 和 s_evaluateerr
前者好象是把实数的左数第二位起四舍五入(我个人理解,不常用)
后者如果自变量输入:x[2.0] y[3.0] 则计算二元函数 f(x,y) 在△x=2.0 △y=3.0 时的全微分。
此外模块还提供了数学上常用的函数如gamma函数等,详见 module extrafunc,输入表达式过程
中,**和^同为乘方,支持小、中、大括号,其中if函数非常类似于C语言中的三元操作符。
我个人认为,该模块结合dislin可以画出任意函数的图像,是不是有点matlab的意味?

您所在位置: