【问题标题】:Fortran: matrix from symbolic functionsFortran:来自符号函数的矩阵
【发布时间】:2020-03-12 20:15:31
【问题描述】:

我需要转换一组定义\vec(a) = (a,b,c)\vec(x) = (x,y) 之间关系的符号方程,例如

a = 1./2 * x
b = -1./2 * x
c = 1./2 * y

变成矩阵形式这样我就得到了矩阵A,当我写\vec(a) = A * \vec(x):

/ a \   /  1./2   0   \    / x \
| b | = | -1./2   0   |  * \ y /
\ c /   \   0    1./2 /    

现在的问题是,整个事情都需要在 Fortran 中:读取方程并将它们转换为矩阵 A。

我找到了模块 fparser (https://www.sourceforge.net/projects/fparser/) 来评估符号数学表达式,但我可能需要一些帮助来弄清楚如何最有效地构建这些矩阵而无需进行过多的字符串解析。 .

【问题讨论】:

  • 你能发布到目前为止你尝试了什么吗?
  • 不是真的,因为我什至不知道如何开始。如果我只是将表达式作为字符串,那么我必须单独处理所有可能出现的括号,'/','*','+','-',这就像编写一个实际的符号数学解析器......使用现有的符号数学库,我需要另一个库来分析构建导数。然后我可以说A(1,1) = da/dx等等我猜......
  • 看来你需要一个文本到表达式解析器和一个可以处理导数的 CAS(计算机代数系统)......如果是这样,这是一个太宽泛的问题
  • 这不是人们通常会使用 Fortran 的那种事情。使用 CAS(即 sympy)解析表达式、计算导数并将输出写入 .f90 文件或 fortran read 语句可以处理的某个 txt 文件会容易得多。
  • 我以为有人可以提示我一个可以做到这一点的库, 库推荐在 Stack Overflow 上是题外话。

标签: parsing fortran symbolic-math


【解决方案1】:

100% 纯 Fortran 中的一种方法(解决方法?)可能是......

! calc.f90
program main
    implicit none
    real avec( 3 ), xvec( 2 ), A( 3, 2 )
    integer i

    do i = 1, size(xvec)
        xvec = 0 ; xvec(i) = 1.0
        call calc()
        A(:,i) = avec
    enddo

    do i = 1, size(avec)
        print *, A(i,:)
    enddo

contains
    subroutine calc()
        real a,b,c, x,y
        x = xvec(1)
        y = xvec(2)
        include 'eq.inc'
        avec = [a,b,c]
    end subroutine
end

eq.inc:

a = 1./2 * x
b = -1./2 * x
c = 1./2 * y

$ gfortran calc.f90 && ./a.out

  0.500000000       0.00000000    
 -0.500000000      -0.00000000    
   0.00000000      0.500000000  

【讨论】:

  • 对于非线性情况,也许我们可以使用有限差分或自动微分(库?)
【解决方案2】:

虽然是很久以前的事了,但我想发布帮助我解决问题的方法: 我使用了fparser (http://fparser.sourceforge.net/)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2014-08-07
    • 2013-05-05
    • 2015-07-31
    相关资源
    最近更新 更多