试试,下面的代码,如果xi是实数将eval(['syms ',sx,' ',sm])改为eval(['syms ',sx,' ',sm,' real']),计算结果可能更简洁一些,这里由于不知道你的m值,所以也将其参数化了,你可以将其换为你需要的值。若有问题,可继续追问
x=[];
m=[];
for i=1:24
sx=['x',num2str(i)];
sm=['m',num2str(i)];
eval(['syms ',sx,' ',sm])
eval(['x=[x,',sx,'];']);
eval(['m=[m,',sm,'];']);
end
sh=sum(x.^2)/2*1e6;
y=0;
for i=1:length(x)
y=y+sum(x(1:i));
sh=sh+(y-sum(x(1:i))/2)^2*m(i);
end
jac=jacobian(sh,x);
jac'
举个例子
syms x y z
f=x^2+x*y+z;
gradient=jacobian(f,[x,y,z])%求梯度
%gradient =
%[ 2*x + y, x, 1]
x=-1;y=2;z=3;
tiduzhi=eval(gradient) %求在(-1,2,3)的梯度值
%
%tiduzhi =
%
% 0 -1 1
对于补充的问题,那就没什么函数,你直接用diff求微分算了
gradient=[diff(f,x),diff(f,y),diff(f,z)]