我正在尝试在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 没问题。
有什么想法?我意识到这与使用lsqr或lsqlin相同,lb为0,这也等同于lsqnonneg,但重点是:我试图以不同的方式验证这些方法的结果。
感谢。
答案 0 :(得分:2)
这里有几个问题。
首先,您需要了解如何传递未优化的参数。函数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的值,所以一旦创建了句柄,这些变量就会在函数句柄工作区内传递。
请注意,我使用norm来计算平方和,实际上,这里是一个平方和的sqrt。但是,如果最小化平方和,那么该数字的sqrt也是如此。它有点清洁,看起来很正常。
另一个选择是使用一个显式传入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,[]);
答案 1 :(得分:0)
您传递给fmincon
should return a scalar value的功能。在您的函数中,它返回一个112乘1的向量。也许你需要改变
f = (C * x4 - d) .^ 2;
到
f = sum((C * x4 - d) .^ 2);