2016-09-19 11 views
2

Когда я попытаюсь упростить следующий интеграл в sympy, он не будет оценивать, т. Е. Выход равен $ \ int _ {- 1}^1 | z | DZ $, а выход я ожидаю 1.sympy: как оценить интеграл от абсолютного значения

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

Похожие интеграл без абсолютного значения на z будет оценивать.

Как я могу получить sympy, чтобы оценить этот интеграт?

+3

Мое впечатление является упрощение этого SymPy является еще не так хорошо, как это могло быть. Есть также несколько других методов упрощения в simpy (триггсимп, ratsimp, powsimp, combsimp, ...), но я не буду рассчитывать на то, что они смогут упростить интеграл. Иногда упрощается неудача, даже если она выглядит очень простой для гуны. В этой ситуации вы также можете использовать метод .evalf(). Посмотрите также здесь: http://docs.sympy.org/latest/tutorial/simplification.html – dnalow

ответ

3

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

Глядя на this issue, это выглядит как обходной путь, чтобы переписать его как Хевисайда:

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

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

In [203]: a 
Out[203]: 1 
-3

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

Наслаждайтесь!

+0

Здравствуйте, спасибо за ваш ответ. К сожалению, я уже пробовал встроенную функцию 'sympy.Abs', но без успеха. Кроме того, я считаю, что 'abs' и' sympy.Abs' являются одной и той же функцией. – Brian

+1

abs является правильным, так как он просто вызывает метод 'z .__ abs__', который по-разному определяется для каждого объекта (поплавки или симплексные символы и т. Д.). – dnalow