2014-11-28 2 views
1

Я пытаюсь решить простую систему уравнений в sympy, но я получаю сообщение об ошибке: «TypeError: невозможно преобразовать выражение в float».Sympy: TypeError: невозможно преобразовать выражение в float

import sympy as sy 
q0,q1,x,y = sy.symbols('q_0,q_1,x,y') 
s = sy.Matrix([sy.Eq(x-sy.cos(q0)-sy.cos(q0+q1),0), 
      sy.Eq(y-sy.sin(q0)-sy.sin(q0+q1),0)]); 
sol = sy.solve(s.subs({x:2,y:0}),q0,q1) 

Решение должно быть (0,0). Я использую версию sympy: 0.7.6-git.

+0

Возможно, если вы используете идентификаторы [идентификаторы угловой суммы] (http://en.wikipedia.org/wiki/List_of_trigonometric_identities#Angle_sum_and_difference_identities) и повторно поместите 'sy.cos (qi)', 'sy.sin (qi)' с переменными, вы можете сначала решить полиномиальные уравнения. – unutbu

+0

@unutbu, но тогда у меня было бы 4 переменных и 2 уравнения. Переменные c1, c2, s1, s2 = cos (q1), cos (q2), sin (q1), sin (q2). –

+0

Вы можете заменить '{sin (q1): sy.sqrt (1-sy.cos (q1) ** 2)}'; Я пробовал это и получил решение sy.solve для cos (q0), cos (q1) и return (1,1), но также и сложное (фиктивное?) Решение. Я опубликую его ниже, чтобы показать, что я имею в виду, но решение является неполным. – unutbu

ответ

1

Вот частичное решение:

import sympy as sy 

q0, q1, x, y = sy.symbols('q_0,q_1,x,y', real=True, positive=True) 
cq0, cq1, sq0, sq1 = sy.symbols('cq0, cq1, sq0, sq1', real=True) 
s = sy.Matrix([sy.Eq(x - sy.cos(q0) - sy.cos(q0 + q1), 0), 
       sy.Eq(y - sy.sin(q0) - sy.sin(q0 + q1), 0)]) 
# Matrix([ 
# [x - cos(q_0) - cos(q_0 + q_1) == 0], 
# [y - sin(q_0) - sin(q_0 + q_1) == 0]]) 

s2 = sy.expand_trig(s).subs({ 
    sy.cos(q0) : cq0 
    , sy.cos(q1) : cq1 
    , sy.sin(q0) : sy.sqrt(1-cq0**2) 
    , sy.sin(q1) : sy.sqrt(1-cq1**2)}) 

solns = set(sy.solve(s2.subs({x: 2, y: 0}), cq0, cq1)) 
for soln in solns: 
    print(soln) 

дает

(1, 1) 
0

Если переписать матричные элементы в терминах ехр и не проверить ответ, он хорошо работает:

>>> print(filldedent(
... solve(s.applyfunc(lambda x:x.rewrite(exp)).subs({x:2,y:0}), q0, q1, check=0))) 

[(0, 0), (zoo, pi), (pi, 0), (-I*log(-sqrt(exp(zoo))), zoo), 
(-I*log(sqrt(exp(zoo))), zoo)]