SymPy не распознает равные значения - PullRequest
0 голосов
/ 06 октября 2019

Простые вычисления в SymPy быстро создают громоздкие результаты, такие как три значения should_be ниже.
Сравнение с правильными значениями дает False (хотя math.isclose дает True).

from sympy import sqrt
phi = (1 + sqrt(5)) / 2
should_be_phi = -(1/2 + sqrt(5)/2)**2 + (1/2 + sqrt(5)/2)**3
should_be_half = -sqrt(5)/8 + 1/8 + (1/2 + sqrt(5)/2)**2/4
should_be_one = -sqrt(5)/4 + 1/4 + (1/2 + sqrt(5)/2)**2/2
print(should_be_phi == phi, should_be_half == 1/2, should_be_one == 1)

Это те же формулы, отформатированные Wolfram Alpha:
phi: enter image description here half: enter image description here one: enter image description here
should_be_phi был создан как phi**3 - phi**2 btw.

В настоящее время я всегда копирую эти чудовища в Wolfram Alpha , чтобы получить приличные формулы и удалить дубликаты.

Вы также получаете False за каждое сравнение? Я использую Python 3.6.8 и SymPy 1.4.

Есть ли способ сделать символические вычисления в Python, который на самом деле работает?
Кажется, SymPy не в состоянии делать то, для чего он предположительно сделан.

1 Ответ

1 голос
/ 06 октября 2019

Я предполагаю, что вы хотите, чтобы эти выражения были упрощены, поэтому просто используйте функцию simplify:

In [6]: from sympy import *

In [7]: phi = (1 + sqrt(5)) / 2

In [8]: should_be_phi = -(S(1)/2 + sqrt(5)/2)**2 + (S(1)/2 + sqrt(5)/2)**3

In [9]: should_be_phi
Out[9]: 
          2           3
  ⎛1   √5⎞    ⎛1   √5⎞ 
- ⎜─ + ──⎟  + ⎜─ + ──⎟ 
  ⎝2   2 ⎠    ⎝2   2 ⎠ 

In [10]: simplify(should_be_phi)
Out[10]: 
1   √5
─ + ──
2   2 

Обратите внимание, что вы должны использовать S(1)/2 вместо 1/2, что даетfloat.

Если вы хотите сравнить выражения, тогда очевидным способом будет использование ==, но это для "структурного равенства" в SymPy. Это означает, что expr1 == expr2 даст True только тогда, когда выражения находятся в точно такой же форме. Если вы хотите проверить на математическое равенство, тогда вы должны использовать Eq(lhs, rhs) или simplify(lhs-rhs):

In [11]: should_be_phi == phi    # Expressions are not in the same form
Out[11]: False

In [12]: Eq(should_be_phi, phi)
Out[12]: True

In [13]: simplify(should_be_phi - phi)
Out[13]: 0

Есть ли способ сделать символические вычисления в Python, который действительно работает? Похоже, что SymPy не в состоянии делать то, для чего он предназначен.

В отличие от Wolfram Alpha, SymPy не предназначен для того, чтобы его можно было использовать или понять тому, кто не прочитал ни одной документации. Если вы прочитали первые несколько страниц учебника по SymPy, на ваши вопросы ответили бы: https://docs.sympy.org/latest/tutorial/index.html#tutorial

...