Симпи - получил два решения из тригонометрического уравнения, я ожидал только одно - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь решить тригонометрическое уравнение с симпой. У меня проблемы с пониманием того, что делает sympy: я ожидал только одного решения, вместо этого я получил два. Вот код:

import sympy as sp
sp.var("a, b, c, d, z")
myeq = sp.Eq(c * sp.sin(a * (b / 2 - z)) + d * sp.cos(a * (b / 2 - z)), 0)
sol = sp.solve(myeq, z)
print(sol)

Output: [(a*b - 4*atan((c - sqrt(c**2 + d**2))/d))/(2*a), (a*b - 4*atan((c + sqrt(c**2 + d**2))/d))/(2*a)]

Решение, которое я ожидал: [b / 2 + atan(c / d) / a]

Чего мне не хватает? Для этого конкретного случая, возможно ли получить единственное решение?

1 Ответ

1 голос
/ 03 ноября 2019

Если вы измените свое уравнение, чтобы объединить sin и cos в tan, вы получите то, что ищете:

>>> solve(c/d*tan(a*(b/2-z))-1,z)
[b/2 - atan(d/c)/a]

Если вы этого не сделаете, SymPy перепишет ирешить в терминах exp ... и в этом случае, как вы можете убедиться, оно будет квадратичным в exp(l*a*z).

Можно было бы попытаться переписать сумму из двух аргументов как отношениекак это:

>>> def ratio(eq):
...     if isinstance(eq, Eq):
...         eq=eq.rewrite(Add)
...     A, B = eq.as_two_terms()
...     if not A.is_Add and not B.is_Add:
...         return Eq(A/B, 1)
>>> trigsimp(ratio(eq))
Eq(c*tan(a*b/2 - a*z)/d, 1)

(Функция возвращает None, если нет двух терминов для работы.) Как вы можете видеть, в этом случае вы получите новое уравнение, которое будет решать по вашему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...