Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Check the Results of NDSolve - Wolfram Mathematica

Проверка результатов функции NDSolve

Для большинства дифференциальных уравнений, результаты, полученные путем применения NDSolve, являются весьма точными. Однако, поскольку такие результаты основаны на численной выборке и оценке ошибки, существует вероятность появления существенных ошибок. Поэтому, если необходимо убедиться в точности решения, требуется выполнить несколько основных проверок.

Сравнение решения, полученного с рабочей точностью WorkingPrecision более высокой, чем используемой по умолчанию машинной точностью MachinePrecision, зачастую очень полезно при проверке результатов.

Различные решения могут сохранять данные о решении в разных точках, что приводит к отличиям в этих точках. Чтобы удержать эти отличия в пределах численной погрешности решения, воспользуйтесь опцией InterpolationOrder ? All.

Используем NDSolve с применяемой по умолчанию машинной точностью MachinePrecision для вычисления решения:

In[1]:=

CheckTheResultsOfNDSolveRU_1.gif

Используем NDSolve с рабочей точностью CheckTheResultsOfNDSolveRU_2.gif для вычисления решения:

In[2]:=

CheckTheResultsOfNDSolveRU_3.gif

В силу того, что погрешности зачастую достаточно малы, их удобнее наблюдать на логарифмической шкале. Функция RealExponent[x] фактически эквивалентна  CheckTheResultsOfNDSolveRU_4.gif, но без сингулярности при нулевом значении аргумента, так что она отлично подходит для наблюдения различий, которые могут принимать нулевые значения в некоторых точках:

In[3]:=

CheckTheResultsOfNDSolveRU_5.gif

Out[3]=

CheckTheResultsOfNDSolveRU_6.gif

Невязка для дифференциального уравнения является разницей между его левой и правой частью:

In[4]:=

CheckTheResultsOfNDSolveRU_7.gif

Численные методы, используемые в функции NDSolve, разработаны таким способом, чтобы сохранять невязку малой в каждой точке. Вы можете построить график журнала невязок:

In[4]:=

CheckTheResultsOfNDSolveRU_8.gif

In[5]:=

CheckTheResultsOfNDSolveRU_9.gif

Out[5]=

CheckTheResultsOfNDSolveRU_10.gif

Как можно заметить, численная погрешность значительно ниже при использовании более высокой рабочей точности WorkingPrecision. Побочным эффектом этого является, естественно, увеличивающееся время вычислений.

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

In[6]:=

CheckTheResultsOfNDSolveRU_11.gif

In[7]:=

CheckTheResultsOfNDSolveRU_12.gif

In[8]:=

CheckTheResultsOfNDSolveRU_13.gif

Out[8]=

CheckTheResultsOfNDSolveRU_14.gif