Фортран: матрица из символических функций - PullRequest
0 голосов
/ 30 мая 2018

Мне нужно преобразовать набор символических уравнений, определяющих отношения между \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 /    

Теперь проблема в том, что все должно быть в Фортране: чтение уравнений и преобразование их в матрицу A.

Я нашел модуль fparser (https://www.sourceforge.net/projects/fparser/) для оценки символьных математических выражений, но мне может понадобиться помощь, чтобы выяснить, как наиболее эффективно построить эти матрицы без слишком большого разбора строк ...

1 Ответ

0 голосов
/ 31 мая 2018

Подход (обходной путь?) В 100% чистом Фортране может быть ...

! 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  
...