Fortran:来自符号函数的矩阵
Fortran: matrix from symbolic functions
我需要转换一组定义 \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/) 来评估符号数学表达式,但我可能需要一些帮助来弄清楚如何最有效地构建这些矩阵而不用做太多的字符串解析...
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
虽然是很久以前的事了,但我想 post 是什么帮助我解决了这个问题:
我用了 fparser
(http://fparser.sourceforge.net/).
我需要转换一组定义 \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/) 来评估符号数学表达式,但我可能需要一些帮助来弄清楚如何最有效地构建这些矩阵而不用做太多的字符串解析...
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
虽然是很久以前的事了,但我想 post 是什么帮助我解决了这个问题:
我用了 fparser
(http://fparser.sourceforge.net/).