Для использования 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В этом примере минимизируется функция запуска решателя с учетом ограничения x1 + 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);