Поиск и устранение распространенных проблем ОДУ

Ошибка Допусков

Вопрос или задачаОтвет

Как выбрать пороги ошибок RelTol и AbsTol?

RelTol, относительный допуск точности, управляет количеством правильных цифр в вычисленном ответе. AbsTolабсолютный допуск ошибок управляет различием между вычисленным ответом и истинным решением. На каждом шаге ошибка e в компонентных i решения удовлетворяет

|e(i)| ≤ max(RelTol*abs(y(i)),AbsTol(i))

Грубо говоря, это значит, что ты хочешь RelTol правильные цифры во всех компонентах решения, исключая цифры, меньшие порогового AbsTol(i). Даже если вы не заинтересованы в компоненте y(i) когда он является маленьким, вы, возможно, должны будете задать значение для AbsTol(i) это достаточно мало, чтобы получить некоторые правильные цифры в y(i) чтобы можно было точно вычислить более интересные компоненты.

Я хочу ответы, которые верны точности компьютера. Почему я не могу просто задать RelTol на eps?

Вы можете приблизиться к точности машины, но не так близко. Решатели не допускают RelTol рядом eps потому что они пытаются аппроксимировать непрерывную функцию. При допусках, сопоставимых с eps, арифметика машины заставляет все функции выглядеть прерывистыми.

Как сказать решателю, что меня не волнует получение точного ответа на один из компонентов решения?

Можно увеличить абсолютный допуск ошибок AbsTol для этого компонента решения. Если допуск больше, чем компонент решения, это указывает, что никакие цифры в компоненте не должны быть правильными. Решателю, возможно, придется получить некоторые правильные цифры в этом компоненте, чтобы точно вычислить другие компоненты, но он обычно обрабатывает это автоматически.

Шкала задачи

Вопрос или задачаОтвет

Насколько большие задачи я могу решить с помощью пакета ODE?

Основными ограничениями являются память и время. На каждом временном шаге решатели нежестких задач выделяют векторы длины n, где n - количество уравнений в системе. Решатели жестких задач выделяют векторы длины n но также выделите n-by- n Якобианская матрица. Для этих решателей может быть выгодно задать якобианский шаблон разреженности с помощью JPattern опция odeset.

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

Я решаю очень большую систему, но заботюсь только о нескольких компонентах y. Есть ли способ избежать хранения всех элементов?

Да. The OutputFcn опция специально разработана для этой цели. Когда вы вызываете решатель без выходных аргументов, решатель не выделяет хранилище для хранения всей истории решений. Вместо этого решатель вызывает OutputFcn(t,y,flag) на каждом временном шаге. Чтобы сохранить историю определенных элементов, запишите выходную функцию, которая хранит или строит графики только тех элементов, которые вам важны.

Какова стоимость запуска интегрирования и как ее уменьшить?

Самая большая стоимость запуска возникает, когда решатель пытается найти размер шага, соответствующий масштабу задачи. Если вам известен подходящий размер шага, используйте InitialStep опция. Для примера, если вы неоднократно вызываете интегратора в цикле местоположения события, последний шаг, который был сделан перед событием, вероятно, масштабируется правильно для следующего интегрирования. Тип edit ballode чтобы увидеть пример.

Размер первого шага, который принимает интегратор, слишком велик, и он пропускает важное поведение.

Размер первого шага можно задать с помощью InitialStep опция. Интегратор пробует этот размер шага, затем уменьшает его при необходимости.

Компоненты решения

Вопрос или задачаОтвет

Решение выглядит не так, как я ожидал.

Если ваши ожидания верны, уменьшите ошибку допусков от значений по умолчанию. Меньший допуск по относительной погрешности необходим, чтобы точно решить задачи, интегрированные на «длинных» интервалах, а также задачи, которые умеренно нестабильны.

Проверьте, существуют ли компоненты решения, которые в течение некоторого времени остаются меньше, чем их абсолютные ошибки допуском. Если это так, вы не требуете никаких правильных цифр в этих компонентах. Это может быть приемлемо для этих компонентов, но неспособность их точно вычислить может ухудшить точность других компонентов, которые от них зависят.

Мои графики недостаточно гладкие.

Увеличьте значение Refine от его значения по умолчанию 4 в ode45 или 1 в других решателях. Чем больше значение Refineчем больше выходных точек генерирует решатель. Скорость выполнения не сильно зависит от значения Refine.

Я строю график решения, как он вычисляется, и это выглядит нормально, но код застревает в какой-то момент.

Сначала проверьте, что функция ODE сглажена вблизи точки, где код застревает. Если это не так, то решатель должен предпринять небольшие шаги, чтобы справиться с этим. Это может помочь разбить интервал интегрирования на части, над которыми функция ODE плавна.

Если функция плавна, и код делает чрезвычайно небольшие шаги, вы, вероятно, пытаетесь решить жесткую задачу с решателем, не предназначенным для этой цели. Переключитесь на использование одного из жестких решателей ode15s, ode23s, ode23t, или ode23tb.

Что делать, если у меня есть окончательное, а не начальное значение?

Все решатели пакета ODE позволяют решать назад или вперед во времени. Синтаксис решателей [t,y] = ode45(odefun,[t0 tf],y0); и синтаксис принимает t0 > tf.

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

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

Если функция ОДУ заметно не меняется на tspan интервал, это может быть, что ваша проблема жесткая. Попробуйте использовать один из жестких решателей ode15s, ode23s, ode23t, или ode23tb.

Наконец, убедитесь, что функция ODE написана эффективным способом. Решатели много раз оценивают производные в функции ОДУ. Стоимость численного интегрирования критически зависит от затрат на оценку функции ОДУ. Вместо перевычисления сложных постоянных параметров при каждой оценке, сохраните их в глобальных переменных или вычислите их один раз и передайте их во вложенные функции.

Я знаю, что решение претерпевает радикальные изменения в то время t, где t0 <= t <= tf , но интегратор проходит мимо, не «видя» его.

Если вы знаете, что в данный момент происходит резкое изменение t, попробуйте разбить tspan интервал в две части, [t0 t] и [t tf], и дважды вызовите интегратора или продолжите интегрирование, используя odextend.

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

Тип задачи

Могут ли решатели обрабатывать дифференциальные уравнения с частными производными (PDE), которые были дискретизированы методом линий?

Да, поскольку дискретизация создает систему ОДУ. В зависимости от дискретизации, у вас может быть форма с большими матрицами, которую обеспечивают решатели ОДУ. Часто система жесткая. Это следует ожидать, если УЧП является параболическим или когда существуют явления, которые происходят в очень разных временных шкалах, таких как химическая реакция в потоке жидкости. В таких случаях используйте один из четырех жестких решателей ode15s, ode23s, ode23t, или ode23tb.

Если существует много уравнений, используйте JPattern опция для задания шаблона разреженности якобиана. Это может сделать различие между успехом и отказом, поскольку это препятствует тому, чтобы расчет был слишком дорогим. Тип edit burgersode чтобы увидеть пример, который использует JPattern.

Если система не жесткая, или не очень жесткая, то ode23 и ode45 более эффективны, чем жесткие решатели ode15s, ode23s, ode23t, и ode23tb.

Можно решить параболически-эллиптические дифференциальные уравнения с частными производными в 1-D непосредственно с MATLAB® УЧП pdepe.

Можно ли интегрировать набор выборочных данных?

Не напрямую. Вместо этого представьте данные как функцию путем интерполяции или какой-либо другой схемы для подгонки данных. Плавность сглаживания этой функции является критической. Кусочно-полиномиальное сглаживание, такое как сплайн, может выглядеть гладко для глаза, но грубо для решателя; решатель делает небольшие шаги, где производные сглаженной функции имеют переходы. Либо используйте функцию smooth, чтобы представлять данные, либо используйте один из решателей нижнего порядка (ode23, ode23s, ode23t, ode23tb), что менее чувствительно к гладкости. См. пример ОДУ с зависящими от времени терминами.

См. также

| | |

Похожие темы