solve-func в Python-sympy очень медленный для системы линейных уравнений - PullRequest
0 голосов
/ 03 мая 2018

Например

from sympy import *

v11, v12, v21, v22 = symbols('v11, v12, v21, v22')
w11, w12, w21, w22 = symbols('w11, w12, w21, w22')
x11, x12, x21, x22 = symbols('x11, x12, x21, x22')
y11, y12, y21, y22 = symbols('y11, y12, y21, y22')
z11, z12, z21, z22 = symbols('z11, z12, z21, z22')

r11, r12, r21, r22 = symbols('r11, r12, r21, r22')

a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \
a12, a13, a14, a15, a16, a17, a18 = symbols('a1:19')

# want to solve
b1, b2 = symbols('b1, b2')

# system of equations
eqn1  = a1*v11  + a2*v12  - b1       # a1 = 1
eqn2  = a1*v21  + a2*v22  - a3
eqn3  = a3*r11  + a4*r12  - a2
eqn4  = a3*r21  + a4*r22  - a5
eqn5  = a5*w11  + a6*w12  - a4   
eqn6  = a5*w21  + a6*w22  - a7
eqn7  = a7*r11  + a8*r12  - a6
eqn8  = a7*r21  + a8*r22  - a9
eqn9  = a9*x11  + a10*x12 - a8
eqn10 = a9*x21  + a10*x22 - a11
eqn11 = a11*r11 + a12*r12 - a10
eqn12 = a11*r21 + a12*r22 - a13
eqn13 = a13*y11 + a14*y12 - a12
eqn14 = a13*y21 + a14*y22 - a15
eqn15 = a15*r11 + a16*r12 - a14
eqn16 = a15*r21 + a16*r22 - a17
eqn17 = a17*z11 + a18*z12 - a16      # a18 = 0
eqn18 = a17*z21 + a18*z22 - b2

print('begin')
result = solve([eqn1, eqn2, eqn3, eqn4, eqn5, eqn6, eqn7, \
                eqn8, eqn9, eqn10, eqn11, eqn12, eqn13, \
                eqn14, eqn15, eqn16, eqn17, eqn18], \
               [a2, a3, a4, a5, a6, a7, a8, a9, a10, \
                a11, a12, a13, a14, a15, a16, a17, b1, b2], \
                simplify=False, rational=False, manual=True)

b1_ans = result[b1]
b2_ans = result[b2]
print(b1_ans)

для решения этих уравнений требуется MATLAB только в считанные секунды, но при использовании sympy я не могу получить результат.

Есть ли способ ускорить решатель? Если нет, можете ли вы порекомендовать другой способ решения системы уравнений с использованием python?

Заранее спасибо

...