2012-02-05 168 views
0

如何在Matlab代码中编写涉及变量求和的表达式,然后如何最小化表达式? ex。我需要最小化以下函数在Matlab中编写求和表达式

E = \ sum_ {I,J} [C_ {IJ}(R_ {IJ})+ C2_ {IJ}(R_ {IJ})^ 2]

我需要将上述表达式最小化为r_ {ij} s中i和j变化的任何值。

我可以在MATLAB中使用fmincon(),但我无法适当地编写我的表达式以将其作为fmincon()的输入。

谢谢。

回答

1

尝试这种情况:

E = sum(sum(C.*r + C2.*r.^2)); 

其中CC2r具有相同的形状的矩阵。

1

fmincon和其他优化功能不要求您将所有内容写入表达式,它们也可以针对函数进行优化。

function E = criterion(r, C, C2) 
    e = C.*r + C2.*r.^2; 
    E = sum(e(:)); 

我不能完全肯定由fmincon所需的语法,但我想这有点像E = f(theta),其中theta是你要调整,使得E是最小的一个参数向量。由于我没有明确描述你的问题,因此我会假设你的参数是CC2(在r是你的参数的情况下,情况类似且更简单)。

由于fmincon使用一个向量来存储这些系数,我们需要一个函数来取得这样一个向量并将它转换成上面函数criterion所需的大小。

function E = criterionRolledC(theta,r) 
    assert(numel(theta)==2*numel(r), 'The size of theta has to be twice the size of r'); 
    [M N] = size(r); 
    C = theta(1:M*N);  
    C2 = theta(M*N+1:end); 
    C = reshape(C , M, N); 
    C2 = reshape(C2, M, N); 

    E = criterion(r,C,C2); 

这样一来,就可以使一个匿名函数,很容易符合优化的界面:在当前工作空间的变量rValues包含您r@(theta)(criterionRolledC(theta,rValues))会做。

如果你想完全相反,即你的参数是r,这是简单的:

function E = criterionRolledR(theta,C,C2) 
    assert(numel(theta)==numel(C), 'The size of theta has to be the same size as C'); 
    assert(all(size(C)==size(C2)), 'C and C2 need to have the same size'); 
    [M N] = size(C); 
    r = reshape(theta, M, N); 

    E = criterion(r,C,C2); 

而且你同样可以构造一个匿名函数其他情况。