我试图在MATLAB中使用fmincon,但不太确定问题出在哪里。我的函数是:
function f = myfun(x4)
f = (C * x4 - d) .^ 2;
end
我这样称呼它:
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@myfun,x0,[],[],[],[],lb,[]);
但当我运行它时,我会得到
使用===>mtimes时出错内部矩阵维度必须一致。
然而,我检查了C是112x3,d是112x1,x4根本没有初始化,因为这正是我试图解决的问题。如果我创建一个"伪"x4,我可以运行(C*x4-d)。^2.没有问题。
有什么想法吗?我意识到这与使用lb为0的lsqr或者更确切地说是lsqlin是一样的,这也相当于lsqnonn,但这就是重点:我试图以不同的方式验证这些方法的结果。
这里有几个问题。
首先,您需要学习如何传入那些未优化的参数。函数myfun看不到C和d,因为函数有自己的工作空间,除非它们是嵌套函数。
接下来,由于您要计算受约束的线性最小二乘,因此需要返回平方和。fmincon需要一个标量目标。它不知道当你返回一个向量时该怎么办。
就我个人而言,我甚至不会去定义一个明确的m文件。使用函数句柄对此进行定义。所以也许你可以尝试这个目标:
myfun = @(x4) norm(C*x4 - d);
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(myfun,x0,[],[],[],[],lb,[]);
函数句柄可以看到C和d的值,因此一旦创建了句柄,这些变量就会在函数句柄工作区中携带。
注意,我用范数来计算平方和,事实上,这里是平方和的平方。但是在平方和最小化的地方,这个数的平方也是如此。它看起来有点干净,符合标准。
另一种选择是使用一个显式传递C和d值的myfun版本。在这里,我给出了myfun参数,然后基本上围绕myfun创建了一个函数句柄包装器。你也可以用myfun的m文件版本来做到这一点。
myfun = @(x4,C,d) norm(C*x4 - d);
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@(x4) myfun(x4,C,d),x0,[],[],[],[],lb,[]);
fmincon
的函数应该返回一个标量值。在函数中,它返回一个112乘1的向量。也许你需要更换
f = (C * x4 - d) .^ 2;
至
f = sum((C * x4 - d) .^ 2);