如何避免与fmincon消极的解决方案,包括外部方程?

18视图(30天)
你好,社区,
我想创建一个与fmincon优化脚本,包括一个 方程(f2),这不是通过fmincon解决 。这个方程将解决一个函数(见底部的脚本函数“kostfunktion”),但它包含的参数x(1)和(2)的优化问题。的 问题 是, f2因此fva l总是 如何 我可以设置这些参数吗 最低为0 或者至少 让他们积极?
涉及的情况是这个:
  • f1 = 10 * x1 + 2 * x2 - 30 f2 = - 2 * x1 - 10 * x2 + 30
范围:1 x1 < = 5 1 < < = = x2 < = 5 0 < = f1 < =正0 < = f2 < =正无穷
最小的优化目标是:obj = f1 + f2
f1将通过fmincon解决。f2将解决“kostfunktion”功能。
clc,清晰、明确全球;
全球f2% f2出现在工作区中,可见
x0 = [2;2;1);% (x1, x2, f1)
一个= [];
b = [];
Aeq = (-10 2);
说真的= [-30];
磅= [1;1;0);
乌兰巴托= [5;5;正);
选择= optimoptions (“fmincon”,“显示”,“通路”);
[x fval] = fmincon (Aeq @kostfunktion x0, A, b,说真的,磅,乌兰巴托,[],选项);
函数obj = kostfunktion (x)
全球f2
f2 = 2 * x (1) -10 * (2) + 30;
obj = x (3) + f2;% obj = f1(解决fmincon) + f2(解决这个函数)
结束
最优解决方案应该obj = 0 x1 = 2.5和x2 = 2.5,但是在这个脚本中,解决方案是obj = -24,因为我不能为f2设定界限。我如何设置范围为f2还是fval ?
谢谢你的支持。万博1manbetx

接受的答案

布鲁诺陈德良”class=
布鲁诺陈德良 2021年4月28日
编辑:布鲁诺陈德良 2021年4月28日
的条件
f2 = - 2 * x1 - 10 * x2 + 30 > = 0
是equivalen
2 * x1 + 10 * x2 + 0 * f1 < = 30。
所以设置
(2 10 0)=
b = 30
如果你不想使用 A / b 参数(由于f2可以更改为更一般的非线性函数),用非线性约束 nonlcon 参数和程序c输出处理约束。
6个评论
Drilon”class=
Drilon 2021年4月28日
由于布鲁诺,这个解决方案。
我会试着理解你的解决方案和测试它的另一个例子。

登录置评。

更多的答案(2)

马特·J”class=
马特·J 2021年4月28日
编辑:马特·J 2021年4月28日
因为你的问题是线性的,让我们使用 linprog ,
%就是与x = (x1, x2, f1, f2)
一个= [];
b = [];
Aeq = [-10 2 1 0;
2 10 0 1);
说真的= (-30 + 30);
磅= [1;1;0;0);
乌兰巴托= [5;5;正无穷;正);
obj = (0 0 1 1);
x = linprog (obj, A、b Aeq,说真的,磅,乌兰巴托)
找到最优解。
x = 4×1
2.5000 - 2.5000 0 0
9日评论
Drilon”class=
Drilon 2021年4月28日
编辑:Drilon 2021年4月28日
Missunderstanding。我只有一个与不同的约束优化问题。许多情况下的约束将会改变,所有这些情况下需要适应一个优化。会有百万病例,因此我不想做没有参数,我需要他们来创建调用所有的病例。

登录置评。


马特·J”class=
马特·J 2021年4月28日
编辑:马特·J 2021年4月28日
你可以考虑这样的:
x0 = [2;2;1);% (x1, x2, f1)
一个= [];
b = [];
Aeq = (-10 2);
说真的= [-30];
磅= [1;1;0);
乌兰巴托= [5;5;正);
选择= optimoptions (“fmincon”,“显示”,“通路”,“算法”,“sqp”,“MaxFunctionEvaluations”正,
“OptimalityTolerance”1 e-12“FunctionTolerance”1 e-12“StepTolerance”1 e-12);
[x fval] = fmincon (Aeq @kostfunktion x0, A, b,说真的,磅,乌兰巴托,[],选项)
Iter Func-count Fval可行性步长一阶最优步规范4 0 7.000000 7.000 e + e + 00 00 1.000 1.000 0.000 e + e + 00 00 e + 01 13 1 1.816455 5.219 1.681 5.824 e + e + 00 00 e-01 e-01 8.824 e + 00 2 26 1.018196 1.066 4.035 5.589 e + e + 00 00 e-02 e-01 7.560 e + 01 3 30 8.273146 e-01 3.553 e15汽油1.000 e + 00 9.951 e-01 1.012 e + 4 34 7.326886 e-01 3.553 e15汽油1.000 e + 00 1.005 e-02 1.001 e + 01 5 38 2.595588 e-01 0.000 5.026 1.000 e + e + 00 00 e-02 1.001 e + 01 6 48 1.874546 e-02 0.000 e + 00 1.176 e-01 2.957 e-02 2.062 e + 7 57 1.274881 e-02 0.000 e + 00 1.681 e-01 3.347 1.001 e + e 03 01 8 61 2.463475 e 03 3.553 e15汽油1.000 e + 00 1.093 1.000 e + e 03 01 9 70 1.949447 9.182 1.681 0.000 e + e 03 00 e-01 e-04 6.375 e + 00 74 3.575 3.999204 3.553 e-04 e15汽油1.000 e + 00 e-04 2.855 e + 00 11 78 3.656302 e-07 0.000 8.573 2.899 1.000 e + e + 00 00 e-04 e-02 12 82 5.079048 8.976 0.000 1.000 e + e + 00 00 e-11 e-11 e-06 1.200 e 03 13 86 5.079048 0.000 1.108 1.939 1.000 e + e + 00 00 e-21 e 03局部最小值。约束满足。fmincon停止因为当前步骤的大小小于一步尺寸公差的值和约束满足约束的值公差内。
x = 3×1
2.5000 2.5000 0.0000
fval = 5.0790 e-11
函数obj = kostfunktion (x)
全球f2
f2 = 2 * x (1) -10 * (2) + 30;
c = 10;
如果f2 < 0 f2 = exp (- c * f2) + c * f2-1;结束%申请一个点球
obj = x (3) + f2;% obj = f1(解决fmincon) + f2(解决这个函数)
结束
8的评论
Drilon”class=
Drilon 2021年4月28日
编辑:Drilon 2021年4月28日
布鲁诺,不是他的代码。我给他看了一个旧代码,问题出现了,因为他想了解问题 说真的。 因为这个问题,我正在寻找另一种解决方案,例如像马特的建议或你的。
然而,由于人。这两个解决万博 尤文图斯方案都是伟大的,但我认为nonlcon符合最对我的问题。
谢谢你的帮助。我很感激:)

登录置评。

类别

找到更多的在和迭代解算器输出显示帮助中心文件交换

s manbetx 845


释放

R2020b

社区寻宝

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

开始狩猎!

翻译的