使用fcn2optimexpr converte匿名约束函数

1视图(30天)
N = 20
N = 20
x = optimvar (“x”N下界的,1“UpperBound”1);
y = optimvar (“y”N下界的,1“UpperBound”1);
z = optimvar (“z”N下界的2,“UpperBound”,0);
elecprob = optimproblem;
cons1 = x ^ 2 + y ^ 2 + (z + 1)。^ 2;
elecprob.Constraints.cons1 = cons1 < = 1;
% elecprob.Constraints。plane1 = z < = x y;
% elecprob.Constraints。plane2 = z < = - x + y;
% elecprob.Constraints。plane3 = z < = x - y;
% elecprob.Constraints。plane4 = z < = x + y;
% %如果使用匿名约束函数ra[花边代码上行,
% %结果是不同的,有问题的
% %匿名约束函数和fcn2optimexpr
con2 = @ (x, y, z) (z + abs (x) + abs (y));
cons2 = fcn2optimexpr (con2, x, y, z);
elecprob.Constraints.cons2 = cons2 < = 0;
expr = optimexpr (1);
2 = 1:(n - 1)
jj = (2 + 1): N
exp (ii) = (x (ii) - x (jj)) ^ 2 + (y (ii) - y (jj)) ^ 2 + (z (ii) - z (jj)) ^ 2;
expr = expr + (exp (ii)) ^ (1/2);
结束
结束
elecprob.Objective = expr;
rng默认的%的再现性
x0 = randn (N, 3);
2 = 1:N
x0 (ii):) = x0 (ii):) /规范(x0 (ii):)) / 2;
x0 (2, 3) = x0 (ii, 3) - 1;
结束
init。x = x0 (: 1);
init。y = x0 (:, 2);
init。z = x0 (:, 3);
(溶胶、fval国旗)=解决(elecprob init)
使用fmincon解决问题。目标函数值较低的可行点。解算器过早地停止。fmincon停止,因为它超过了评价函数极限,选项。MaxFunctionEvaluations = 3.000000 e + 03。
索尔=结构体字段:
x(20×1双):y:[20×1双]z:[20×1双)
fval = 166.2480
国旗=
SolverLimitExceeded
如果使用匿名约束函数替换代码%指出,fval结果166.2480不同于正确的结果: 163.0099 ,有问题的匿名和fcn2optimexpr约束函数。
1评论
Torsten
Torsten 2023年3月6日
编辑:Torsten 2023年3月6日
你不该一个变量名称“经验值”(见下文),因为经验是留给MATLAB的指数函数。但目标的最优值是相同的。
你确定最优值是163.0099,而不是166.2480呢?你能设置最佳的x, y和z值作为初始值,看看会发生什么?
N = 20;
x = optimvar (“x”N下界的,1“UpperBound”1);
y = optimvar (“y”N下界的,1“UpperBound”1);
z = optimvar (“z”N下界的2,“UpperBound”,0);
elecprob = optimproblem;
cons1 = x ^ 2 + y ^ 2 + (z + 1)。^ 2;
elecprob.Constraints.cons1 = cons1 < = 1;
% elecprob.Constraints。plane1 = z < = x y;
% elecprob.Constraints。plane2 = z < = - x + y;
% elecprob.Constraints。plane3 = z < = x - y;
% elecprob.Constraints。plane4 = z < = x + y;
% %如果使用匿名约束函数ra[花边代码上行,
% %结果是不同的,有问题的
% %匿名约束函数和fcn2optimexpr
con2 = @ (x, y, z) (z + abs (x) + abs (y));
cons2 = fcn2optimexpr (con2, x, y, z);
elecprob.Constraints.cons2 = cons2 < = 0;
expr = optimexpr;
2 = 1:(n - 1)
jj = (2 + 1): N
val = (x (ii) - x (jj)) ^ 2 + (y (ii) - y (jj)) ^ 2 + (z (ii) - z (jj)) ^ 2;
expr = expr + val ^ (1/2);
结束
结束
elecprob.Objective = expr;
rng默认的%的再现性
x0 = randn (N, 3);
2 = 1:N
x0 (ii):) = x0 (ii):) /规范(x0 (ii):)) / 2;
x0 (2, 3) = x0 (ii, 3) - 1;
结束
init。x = x0 (: 1);
init。y = x0 (:, 2);
init。z = x0 (:, 3);
选择= optimoptions (elecprob)
选择。MaxFunctionEvaluations = 10000
[溶胶,fval,国旗]=解决(elecprob init,选项=选择)
sol.x
sol.y
sol.z

登录置评。

接受的答案

马特·J
马特·J 2023年3月6日
N = 20;
x = optimvar (“x”N下界的,1“UpperBound”1);
y = optimvar (“y”N下界的,1“UpperBound”1);
z = optimvar (“z”N下界的2,“UpperBound”,0);
elecprob = optimproblem;
cons1 = x ^ 2 + y ^ 2 + (z + 1)。^ 2;
elecprob.Constraints.cons1 = cons1 < = 1;
% %如果使用匿名约束函数ra[花边代码上行,
% %结果是不同的,有问题的
% %匿名约束函数和fcn2optimexpr
con2 = @ (x, y, z) (z + abs (x) + abs (y));
cons2 = fcn2optimexpr (con2, x, y, z);
elecprob.Constraints.cons2 = cons2 < = 0;
(I, J) =找到(triu ((N), 1));
elecprob.Objective = (1。/√(x (I) - x (J))。^ 2 + (y (I) - y (J))。^ 2 + (z (I) - z (J)) ^ 2));
rng默认的%的再现性
x0 = randn (N, 3);
2 = 1:N
x0 (ii):) = x0 (ii):) /规范(x0 (ii):)) / 2;
x0 (2, 3) = x0 (ii, 3) - 1;
结束
init。x = x0 (: 1);
init。y = x0 (:, 2);
init。z = x0 (:, 3);
选择= optimoptions (elecprob);
选择。MaxIterations = 50000;
opts.OptimalityTolerance = 1 e-16;
opts.StepTolerance = 1 e-16;
opts.FunctionTolerance = 1 e-16;
opts.Algorithm =“激活集”;
[溶胶,fval,国旗]=解决(init, elecprob选项=选择);
使用fmincon解决问题。目标函数值较低的可行点。解算器过早地停止。fmincon停止,因为它超过了评价函数极限,选项。MaxFunctionEvaluations = 6.000000 e + 03。
fval
fval = 162.9497
3评论
马特·J
马特·J 2023年3月7日
@Torsten 它可能不能帮助。
@jin勇 试验和错误,主要是。

登录置评。

答案(1)

金庸
金庸 2023年3月6日
编辑:Torsten 2023年3月6日
最优值fval将163.0099。
取代con2 = @ (x, y, z) (z + abs (x) + abs (y))
cons2 = fcn2optimexpr (con2 x, y, z)
elecprob.Constraints.cons2 = cons2 < = 0
:elecprob.Constraints。plane1 = z < = x y;
elecprob.Constraints。plane2 = z < = - x + y;
elecprob.Constraints。plane3 = z < = x - y;
elecprob.Constraints。plane4 = z < = x + y;
结果将会是:fval = 163.0099
清晰的
N = 20;
x = optimvar (“x”N下界的,1“UpperBound”1);
y = optimvar (“y”N下界的,1“UpperBound”1);
z = optimvar (“z”N下界的2,“UpperBound”,0);
elecprob = optimproblem;
cons1 = x ^ 2 + y ^ 2 + (z + 1)。^ 2;
elecprob.Constraints.cons1 = cons1 < = 1;
elecprob.Constraints。plane1 = z < = x y;
elecprob.Constraints。plane2 = z < = - x + y;
elecprob.Constraints。plane3 = z < = x - y;
elecprob.Constraints。plane4 = z < = x + y;
% %如果使用匿名约束函数ra[花边代码上行,
% %结果是不同的,有问题的
% %匿名约束函数和fcn2optimexpr
% con2 = @ (x, y, z) (z + abs (x) + abs (y));
% cons2 = fcn2optimexpr (con2, x, y, z);
% elecprob.Constraints.cons2 = cons2 < = 0;
expr = optimexpr;
2 = 1:(n - 1)
jj = (2 + 1): N
val = (x (ii) - x (jj)) ^ 2 + (y (ii) - y (jj)) ^ 2 + (z (ii) - z (jj)) ^ 2;
expr = expr + val ^ (1/2);
结束
结束
elecprob.Objective = expr;
rng默认的%的再现性
x0 = randn (N, 3);
2 = 1:N
x0 (ii):) = x0 (ii):) /规范(x0 (ii):)) / 2;
x0 (2, 3) = x0 (ii, 3) - 1;
结束
init。x = x0 (: 1);
init。y = x0 (:, 2);
init。z = x0 (:, 3);
选择= optimoptions (elecprob)
选择=
fmincon选择:选择使用的电流算法(“内点”):(其他可用的算法:“激活集”、“sqp’,‘sqp-legacy’,‘trust-region-reflective’)设置属性:没有选项集。默认的属性:算法:“内点”BarrierParamUpdate:“单调”CheckGradients: 0 ConstraintTolerance: 1.0000 e-06显示:“最终”EnableFeasibilityMode: 0 FiniteDifferenceStepSize:“sqrt (eps)”FiniteDifferenceType:“向前”HessianApproximation:“蓄热”HessianFcn: [] HessianMultiplyFcn: [] HonorBounds: 1 MaxFunctionEvaluations: 3000 MaxIterations: 1000 ObjectiveLimit: -1.0000 e + 20 OptimalityTolerance: 1.0000 e-06 OutputFcn: [] PlotFcn: [] ScaleProblem: 0 SpecifyConstraintGradient: 0 SpecifyObjectiveGradient: 0 StepTolerance: 1.0000平台以及SubproblemAlgorithm:“分解”TypicalX:“(numberOfVariables, 1)的”UseParallel: 0显示选项不习惯目前的算法(“内点”)
选择。MaxFunctionEvaluations = 10000
选择=
fmincon选择:选择使用的电流算法(“内点”):(其他可用的算法:“激活集”、“sqp’,‘sqp-legacy’,‘trust-region-reflective’)设置属性:MaxFunctionEvaluations: 10000默认的属性:算法:“内点”BarrierParamUpdate:“单调”CheckGradients: 0 ConstraintTolerance: 1.0000 e-06显示:“最终”EnableFeasibilityMode: 0 FiniteDifferenceStepSize:“sqrt (eps)”FiniteDifferenceType:“向前”HessianApproximation:“蓄热”HessianFcn: [] HessianMultiplyFcn: [] HonorBounds: 1 MaxIterations: 1000 ObjectiveLimit: -1.0000 e + 20 OptimalityTolerance: 1.0000 e-06 OutputFcn: [] PlotFcn: [] ScaleProblem: 0 SpecifyConstraintGradient: 0 SpecifyObjectiveGradient: 0 StepTolerance: 1.0000平台以及SubproblemAlgorithm:“分解”TypicalX:“(numberOfVariables, 1)的”UseParallel: 0显示选项不习惯目前的算法(“内点”)
[溶胶,fval,国旗]=解决(elecprob init,选项=选择)
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
索尔=结构体字段:
x(20×1双):y:[20×1双]z:[20×1双)
fval = 163.0099
国旗=
OptimalSolution
sol.x
ans = 20×1
-0.5374 0.0000 -0.4736 -0.2989 0.5374 -1.0000 -0.7883 0.0000 0.7883 0.4736
sol.y
ans = 20×1
0.0305 -0.4877 0.0000 0.9271 0.0305 0.0000 0.5278 0.0000 0.5278 0.0000
sol.z
ans = 20×1
-1.8428 -1.8730 -0.4736 -1.2260 -1.8428 -1.0000 -1.3162 -0.0000 -1.3162 -0.4736

类别

找到更多的在具体问题具体分析的优化设置帮助中心文件交换

下载188bet金宝搏


释放

R2022b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!