Начальные значения для проблемной нелинейной оптимизации (MATLAB) - PullRequest
1 голос
/ 23 мая 2019

Я написал некоторый код для запуска довольно простой задачи нелинейной оптимизации в MATLAB. Я следовал их гиду , но столкнулся с проблемой с указанием начальных точек. Это код, который я использовал:

k1 = optimvar('k1', 'LowerBound', -5, 'UpperBound', 5);
k2 = optimvar('k2', 'LowerBound', -5, 'UpperBound', 5);
k3 = optimvar('k3', 'LowerBound', -5, 'UpperBound', 5);
f = optimvar('k4', 'LowerBound', -5, 'UpperBound', 5);

obj1 = fcn2optimexpr(@eq1, k1, k2, k3, f);
obj2 = fcn2optimexpr(@eq2, k1, k2, k3, f);

confn1 = obj1 == 0;
confn2 = obj2 == 0;
confn3 = 1/2*(-0.0581244*f - 1.2747*k1 - 2.20973*k2 - 2.52383*k3 - (0.0162586*f^2 - 0.00622076*f*k1 + 0.406664*k1^2 - 0.0475778*f*k2 + 1.41521*k1*k2 + 1.24684*k2^2 - 0.148724*f*k3 + 1.62991*k1*k3 + 2.9517*k2*k3 + 1.84751*k3^2)^(1/2)) <= 0;
confn4 = 1/2*(-0.0581244*f - 1.2747*k1 - 2.20973*k2 - 2.52383*k3 + (0.0162586*f^2 - 0.00622076*f*k1 + 0.406664*k1^2 - 0.0475778*f*k2 + 1.41521*k1*k2 + 1.24684*k2^2 - 0.148724*f*k3 + 1.62991*k1*k3 + 2.9517*k2*k3 + 1.84751*k3^2)^(1/2)) <= 0;

prob1 = optimproblem('Objective', obj1);
prob2 = optimproblem('Objective', obj2);

prob1.Constraints.confn1 = confn1;
prob1.Constraints.confn2 = confn2;
prob1.Constraints.confn3 = confn3;
prob1.Constraints.confn4 = confn4;

prob2.Constraints.confn1 = confn1;
prob2.Constraints.confn2 = confn2;
prob2.Constraints.confn3 = confn3;
prob2.Constraints.confn4 = confn4;

k10.k1 = 0;
k20.k2 = 0;
k30.k3 = 0;
f0.f = 0;

[sol, fval, exitflag, output] = solve(prob1, k10, k20, k30, f0)

function f1 = eq1(k1, k2, k3, f)
f1 = 0.01309 + 0.0297574*f + 1/3*(-1.02013*k1 - 1.78339*k2 - 2.10318*k3);
end

function f2 = eq2(k1, k2, k3, f)
f2 = 0.01309 + 0.0334722*f + 1/3*(-0.653523*k1 - 1.14525*k2 - 1.36932*k3);
end

И я получаю ошибку:

Ошибка при использовании optim.problemdef.OptimizationProblem / solve Значение «x0» недействительно. Начальная точка должна содержать значения для переменной 'k2'.

Ошибка в SymSolver (строка 32) [sol, fval, exitflag, output] = решить (проб1, к10, к20, к30, f0)

Я уверен, что это просто проблема синтаксиса с моей стороны, но я не могу понять, что это такое. Какие-либо предложения? Спасибо:)

1 Ответ

2 голосов
/ 23 мая 2019

Попробуйте это

k0.k1 = 0;
k0.k2 = 0;
k0.k3 = 0;
k0.f = 0;
[sol, fval, exitflag, output] = solve(prob1, k0)
...