-1

我正在尝试在 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 或使用 lb 为 0 的 lsqlin 相同,这也等同于 lsqnonneg,但这就是重点:我正在尝试以不同的方式验证这些方法的结果。

4

2 回答 2

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,[]);
于 2013-07-19T23:48:06.950 回答
0

您传递给的函数fmincon 应该返回一个标量值。在您的函数中,它返回一个 112×1 向量。也许你需要改变

f = (C * x4 - d) .^ 2;

f = sum((C * x4 - d) .^ 2);
于 2013-07-19T23:13:35.410 回答