Упрощение больших символических выражений - PullRequest
1 голос
/ 10 июня 2019

Я работаю над созданием функции, которая выполняет преобразование Лежандра уравнения, используя sympy.Я пытаюсь получить код для упрощения выражения, но функция упрощения не будет работать (я полагаю, из-за размера выражения).Это для общего преобразования Лежандра, поэтому я не могу сказать ему искать конкретное упрощение.

Как и пример одного выходного уравнения имеет отношение триггера: sin ^ 2 = 1 - cos ^ 2

Чтобы решить проблему

import sympy as sy
x, y, m1, m2, n, q1, q2, tht = sy.symbols("x, y, m1, m2, n, q1, q2, tht")

Когда я кодирую это и использую trigsimp ()

a = x - x*sy.cos(tht)**2
print(sy.trigsimp(a))

, я получаю

x*sin(tht)**2

, как и должен был.Однако, когда я ставлю это на более сложную проблему.

b = y*n**2/(x**2*y**2*(-m1 - m2*sy.cos(q1 - q2)**2 + m2))
print(sy.trigsimp(b))

Я не распознаю взаимосвязь триггеров и вывод:

n**2/(x**2*y*(-m1 - m2*cos(q1 - q2)**2 + m2))

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

edit:

Чтобы прояснить проблему, кажется, что небольшая сложность усложняет trigsimp (), как показано в примере bне упрощается должным образом.Я ищу способ более строгого упрощения уравнения.Для масштаба, функции, которые я действительно хочу упростить, в 3-20 раз больше, чем в примере b.

1 Ответ

0 голосов
/ 12 июня 2019

При работе с большим выражением обычно лучше дать более прямые инструкции для упрощения, например,

In [18]: b.replace(cos, lambda a: sqrt(1-sin(a)**2)).collect(m2)                                                                  
Out[18]: 
               2             
              n              
─────────────────────────────
 2   ⎛            2         ⎞
x ⋅y⋅⎝-m₁ + m₂⋅sin (q₁ - q₂)⎠

Это может не сработать в вашей реальной проблеме, но что-то должно. Сложность с такими стандартными процедурами, как trigsimp и упрощение, заключается в том, что не существует универсально правильной стратегии упрощения, поэтому им приходится пробовать много вещей, которые в итоге оказываются либо медленными, либо неполными (или и тем, и другим). На самом деле не всегда понятно, каким должен быть «самый простой» ответ. Улучшение в этом примере кажется довольно незначительным.

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