как заставить sympy упростить выражения llike (a**2 — 4* b)*sqrt(1/(a**2 — 4* б))

#sympy

#симпатия

Вопрос:

Из другого кода sympy я получаю выражения типа :

 u = (a**2*sqrt(1/(a**2 - 4*b)) - a - 4*b*sqrt(1/(a**2 - 4*b)))/(2*(a**2 - 
4*b)*sqrt(1/(a**2 - 4*b)))
 

где a и b — символы sympy. Я пытался

 u = u.simplify(), u = u.expand() and u = simplify(str(u)),
 

безрезультатно, код не меняется. Как я могу добиться упрощения такого рода выражений?

Комментарии:

1. Это a**2-4*b очень похоже на дискриминант 2-й степени , но, похоже, нет никакого способа использовать это..

Ответ №1:

Здесь я всего лишь пытаюсь упростить процесс вручную, с некоторыми примечаниями.

Сигналом было то, что подвыражение a**2 - 4*b появляется 4 раза. Я не уверен, как это можно распространить на более общий метод.

 from IPython.display import Math, display
from sympy import *

init_printing()
a,b,D=symbols('a b Delta')

u = (a**2*sqrt(1/(a**2 - 4*b)) - a - 4*b*sqrt(1/(a**2 - 4*b)))/(2*(a**2 - 4*b)*sqrt(1/(a**2 - 4*b)))

D_ = a**2 - 4*b

r = []

r.append(latex(u))
u = u.subs(D_,D)
r.append(latex(u))
u = u.subs(2*D_, 2*D)
r.append(latex(u))
u = collect(u, 1/D)
r.append(latex(u))
u = u.subs(D_,D)
r.append(latex(u))
u = u.expand()
r.append(latex(u))
u = u.subs(D,D_)
r.append(latex(u))

display(Math(" \Longrightarrow ".join(r)))
 

Выходной сигнал:

введите описание изображения здесь

Комментарии:

1. Вы можете использовать ratsimp(radsimp(u)) для получения того же результата.

2. @OscarBenjamin Я не знал о radsimp и ratsimp, но все работает нормально, еще раз спасибо, что спасли мой день.

3. хотя решение Oscars отличное, ваш ответ также действителен и в качестве бонуса дает пример использования LaTeX, поэтому я приму ваш ответ