Как использовать 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);