使用 Matlab 进行函数最小化时遇到问题,因为它 returns 尽管函数值发生了显着变化,但仍具有相同的值
Trouble having function minimization with constraints using Matlab as it returns the same value despite significant changes in function values
我正在尝试最小化下面显示为 fun(a) 的函数,并且对于 Gf_delta(1,2,...7) 值的不同计算值,它 returns a 'a' 的一组特定值,不随 Gf_delta 值的变化而变化。
An image attached as link here to help understand better
a0 = [1,1,1,1,1,0.5,1];
fun = @(a) Gf_delta1*a(1)+Gf_delta2*a(2)+Gf_delta3*a(3)+Gf_delta4*a(4)+Gf_delta5*a(5)+Gf_delta6*a(6)+Gf_delta7*a(7)
A = []
B = []
Aeq = [1 2 1 0 0 0 0; 0 1 0 2 0 0 1; 0 0 0 0 2 2 0; 2 0 0 0 0 1 0]
Beq = [2,1,4,2]
lb = [0,0,0,0,0,0,0]
ub = []
options = optimoptions(@fmincon,'Algorithm','sqp-legacy','MaxIterations',1500)
a = fmincon(fun,a0,A,B,Aeq,Beq,lb,ub,[],options)
非常感谢任何帮助或建议,谢谢。
欢迎来到 Whosebug。尝试重现您的问题时,Gf_delta
的不同值得到了不同的结果。请参阅以下复制粘贴的命令行输出:
>> Gf_delta = 1:7;
>> fun = @(a) Gf_delta*a.';
>> a = fmincon(fun,a0,A,B,Aeq,Beq,lb,ub,[],options)
a =
1.0000 0.5000 0 0.2500 2.0000 0.0000 0
>> Gf_delta = -3:3;
>> fun = @(a) Gf_delta*a.';
>> a = fmincon(fun,a0,A,B,Aeq,Beq,lb,ub,[],options)
a =
1.0000 0.2284 0.5433 0.3858 2.0000 0 0
请注意,我用向量替换了 Gf_delta
的单个值,这将 fun
简化为向量-向量乘法(但不会改变根本问题)。因此,相同优化结果的原因在于其他地方。
一些提示,原因可能在于:
请注意,MATLAB 存储在声明期间传递给匿名函数的变量值。因此,更改 Gf_delta
值需要再次创建 fun
(如上面的控制台输出所示)。 help page 提供了示例,其中创建了一个匿名函数并删除了参数。
也许,您的 Gf_delta
变量变化很小或以线性相关的方式变化,因此这个线性规划问题的解实际上保持不变。
我正在尝试最小化下面显示为 fun(a) 的函数,并且对于 Gf_delta(1,2,...7) 值的不同计算值,它 returns a 'a' 的一组特定值,不随 Gf_delta 值的变化而变化。
An image attached as link here to help understand better
a0 = [1,1,1,1,1,0.5,1];
fun = @(a) Gf_delta1*a(1)+Gf_delta2*a(2)+Gf_delta3*a(3)+Gf_delta4*a(4)+Gf_delta5*a(5)+Gf_delta6*a(6)+Gf_delta7*a(7)
A = []
B = []
Aeq = [1 2 1 0 0 0 0; 0 1 0 2 0 0 1; 0 0 0 0 2 2 0; 2 0 0 0 0 1 0]
Beq = [2,1,4,2]
lb = [0,0,0,0,0,0,0]
ub = []
options = optimoptions(@fmincon,'Algorithm','sqp-legacy','MaxIterations',1500)
a = fmincon(fun,a0,A,B,Aeq,Beq,lb,ub,[],options)
非常感谢任何帮助或建议,谢谢。
欢迎来到 Whosebug。尝试重现您的问题时,Gf_delta
的不同值得到了不同的结果。请参阅以下复制粘贴的命令行输出:
>> Gf_delta = 1:7;
>> fun = @(a) Gf_delta*a.';
>> a = fmincon(fun,a0,A,B,Aeq,Beq,lb,ub,[],options)
a =
1.0000 0.5000 0 0.2500 2.0000 0.0000 0
>> Gf_delta = -3:3;
>> fun = @(a) Gf_delta*a.';
>> a = fmincon(fun,a0,A,B,Aeq,Beq,lb,ub,[],options)
a =
1.0000 0.2284 0.5433 0.3858 2.0000 0 0
请注意,我用向量替换了 Gf_delta
的单个值,这将 fun
简化为向量-向量乘法(但不会改变根本问题)。因此,相同优化结果的原因在于其他地方。
一些提示,原因可能在于:
请注意,MATLAB 存储在声明期间传递给匿名函数的变量值。因此,更改
Gf_delta
值需要再次创建fun
(如上面的控制台输出所示)。 help page 提供了示例,其中创建了一个匿名函数并删除了参数。也许,您的
Gf_delta
变量变化很小或以线性相关的方式变化,因此这个线性规划问题的解实际上保持不变。