在MATLAB中使用fmincon时出现问题

时间:2013-07-19 22:52:53

标签: matlab matrix linear-algebra linear

我正在尝试在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,但重点是:我试图以不同的方式验证这些方法的结果。

感谢。

2 个答案:

答案 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);