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

Ошибочные допуски

Вопрос или проблемаОтвет

Как выбрать пороговое значение ошибок 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. Есть ли способ избежать хранения всех элементов?

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

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

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

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

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

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

Вопрос или проблемаОтвет

Решение не похоже на то, что я ожидал.

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

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

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

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

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

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

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

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

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

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

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

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

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

Я знаю, что решение претерпевает радикальное изменение во время 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.

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

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

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

Смотрите также

| | |

Похожие темы