如何在Matlab代码中编写涉及变量求和的表达式,然后如何最小化表达式?例如,我需要最小化以下功能
E=\sum_{i,j}[C_{ij}
对于r的任何值,我都需要最小化上面的表达式_{ij}s其中i和j不同。
我可以在MATLAB中使用fmincon(),但我无法适当地编写表达式,将其作为fmincon的输入。
谢谢。
试试这个:
E = sum(sum( C.*r + C2.*r.^2 ));
其中C
、C2
和r
是相同形状的矩阵。
fmincon
和其他优化函数不需要将所有内容都写成表达式,它们也可以针对函数进行优化。
function E = criterion(r, C, C2)
e = C.*r + C2.*r.^2;
E = sum(e(:));
我不完全确定fmincon
所需的语法,但我想它有点像E = f(theta)
,其中theta
是一个参数向量,您需要调整它,使E
最小。由于我没有发现你的问题被清楚地描述,我将假设你的参数是C
和C2
(在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);
您可以构造一个与其他情况类似的匿名函数。