Пробовал с помощью if, но как-то непонятно оно работает
(%i5) f(x) := if(x > 0) then x else -x;
(%o5) f(x) := if x > 0 then x else - x
(%i6) integrate(f(x), x, 1, 2);
2
/
[
(%o6) I (if x > 0 then x else - x) dx
]
/
1
(%i7) integrate(abs(x), x, 1, 2);
3
(%o7) -
2
Как сделать, чтобы нормально эти if'ы распознавались?
Судя по всему, if не распознаётся при интегрировании (об этом говорится в руководстве «Maxima by Example» by Edwin L. Woollett, ссылка на которое есть на странице документации Maxima, http://www.csulb.edu/~woollett/mbe7sint.pdf).
В данном случае можно выкрутиться, задав функцию по-другому, например:
Здесь: http://lib.custis.ru/Maxima написано, что такое происходит, когда система не может взять интеграл и, в таком случае, выражение надо упрощать включая мозги. В данном конкретном примере это будет не сложно.
Всё равно выходит так, что если maxima может считать то, что ей подсунули как один кусок, то она работает, а если надо разбить что-то на части и посчитать для них отдельно, то не получается ничего хорошего (ну у меня по крайней мере)
(%i1) f(x) := signum(x)*x;
(%o1) f(x) := signum(x) x
(%i2) integrate(f(x), x, -1, 1);
1
/
[
(%o2) I x signum(x) dx
]
/
- 1
Да, действительно, считает только когда промежуток интегрирования попадает в один «кусок». Похоже, что Maхima не умеет работать с кусочными функциями.
Единственное, что ещё приходит на ум - это сторонний модуль pw со свой функцией интегрирования, но его возможности ограничены, и я не знаю насколько он стабилен: