NIntegrate не сходится рядом с точкой, которая не находится внутри моего определенного интеграла? - PullRequest
7 голосов
/ 16 октября 2011

Я пытаюсь вычислить определенный интеграл.Я пишу:

NIntegrate[expression, {x, 0, 1}, WorkingPrecision -> 100]

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

Я получаю ошибку:

"NIntegrate :: ncvb: NIntegrate не удалось сходиться с заданной точностью после 9 рекурсивных делений на xоколо {x} = {<< 156 >>}. ​​NИнтегратор получил << 157 >> и << 160 >> для интегральных оценок и оценок ошибок. >> "

Почему я получаю этоошибка для near{x} = {<<156>>}, когда я смотрю только на 0<x<1?И что означают двойные заостренные скобки вокруг числа?

Выражение действительно длинное, поэтому я думаю, что было бы более целесообразно показать, как я его генерирую. Это базовая версия (некоторые из показателей, которые ядолжны быть переменными, но это самые низкие значения, и я все еще получаю ошибку).

F[n_] := (1 - (1 - F[n-1])^2)^2;
F[0] = x;
Expr[n_]:= (1/(1-F[n]))Integrate[D[F[n],x]*x,{x,x,1}];

Я получаю ошибку, когда интегрирую Expr [3] или выше.Как ни странно, когда я использую обычный Integrate и затем // N в конце, я получаю комплексное число для n = 2.

1 Ответ

18 голосов
/ 17 октября 2011

<<156>> не означает, что интеграл оценивается в x=156. <<>> называется Skeleton и используется для указания того, что большой вывод был подавлен. Из документации:

Skeleton[n] представляет собой последовательность n пропущенных элементов в выражении, напечатанном с помощью Short или Shallow. Стандартная печатная форма для Skeleton: <<n>>.


Возвращаясь к вашему интегралу, вот ошибка, которую я получаю:

enter image description here

Таким образом, вы можете видеть, что это длинное число было подавлено в вашем случае (в зависимости от ваших предпочтений). Последняя >> - это ссылка, которая приводит вас к соответствующему сообщению об ошибке в документации.

Если вы попробуете совет в документе, который должен увеличить MaxRecursion, вы в конечном итоге получите новую ошибку ::slwcon

enter image description here

Итак, теперь это говорит вам, что ваш WorkingPrecision слишком мал или что у вас есть особенность (что обусловлено небольшой рабочей точностью). Увеличение WorkingPrecision до 200 дает следующий вывод:

enter image description here


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

num = Numerator@Expr@3;
den = Denominator@Expr@3;
Plot[{num, den}, {x, 0, 1}, WorkingPrecision -> 100, PlotRange -> All]

enter image description here

Таким образом, за пределами 0,7 балла у вашего выражения могут возникнуть серьезные проблемы со стабильностью, что приведет к появлению особенностей. Именно числитель, а не знаменатель, требует высокой точности, чтобы сходиться к нужному значению.

num /. x -> 0.99
num /. x -> 0.99`100

Out[1]= -0.015625
Out[2]= 1.2683685178049112809413795626911317545171610885215799438968\
06379991565*10^-14

den /. x -> 0.99
den /. x -> 0.99`100

Out[3]= 1.28786*10^-14
Out[4]= 1.279743968014714505561671861369465844697720803022743298030747945923286\
915425027352809730413954909*10^-14

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...