Объявите второй параметр (стандартное отклонение, «сигма») как положительный:
a = Normal('a', 0, Symbol('P', positive=True))
b = Normal('b', 0, Symbol('Q', positive=True))
Тогда результат, как и ожидалось:
2
-z
───────────
2 2
2⋅P + 2⋅Q
√2⋅ℯ
z ↦ ─────────────────
_________
╱ 2 2
2⋅√π⋅╲╱ P + Q
Под капотом SymPy вычисляет неправильный интеграл, используя функцию Мейера G, которая включает в себя поднятие вычисления до некоторой римановой поверхности, а наличие отрицательных чисел для P или Q может привести к другой ветви; отсюда и сложный ответ. Математически, это не должно иметь большого значения для вычисления, так как сигма возводится в квадрат в показателе степени; но это имеет значение для успеха алгоритма.
Все это было бы спорным, если бы SymPy просто знал, как добавляются независимые нормали, но это не так; все такие вычисления выполняются путем прямой интеграции, часто выходящей за пределы реализованных методов интеграции.
Примечания:
- Вы использовали
true
(объект правды SymPy), но Python True
ожидается методом создания символа.
- Лучше избегать объединения
from sympy import *
и from sympy.stats import *
, поскольку это приводит к конфликтам имен: E
- это число Эйлера в SymPy и - обозначение ожидаемого значения в sympy.stats.