Sympy: TypeError: невозможно преобразовать выражение в число с плавающей запятой

Я пытаюсь решить простую систему уравнений в 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.


person João Abrantes    schedule 28.11.2014    source источник
comment
Возможно, если вы используете идентификаторы суммы углов и замените sy.cos(qi), sy.sin(qi) переменными, вы сможете сначала решите полиномиальные уравнения.   -  person unutbu    schedule 28.11.2014
comment
@unutbu, но тогда у меня было бы 4 переменных и 2 уравнения. Переменные c1, c2, s1, s2 = cos (q1), cos (q2), sin (q1), sin (q2).   -  person João Abrantes    schedule 29.11.2014
comment
Вы можете заменить {sin(q1): sy.sqrt(1-sy.cos(q1)**2)}; Я попробовал это и получил sy.solve для решения cos (q0), cos (q1) и return (1,1), но также сложное (фиктивное?) Решение. Я отправлю его ниже, чтобы показать, что я имею в виду, но решение неполное.   -  person unutbu    schedule 29.11.2014
comment
Любопытно, потому что эта ошибка не появляется в sympy версии 0.7.5. Появляется ли ошибка для solve или уже на более раннем этапе? Возможно, вы захотите отправить отчет об ошибке ...   -  person Oliver W.    schedule 11.12.2014


Ответы (2)


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

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)
person Community    schedule 29.11.2014

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

>>> 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)]
person smichr    schedule 01.12.2014