Иногда ваша целевая функция или нелинейные ограничительные значения функции доступны только симуляцией или числовым решением обыкновенного дифференциального уравнения (ODE). Такие задачи оптимизации имеют несколько общих характеристик и проблем, обсужденных в Потенциальных проблемах и Решениях.
Чтобы оптимизировать модель Simulink® легко, попытайтесь использовать Simulink Design Optimization™.
Решатели Optimization Toolbox™ используют производные цели и ограничительных функций внутренне. По умолчанию они оценивают эти производные с помощью приближений конечной разности формы
или
Эти приближения конечной разности могут быть неточными потому что:
Большое значение δ позволяет большей нелинейности влиять на конечную разность.
Маленькое значение δ приводит к погрешности из-за ограниченной точности в численных данных.
А именно, для симуляций и числовых решений ОДУ:
Симуляции часто нечувствительны к небольшим изменениям в параметрах. Это означает, что, если вы используете слишком небольшое возмущение δ, симуляция может возвратить побочную предполагаемую производную 0.
Обе симуляции и числовые решения ОДУ могут иметь погрешности в своих функциональных оценках. Эти погрешности могут быть усилены в приближениях конечной разности.
Числовое решение ОДУ вводит шум в значениях, намного больше, чем точность машины. Этот шум может быть усилен в приближениях конечной разности.
Если решатель ОДУ использует переменные размеры шага, то иногда количество шагов ОДУ в оценке F (x + δ) может отличаться от количества шагов в оценке F (x). Это различие может привести к побочному различию в возвращенных значениях, дав вводящую в заблуждение оценку производной.
Избегайте Конечных разностей при помощи Прямого Поиска. Если у вас есть лицензия Global Optimization Toolbox, можно попытаться использовать patternsearch
в качестве решателя. 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 решите один ОДУ на компонент.
Для теоретических и вычислительных аспектов этого метода смотрите Лейса и Крамера [2]. Для вычислительного опыта с этой и конечной разностью методы см. рисунок 7 Raue и др. [3].
Для некоторых симуляций можно оценить производную в рамках симуляции. Например, метод отношения правдоподобия описал в Реимене и Weiss [4] или бесконечно малом аналитическом методе возмущения, анализируемом в Heidelberger, главном администраторе, Zazanis и Сури [1] оценочные производные в той же симуляции, которая оценивает ограничительные функции или цель.
Используйте Более трудные Допуски ОДУ. Можно использовать odeset
, чтобы установить AbsTol
или допуски решателя ОДУ RelTol
к значениям ниже их значений по умолчанию. Однако выбор слишком маленького допуска может вести, чтобы замедлить решения, отказ сходимости или другие проблемы. Никогда не выбирайте допуск меньше, чем 1e-9
для RelTol
. Нижний предел на каждом компоненте AbsTol
зависит от шкалы вашей проблемы, таким образом, нет никакого совета.
Если симуляция использует случайные числа, то оценка цели или ограничительной функции дважды может возвратить различные результаты. Это влияет и на функциональную оценку и на оценку конечной разности. Значение конечной разности может быть во власти изменения из-за случайности, а не изменение из-за различной оценки указывает x и x + δ.
Если ваша симуляция использует случайные числа от потока, вы управляете, сбрасываете случайный поток перед каждой оценкой вашей цели или ограничительных функций. Эта практика может уменьшать изменчивость в результатах. Например, в целевой функции:
function f = mysimulation(x) rng default % or any other resetting method ... end
Для получения дополнительной информации смотрите, Генерируют Случайные числа, Которые Повторяемы (MATLAB).
Часто, симуляция выполняет и целевую функцию и ограничения во время той же запущенной симуляции. Или, и объективные и нелинейные ограничительные функции используют то же дорогое вычисление. Решатели, такие как fmincon
отдельно выполняют целевую функцию и нелинейные ограничительные функции. Это может привести к большому снижению эффективности, потому что решатель вызывает дорогое вычисление дважды. Чтобы обойти эту проблему, используйте метод в Объективных и Нелинейных Ограничениях в Той же Функции, или, при использовании основанного на проблеме подхода, Цели и Ограничений, Имеющих Общую Функцию в Последовательном или Параллельном, Основанном на проблеме.
Ваша симуляция или ОДУ могут перестать работать для некоторых значений параметров.
Установите Соответствующие Границы. В то время как вы не можете знать все ограничения на пространство параметров, попытайтесь установить соответствующие границы на всех параметрах, и верхних и ниже. Это может ускорить вашу оптимизацию и может помочь решателю избежать проблематичных значений параметров.
Используйте Решатель Который Границы Отношений. Как описано в Итерациях Может Нарушить Ограничения, некоторые алгоритмы могут нарушить связанные ограничения в промежуточных итерациях. Для оптимизации симуляций и ОДУ, используйте алгоритмы, которые всегда повинуются связанным ограничениям. См. Алгоритмы, Которые Удовлетворяют Связанные Ограничения.
Возвратите 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. и Крамер, M.A. Одновременное Решение и Анализ чувствительности Систем, Описанных Обыкновенными дифференциальными уравнениями. ACM Trans. Mathematical Software, Издание 14, № 1, стр 45–60, 1988.
[3] Raue, A. и др. Уроки, Извлеченные из Количественного Динамического Моделирования в Системной биологии. Доступный в http://www.plosone.org/article/info:doi/10.1371/journal.pone.0074335
, 2013.
[4] Реимен, M. I. и А. Вайс. Анализ чувствительности через отношения правдоподобия. Proc. 18-я Зимняя Конференция по Симуляции, ACM, Нью-Йорк, стр 285–289, 1986.