LINUX.ORG.RU

Ответ на: комментарий от fractaler

Пробовал с помощью 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'ы распознавались?

GArik ★★★
() автор топика
Ответ на: комментарий от GArik

Судя по всему, if не распознаётся при интегрировании (об этом говорится в руководстве «Maxima by Example» by Edwin L. Woollett, ссылка на которое есть на странице документации Maxima, http://www.csulb.edu/~woollett/mbe7sint.pdf). В данном случае можно выкрутиться, задав функцию по-другому, например:

(%i1) f(x) := signum(x)*x;
(%o1) f(x):=signum(x)*x
(%i2) integrate(f(x), x, 1, 2);
(%o2) 3/2

Byron
()
Ответ на: комментарий от GArik

Численное интегрирование? Например:

(%i1) f(x):=if x>0 then x else -x;
(%o1)                  f(x) := if x > 0 then x else - x
(%i2) romberg(f(x), x, 1, 2);
(%o2)                                 1.5
Вооще, в руководстве написано:
(%i1) integrate(1/(sqrt(x)+1),x,0,1);
                                1
                               /
                               [       1
(%o1)                          I  ----------- dx
                               ]  sqrt(x) + 1
                               /
                                0
(%i2) integrate(1/(sqrt(x)+1),x,0,1),intanalysis:false;
(%o2)                            2 - 2 log(2)
Но у меня почему-то не срабатывает.

fractaler ★★★★★
()
Ответ на: комментарий от fractaler

Здесь: http://lib.custis.ru/Maxima написано, что такое происходит, когда система не может взять интеграл и, в таком случае, выражение надо упрощать включая мозги. В данном конкретном примере это будет не сложно.

fractaler ★★★★★
()
Ответ на: комментарий от Byron

Всё равно выходит так, что если 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

GArik ★★★
() автор топика
Ответ на: комментарий от fractaler

> выражение надо упрощать включая мозги. В данном конкретном примере это будет не сложно.

Мне не это надо посчитать =) Это просто пример того что у меня не работает.

GArik ★★★
() автор топика
Ответ на: комментарий от Byron

Гм, смотри:

(%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
(%i3) integrate(f(x), x, -1, 1),intanalysis:false;
                               1
                              /
                              [
(%o3)                         I    x signum(x) dx
                              ]
                              /
                               - 1
Как ты это сделал?

fractaler ★★★★★
()
Ответ на: комментарий от GArik

В общем, разбивай на интервалы самостоятельно. В доках сказано, что maxima не умеет символьно интегрировать выражения с if-then-else.

fractaler ★★★★★
()
Ответ на: комментарий от GArik

Да, действительно, считает только когда промежуток интегрирования попадает в один «кусок». Похоже, что Maхima не умеет работать с кусочными функциями.
Единственное, что ещё приходит на ум - это сторонний модуль pw со свой функцией интегрирования, но его возможности ограничены, и я не знаю насколько он стабилен:

(%i1) load(pw);
(%i2) f(x):=piecewise([[-inf,0,-x],[0,inf,x]],x);
(%i3) pwdefint(f(x),x,-1,1);
(%o3) 1
(%i4) g(x):=piecewise([[-inf,-1,-1],[-1,inf,x]],x);
(%i5) pwdefint(g(x),x,-2,3);
(%o5) 3
http://mysite.verizon.net/res11w2yb/pw.mac.txt
http://mysite.verizon.net/res11w2yb/Pw.html

Byron
()
Ответ на: комментарий от Byron

> Единственное, что ещё приходит на ум - это сторонний модуль pw со свой функцией интегрирования

Спасибо, думаю, что это то, что надо.

GArik ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.