Найти простое представление для числа с SymPy - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь упростить следующий термин с sympy

(латекс) $ \ sqrt 3 {8 + 3 \ sqrt {21}} + \ sqrt 3 {8-3 \ sqrt {21}} $

from sympy import (
    init_printing,
    sqrt,
    cbrt,
    nsimplify,
    simplify,
)

init_printing(use_unicode=True)

value_plus = cbrt(8 + 3 * sqrt(21))
value_minus = cbrt(8 - 3 * sqrt(21))

value_both = value_plus + value_minus

Здесь я разделил выражение на две части value_plus и value_minus соответственно.

В первой части я получаю желаемый результат

nsimplify(value_plus)

, что составляет $ 1/2 + \ sqrt {21} / 2 $, что можно увидеть в wolfram alpha .

Тем не менее, для второй части целого числа желаемого результата ($ 1 / 2- \ sqrt {21} / 2 $), как можно видеть и в wolfram aplha , в альтернативной форме

nsimplify(value_minus)

Я получаю сложное представление, которое также правильно, но не совсем то, что я хочу получить.

И, таким образом, я не получаю ожидаемый результат, который равен 1.

value_both = value_plus + value_minus

как видно на скриншоте.Итак, мои вопросы:

  1. как заставить другие представления числа?
  2. , как ограничить представление только действительными числами?

Screenshot of a jupiter notebook

1 Ответ

1 голос
/ 22 апреля 2019

Вместо cbrt вы можете использовать real_root :

value_plus = real_root(8 + 3 * sqrt(21), 3)
value_minus = real_root(8 - 3 * sqrt(21), 3)

value_both = value_plus + value_minus

print(nsimplify(value_plus))
print(nsimplify(value_minus))
print(nsimplify(value_both))

Вывод будет:

1/2 + sqrt(21)/2
1/2 - sqrt(21)/2
1
...