sympy: как вычислить интеграл от абсолютного значения

Когда я пытаюсь упростить следующий интеграл в sympy, он не будет вычисляться, т. е. вывод будет $\int_{-1}^1 |z| dz$, в то время как результат, который я ожидаю, равен 1.

z = symbols('z', real=True)
a = integrate(abs(z), (z, -1, 1))
simplify(a)

Аналогичный интеграл без абсолютного значения на z будет оцениваться.

Как я могу заставить sympy вычислить этот интеграл?


person Brian    schedule 19.09.2016    source источник
comment
У меня сложилось впечатление, что упрощение sympy еще не так хорошо, как могло бы быть. В simpy также есть несколько других методов упрощения (trigsimp, ratsimp, powsimp, combsimp,...), но я бы не стал рассчитывать на то, что они смогут упростить интеграл. Иногда упростить не удается, хотя для человека это выглядит очень просто. Вы можете использовать в этой ситуации также метод .evalf(). Посмотрите также здесь: docs.sympy.org/latest/tutorial/simplification.html< /а>   -  person dnalow    schedule 19.09.2016


Ответы (2)


integrate уже делает все возможное для вычисления интеграла. Если вы получите обратно объект Integral, это означает, что он не может его оценить. Единственное, что может помочь, — это переписать интегрант так, чтобы SymPy мог его распознать.

Глядя на эту проблему, похоже, что обходной путь — переписать ее как Heaviside:

In [201]: z = symbols('z', real=True)

In [202]: a = integrate(abs(z).rewrite(Heaviside), (z, -1, 1))

In [203]: a
Out[203]: 1
person asmeurer    schedule 21.09.2016

Я считаю, что вам следует использовать встроенную в Sympy функцию Abs().

Наслаждаться!

person et3rn1ty    schedule 19.09.2016
comment
Здравствуйте, спасибо за ваш ответ. К сожалению, я уже безуспешно пробовал встроенную функцию sympy.Abs. Кроме того, я считаю, что abs и sympy.Abs - это одна и та же функция. - person Brian; 19.09.2016
comment
abs верен, поскольку он просто вызывает метод z.__abs__, который определяется по-разному для каждого объекта (поплавки или символы sympy и т. д.). - person dnalow; 19.09.2016