我希望通过将x1
改为x5
来最小化以下等式。
y=[(x1*a+x2*b+x3*c+x4*d+x5*e)-z]
此处a,b,c,d,e
和z
都是向量。目标是找到a,b,c,d,e
的组合,以尽可能与z
匹配。这可以作为线性程序或类似的东西来完成吗?我有(x1 + x2)=0.6
和(x3 +x4 x5)=0.4
约束使用lsqlin设置为:
a=[1;2;3];
b=[2;5;1];
c=[8;1;3];
d=[6;2;1];
e=[5;4;3];
C=[a,b,c,d,e];
z=[6;5;2];
A=[1 1 0 0 0;
0 0 1 1 1] ;
bounds=[0.6; 0.4];
lb=zeros(5,1);
x = lsqlin(C,z,A,bounds,[],[],lb);
但是这会返回错误:
警告:大规模算法至少需要与方程一样多的方程式 变量 在C矩阵中;使用中等规模的算法。
在lsqlin 268优化终止。
x =
0.0000 0.5319 -0.0000 0.5745 0.2979
这忽略了我追求的平等。
答案 0 :(得分:0)
如果您只有等式约束并希望最小化均方误差,则可以使用mrdivide
解决此问题。
无约束的案例是:
x = z / [a b c d e]
有了约束,你有
y = [(x1 * a + x2 * b + x3 * c + x4 * d + x5 * e)-z] = [(x1 * a +(。6-x1)* b + x3 * c + x4 * d +(。4-x3-x4)* e)-z]
那样
x = [0 .6 0 0 .4] + (z -.6*b - .4*e) / [a-b c-e d-e] * [1 0 0; -1 0 0; 0 1 0; 0 0 1; 0 -1 -1]';
对于不等式约束,您需要设置二次程序并使用求解器,如Simplex或内点方法。
quadprog
MATLAB函数应该有效地做到这一点。 lsqlin
看起来也是一个不错的选择,并且可能更容易根据您的描述设置。