Fortran:符号函数的矩阵

时间:2018-05-30 19:45:01

标签: parsing fortran symbolic-math

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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  

答案 1 :(得分:0)

尽管已经很久了,但我想发布有助于解决问题的内容: 我使用了fparserhttp://fparser.sourceforge.net/)。