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

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

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

Как я выбираю пороги ошибок 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- n Якобиевская матрица. Для этих решателей может быть выгодно задать якобиевский шаблон разреженности с помощью JPattern опция odeset.

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

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

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

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

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

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

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

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

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

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

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

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

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

Увеличьте значение Refine от его значения по умолчанию 4 \in 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), которые были дискретизированы методом линий?

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

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

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

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

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

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

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

| | |

Похожие темы