Использовать GlobalSearch
или MultiStart
решатели, необходимо сначала создать структуру задачи. Рекомендуемый способ создать структуру задачи использует createOptimProblem
функция. Можно создать структуру вручную, но выполнение так подвержено ошибкам.
createOptimProblem
ФункцияВыполните эти шаги, чтобы создать структуру задачи с помощью createOptimProblem
функция.
Задайте свою целевую функцию как файл или анонимную функцию. Для получения дополнительной информации смотрите, Вычисляют Целевые функции. Если ваш решатель lsqcurvefit
или lsqnonlin
, гарантируйте, что целевая функция возвращает вектор, не скаляр.
При необходимости создайте свои ограничения, такие как границы и нелинейные ограничительные функции. Для получения дополнительной информации смотрите Ограничения Записи.
Создайте стартовую точку. Например, чтобы создать 3D случайную стартовую точку xstart
:
xstart = randn(3,1);
(Необязательно) Создайте использование опций optimoptions
. Например,
options = optimoptions(@fmincon,'Algorithm','interior-point');
Войти
problem = createOptimProblem(solver,
где solver
имя вашего локального решателя:
Для GlobalSearch
: 'fmincon'
Для MultiStart
выбор:
'fmincon'
'fminunc'
'lsqcurvefit'
'lsqnonlin'
Для выбора справки см. Таблицу решений Оптимизации.
Установите начальную точку с помощью 'x0'
параметр. Если вашей начальной точкой является xstart
, и ваш решатель fmincon
, ваша запись теперь
problem = createOptimProblem('fmincon','x0',xstart,
Включайте указатель на функцию для своей целевой функции в objective
:
problem = createOptimProblem('fmincon','x0',xstart, ... 'objective',@objfun,
Установите границы и другие ограничения как применимые.
Ограничение | Имя |
---|---|
нижние границы | 'lb' |
верхние границы | 'ub' |
матричный Aineq для линейных неравенств Aineq x ≤ bineq | 'Aineq' |
векторный bineq для линейных неравенств Aineq x ≤ bineq | 'bineq' |
матричный Aeq для линейных равенств Aeq x = beq | 'Aeq' |
векторный beq для линейных равенств Aeq x = beq | 'beq' |
нелинейная ограничительная функция | 'nonlcon' |
При использовании lsqcurvefit
локальный решатель, включайте векторы из входных данных и данных об ответе, названных 'xdata'
и 'ydata'
соответственно.
Лучшая практика: подтвердите структуру задачи путем выполнения решателя на структуре. Например, если ваш локальный решатель fmincon
:
[x,fval,eflag,output] = fmincon(problem);
createOptimProblem
Этот пример минимизирует функцию от Запущенного Решатель согласно ограничению x 1 + 2x2 ≥ 4. Цель
sixmin = 4x2 – 2.1x4 + x6/3 + xy – 4y2 + 4y4. | (1) |
Используйте interior-point
алгоритм fmincon
, и набор стартовая точка к [2;3]
.
Запишите указатель на функцию для целевой функции.
sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ... + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
Запишите линейные ограничительные матрицы. Измените ограничение в “меньше, чем” форма:
A = [-1,-2]; b = -4;
Создайте локальные опции, чтобы использовать interior-point
алгоритм:
opts = optimoptions(@fmincon,'Algorithm','interior-point');
Создайте структуру задачи с createOptimProblem
:
problem = createOptimProblem('fmincon', ... 'x0',[2;3],'objective',sixmin, ... 'Aineq',A,'bineq',b,'options',opts)
Получившаяся структура:
problem = struct with fields: objective: @(x)(4*x(1)^2-2.1*x(1)^4+x(1)^6/3+x(1)*x(2)-4*x(2)^2+4*x(2)^4) x0: [2x1 double] Aineq: [-1 -2] bineq: -4 Aeq: [] beq: [] lb: [] ub: [] nonlcon: [] solver: 'fmincon' options: [1x1 optim.options.Fmincon]
Лучшая практика: подтвердите структуру задачи путем выполнения решателя на структуре:
[x,fval,eflag,output] = fmincon(problem);