как остановить sympy от упрощения выражения?

Когда я пишу функцию плотности вероятности для нормального распределения в Sympy (v. 1.5.1) следующим образом:

pdf_normal = (1 / (sigma*sqrt(2*pi))) * exp(-(1/2) * ((x - mu)/sigma)**2)

на основе такого выражения уравнения (Википедия):

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

sympy «упрощает» выражение, но значительно усложняет его чтение:

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

Есть ли способ предотвратить это?

(Это обсуждение не помогает, потому что предлагаемый ответ вообще не касается выражения )

Заранее спасибо!


person fotis j    schedule 23.05.2020    source источник


Ответы (3)


Вы можете использовать evaluate=False для управления этим, но, скорее всего, это будет оцениваться в последующих операциях:

In [11]: Pow(Mul(sigma, sqrt(2*pi, evaluate=False), evaluate=False), -1, evaluate=False)                                          
Out[11]: 
    1    
─────────
    _____
σ⋅╲╱ 2⋅π 
person Oscar Benjamin    schedule 23.05.2020
comment
Спасибо, и в дополнение к тому, что вы поднимаете (оценка в последующих операциях), я считаю 4 математических знака 3 раза «оценить = False» - развертывание этого для всего уравнения кажется не очень хорошей идеей. Но было бы здорово, если бы можно было использовать одну скобку для всего этого и пометить ее 'evaluate=False'. - person fotis j; 26.05.2020


Класс UnevaluatedExpr предотвратит повторную оценку выражения во время последующих операций. С изменениями, предложенными здесь, я думаю, это решит вашу проблему:

>>> from sympy import S
>>> from sympy.abc import *
>>> from sympy import S
>>> usqrt = lambda x: UnevaluatedExpr(sqrt(x, evaluate=False))
>>> (1 / (sigma*usqrt(2*pi))) * exp(((x - mu)/sigma)**2/-2)
exp(-(-mu + x)**2/(2*sigma**2))/(sigma*sqrt(2*pi))
person smichr    schedule 26.05.2020