Разница между определенной и неопределенной интеграцией в Mathematica?

Я заметил, что математика задыхается от определенных определенных интегралов, но если я делаю неодинаковую интеграцию и вычитаю предельные значения результирующей функции, она легко даст мне ответ.

Существуют ли разные алгоритмы для вычисления определенных и неопределенных интегралов? Есть ли причина, по которой описанная выше процедура не выполняется вручную Mathematica?

<сильные > Примеры:

Поскольку люди в комментарии просили примеры, вот два.

Timing[Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), x]]
Out:={0.010452,(-c+r x)/(r^2 Sqrt[c^2+r^2-2 c r x])}

Получает вывод немедленно. Хотя,

Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1}]

Сохраняет компьютер и замедляет мой старый компьютер. Через некоторое время он возвращает ненужный длинный результат во многих случаях. Это Mathematica 7. В этом интеграле нет особенностей или не выполняются сложные числа и т.д. Чтобы получить значение, позвольте прервать вычисление, выполняющееся в течение примерно минуты, и найти значение с помощью фундаментальная теорема исчисления вручную.

g = (r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2)
l = Integrate[g, x] /. x -> -1;
u = Integrate[g, x] /. x -> 1;
u - l
Out:= (-c+r)/(r^2 Sqrt[c^2-2 c r+r^2])-(-c-r)/(r^2 Sqrt[c^2+2 c r+r^2])
FullSimplify[%] 
Out:= ((-c+r)/Sqrt[(c-r)^2]+(c+r)/Sqrt[(c+r)^2])/r^2

Это действительно правильно. Наконец, для полноты сравним выход и время для определенного интеграла:

Timing[Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 
   1}]]
Out:= {174.52,If[(Re[c/r+r/c]>=2||2+Re[c/r+r/c]<=0||c/r+r/c\[NotElement]Reals)&&((Im[r] Re[c]+Im[c] Re[r]<=0&&((Im[c]+Im[r]) (Re[c]+Re[r])>=0||Im[c]^3 Re[r]+Im[r] Re[c] (Im[r]^2-Re[c]^2+Re[r]^2)>=Im[c] (Im[c] Im[r] Re[c]+Re[r] (Im[r]^2 ... blah blah half a page

Обратите внимание на время вычисления в три минуты и очень запутанный ответ.

Фактический пример из моей работы, я заметил это и был озадачен, но забыл об этом после подачи окончательного срока, до сегодняшнего дня, когда я снова столкнулся с той же проблемой.

f = 1/((-I c + k^2/2 - 1/2 (a + k)^2) (I d + k^2/2 - 
    1/2 (-b + k)^2)) + 1/((I c + k^2/2 - 1/2 (-a + k)^2) (I c + I d + 
    k^2/2 - 1/2 (-a - b + k)^2)) + 1/((I d + k^2/2 - 
    1/2 (-b + k)^2) (I c + I d + k^2/2 - 
    1/2 (-a - b + k)^2)) + 1/((I c + k^2/2 - 1/2 (-a + k)^2) (-I d + 
    k^2/2 - 1/2 (b + k)^2)) + 1/((-I c + k^2/2 - 
    1/2 (a + k)^2) (-I c - I d + k^2/2 - 
    1/2 (a + b + k)^2)) + 1/((-I d + k^2/2 - 1/2 (b + k)^2) (-I c - 
    I d + k^2/2 - 1/2 (a + b + k)^2))

Когда я пробовал определенный интеграл, я ждал и ждал, после нескольких часов (правда!) я наконец решил попробовать обходное решение, которое сработало в кратчайшие сроки:

fl =  Integrate[f, k] /. k -> -1 ;
fu =  Integrate[f, k] /. k -> 1 ;
F = fu - fl;
F1 = F /. {a -> .01, c -> 0, d -> 1};

Обратите внимание на, что я не говорю об особенностях как один комментарий. Integrate[1/x, {x, -1, 1}] почти сразу возвращает Integrate::idiv: Integral of 1/x does not converge on {-1,1}. >>, что является вполне разумным результатом.

Ответы

Ответ 1

Я думаю, что Даниил прав в своем комментарии выше: "Скорее всего, определенный код интеграции проверяет особенности на пути интеграции"

Просто посмотрите:

[email protected][(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1}]

Result -> None, I got bored waiting and aborted the calc

Пока:

[email protected][(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1},
          Assumptions -> {r ∈ Reals && c ∈ Reals && c != r && c != -r}]

->{3.688, (-Sign[c - r] + Sign[c + r])/r^2} 

код >

Итак, это вопрос условий, которые вы указываете для своих констант.

Еще один способ предложен в комментарии Саймона выше:

[email protected][(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1},  
                 GenerateConditions -> False]

{10.375, ((-c + r)/Sqrt[(c - r)^2] + (c + r)/Sqrt[(c + r)^2])/r^2}

И, наконец, вы также можете сделать:

[email protected][(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1},  
                 GenerateConditions -> True]

{16.45, ConditionalExpression[.. A long expression ...., Re[c^2 + r^2] > 0]}

Ответ 2

Велизарий ответил на это. Я просто хотел быть немного конкретным в том, что я имел в виду в комментарии, и как это применимо к этому примеру.

Знаменатель в подынтегральном выражении дает понять, что мы имеем проблему, если, скажем, r и c вещественны, положительны и r

In[1]:= InputForm[Timing[Integrate[(r - c*x)/(r^2 + c^2 - 2*r*c*x)^(3/2),
  {x, -1, 1}, Assumptions->r>c>0]]]
Out[1]//InputForm= {2.33, 2/r^2}

Отсутствие полезных предположений. Интеграция может занять значительное время, чтобы разобраться в регионах хорошего и плохого поведения. Технология под капотом является сложной (обработка неравенства может быть именно так). И, возможно, это не везде применяется наиболее эффективным образом.

Дополнительную информацию можно найти на

http://library.wolfram.com/infocenter/Conferences/5832/

или

http://dl.acm.org/citation.cfm?doid=2016567.2016569

Даниэль Лихтблау