回 帖 发 新 帖 刷新版面

主题:[讨论]任意函数表达式求值模块

不久之前,我发过一张贴——《我见过最牛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的意味?

   

回复列表 (共11个回复)

11 楼

师兄的好帖子,顶

我来回复

您尚未登录,请登录后再回复。点此登录或注册