Иногда ваша целевая функция или нелинейные значения ограничительной функции доступны только путем симуляции или численным решением обыкновенного дифференциального уравнения (ОДУ). Такие задачи оптимизации имеют несколько общих характеристик и задач, обсуждаемых в Потенциальные проблемы and Solutions.
Для основанного на проблеме примера оптимизации ОДУ смотрите Подгонку ОДУ, Основанная на проблеме. Для примера, основанного на решателе, смотрите Подгонку Обыкновенного Дифференциального Уравнения (ОДУ).
Чтобы оптимизировать Simulink® легко моделируйте, попробуйте использовать Optimization™ Simulink Design.
Решатели Optimization Toolbox™ используют производные от целевых и ограничительных функций внутри. По умолчанию они оценивают эти производные, используя конечные дифференциальные приближения вида
или
Эти конечные дифференциальные приближения могут быть неточными, потому что:
Большое значение δ позволяет большей нелинейности влиять на конечное различие.
Небольшое значение δ приводит к неточности из-за ограниченной точности в числах.
В частности, для симуляций и численных решений ОДУ:
Симуляции часто нечувствительны к небольшим изменениям параметров. Это означает, что, если вы используете слишком маленькую δ возмущения, симуляция может вернуть ложную оценочную производную 0.
И симуляции, и числовые решения ОДУ могут иметь неточности в вычислениях функции. Эти неточности могут быть усилены в конечных дифференциальных приближениях.
Численное решение ОДУ вводит шум при значениях, намного больших, чем точность машины. Этот шум может быть усилен в конечных разностных приближениях.
Если решатель ОДУ использует переменные размеры шага, то иногда количество шагов ОДУ в оценке F ( x + δ) может отличаться от количества шагов в оценке F (x). Это различие может привести к ложному различию в возвращенных значениях, давая вводящую в заблуждение оценку производной.
Избегайте конечных различий при помощи прямого поиска. Если у вас есть лицензия Global Optimization Toolbox, можно попробовать использовать patternsearch
(Global Optimization Toolbox) в качестве решателя. patternsearch
не пытается оценить градиенты, поэтому не страдает от ограничений в Задачах в Конечных Различиях.
Если вы используете patternsearch
для дорогих (длительных) вычислений функции используйте Cache
опция:
options = optimoptions('patternsearch','Cache','on');
Если вы не можете использовать patternsearch
, и имеют относительно низкую размерность без ограничений задачу минимизации, попробуйте fminsearch
вместо этого. fminsearch
не использует конечные различия. Однако, fminsearch
не является быстрым или настраиваемым решателем.
Установите большие конечные различия. Можно иногда избежать проблем в Задачах в Конечных Различиях, сделав большие конечные шаги разности, чем по умолчанию.
Если у вас есть MATLAB® R2011b или позже установите значение опции размера шага с конечным различием, больше значения по умолчанию sqrt(eps)
или eps^(1/3)
, таких как:
Для R2011b-R2012b:
options = optimset('FinDiffRelStep',1e-3);
Для R2013a-R2015b и решателя с именем 'solvername'
:
options = optimoptions('solvername','FinDiffRelStep',1e-3);
Для R2016a и решателя с именем 'solvername'
:
options = optimoptions('solvername','FiniteDifferenceStepSize',1e-3);
Если у вас есть различные шкалы в разных компонентах, установите конечный размер шага различия в вектор, пропорциональный масштабам компонента.
Если у вас есть MATLAB R2011a или ранее, установите DiffMinChange
опция с большим значением, чем значение по умолчанию 1e-8
, и, возможно, установите DiffMaxChange
опция также, например:
options = optimset('DiffMinChange',1e-3,'DiffMaxChange',1);
Примечание
Трудно узнать, как задать эти конечные размеры различия.
Можно также попробовать задать центральные конечные различия:
options = optimoptions('solvername','FiniteDifferenceType','central');
Используйте функцию оценки градиента. Чтобы избежать задач оценки конечных различий, можно задать приблизительную градиентную функцию в своих целевых и нелинейных ограничениях. Не забудьте задать SpecifyObjectiveGradient
опция для true
использование optimoptions
, и, если это уместно, также установите SpecifyConstraintGradient
опция для true
.
Для некоторых ОДУ можно вычислить градиент численно одновременно с решением ОДУ. Для примера предположим, что дифференциальное уравнение для вашей целевой функции z (t, x) является
где x - вектор параметров, над которыми вы минимизируете. Предположим x что это скаляр. Затем дифференциальное уравнение для его производной y,
является
где z (t, x) является решением ОДУ целевой функции. Можно решить для y (t, x) в той же системе дифференциальных уравнений, что и z (t, x). Это решение дает вам аппроксимированную производную, никогда не беря конечных различий. Для нескалярных x решите по одной ОДУ на компонент.
Теоретические и вычислительные аспекты этого метода см. в Leis и Kramer [2]. Для вычислительного опыта с этим и конечноразностными методами, смотрите фигура Raue et al. [3].
Для некоторых симуляций можно оценить производную в симуляции. Например, метод отношения правдоподобий, описанный в Reiman и Weiss [4], или метод анализа бесконечно малых возмущений, проанализированный в Heidelberger, Cao, Zazanis и Suri [1], оценивают производные в той же симуляции, которая оценивает целевые или ограничительные функции.
Использование более жестких допусков ОДУ. Вы можете использовать odeset
для установки AbsTol
или RelTol
Допуски решателя ОДУ на значения ниже значений по умолчанию. Однако выбор слишком маленького допуска может привести к медленным решениям, отказу сходимости или другим проблемам. Никогда не выбирайте допуск меньше 1e-9
для RelTol
. Нижний предел для каждого компонента AbsTol
зависит от шкалы вашей проблемы, поэтому нет совета.
Если в симуляции используются случайные числа, то вычисление целевой или ограничительной функции дважды может вернуть различные результаты. Это влияет и на оценку функции, и на конечное различие оценку. В значении конечного различия может доминировать изменение из-за случайности, а не изменение из-за различных точек оценки x и x + δ.
Если в вашей симуляции используются случайные числа из потока, которым вы управляете, сбросьте случайный поток перед каждой оценкой вашей цели или ограничительных функций. Эта практика может уменьшить изменчивость результатов. Для примера в целевой функции:
function f = mysimulation(x) rng default % or any other resetting method ... end
Для получения дополнительной информации смотрите Сгенерировать случайные числа, которые являются повторяемыми.
Часто симуляция оценивает и целевую функцию, и ограничения во время одного и того же запуска симуляции. Или, как целевые, так и нелинейные функции ограничения используют одинаковые дорогие расчеты. Решатели, такие как fmincon
отдельно вычислите целевую функцию и нелинейные ограничительные функции. Это может привести к большой потере эффективности, потому что решатель дважды вызывает дорогие расчеты. Чтобы обойти эту задачу, используйте метод в Objective и нелинейных ограничениях в той же функции или, при использовании основанного на проблеме подхода, в Object и ограничениях, имеющих общую функцию в последовательной или параллельной, основанной на проблеме.
Ваша симуляция или ОДУ могут оказаться неудачными для некоторых значений параметров.
Установите соответствующие границы. Хотя вы можете не знать всех ограничений на пространство параметров, попробуйте задать соответствующие ограничения для всех параметров, как верхних, так и нижних. Это может ускорить вашу оптимизацию и может помочь решателю избежать проблемных значений параметров.
Используйте решатель, который уважает границы. Как описано в Итерации Могут Нарушать Ограничения, некоторые алгоритмы могут нарушать связанные ограничения при промежуточных итерациях. Для оптимизации симуляций и ОДУ используйте алгоритмы, которые всегда подчиняются связанным ограничениям. См. Алгоритмы, которые удовлетворяют связанным ограничениям.
Возврат NaN. Если ваша симуляция или решатель не ОДУ успешно вычислить целевую или нелинейную ограничительную функцию в x точек, убедитесь, что ваша функция возврата NaN
. Большинство решателей Optimization Toolbox и Global Optimization Toolbox имеют робастность к попытке другого итерационного шага, если они сталкиваются с NaN
значение. Эти устойчивые решатели включают:
fmincon
interior-point
, sqp
, и trust-region-reflective
алгоритмы
fminunc
lsqcurvefit
lsqnonlin
patternsearch
У некоторых людей возникает соблазн вернуть произвольное большое значение целевой функции в неудачной, недопустимой или другой плохой точке. Однако эта практика может запутать решатель, потому что решатель не понимает, что возвращенное значение произвольно. Когда вернешься NaN
решатель может попытаться вычислить в другой точке.
[1] Heidelberger, P., X.-R. Цао, М. А. Зазанис и Р. Сури. Свойства сходимости бесконечно малых оценок возмущения. Управленческая наука 34, № 11, стр. 1281 - 1302, 1988.
[2] Leis, J. R. and Kramer, M.A. Одновременное решение и анализ чувствительности систем, описанных обыкновенными дифференциальными уравнениями. ACM Trans. Mathematical Software, том 14, № 1, стр. 45-60, 1988.
[3] Raue, A. et al. Уроки, извлеченные из количественного динамического моделирования в системной биологии. Доступно в https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0074335
, 2013.
[4] Рейман, М. И. и А. Вайсс. Анализ чувствительности через коэффициенты правдоподобия. 18-я зимняя конференция по симуляции, ACM, Нью-Йорк, стр. 285-289, 1986.