Как использовать GlobalSearch
или MultiStart
решатели, сначала необходимо создать структуру задачи. Рекомендуемый способ создать структуру задачи - использовать createOptimProblem
функция. Вы можете создать структуру вручную, но это подвержено ошибкам.
createOptimProblem
ФункцияВыполните следующие шаги, чтобы создать структуру задачи с помощью createOptimProblem
функция.
Определите свою целевую функцию как файл или анонимную функцию. Для получения дополнительной информации смотрите Вычисление целевых функций. Если ваш решатель lsqcurvefit
или lsqnonlin
, убедитесь, что целевая функция возвращает вектор, а не скаляр.
При необходимости создайте ограничения, такие как ограничения и нелинейные функции ограничений. Для получения дополнительной информации смотрите Запись ограничений.
Создайте начальную точку. Например, чтобы создать трехмерную случайную начальную точку 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
Этот пример минимизирует функцию из Run the Solver, удовлетворяющую ограничению x 1 + 2 x 2 ≥ 4. Цель состоит в том, чтобы
sixmin = 4 x2 – 2.1 x4 + x6/3 + xy – 4 y2 + 4 y4. | (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);