面向符号表达式的优化函数
花费近一个小时的时间,给你编了个函数,细节上或许还有可完善的地方,但基本框架应该没大问题了。觉得有用就采纳了吧。function [x_opt, fval] = fminunc_sym(f)
% 首先分析表达式中有哪些符号变量
vars=symvar(f);
N = length(vars);
varmap = cell(1, N);
% 要把所有变量替换为向量x的元素,首先单独考虑表达式中有没有x
syms x
idx = find(vars==x);
if ~isempty(idx)
f = subs(f, x, sprintf('x(%i)',idx));
varmap{idx} = x;
end
% 替换表达式中除x之外的变量
for k = 1 : N
if k == idx, continue, end
f = subs(f, vars(k), sprintf('x(%i)',k));
varmap{k} = vars(k);
end
% 转换为关于x的内联函数
f_inline = inline(char(f), 'x');
% 调用优化函数
[x, fval] = fminunc(f_inline, rand(N,1));
% 处理结果:把最优点保存在一个struct中
for i = 1 : N
x_opt.(char(varmap{i})) = x(i);
end
调用实例syms x y z u v w
f = (x-1)^2 + (y-2)^2 + (z-3)^2 + (u-4)^2 + (v-5)^2 + (w-6)^2;
[vars, fval] = fminunc_sym(f)
得到vars =
u: 4.0000
v: 5.0000
w: 6.0000
x: 1.0000
y: 2.0000
z: 3.0000
fval =
2.3870e-012