matlab求解符号表达式的最值

问题描述:

matlab求解符号表达式的最值
如何把符号表达式转化为函数形式,比如用fminunc等

如果是单变量函数,做起来很简单,直接用inline就可以了;
如果是多变量函数,相对要麻烦一些,请你给个具体的例子,我再帮你做.否则我自己费时间构造半天的例子,很可能和你的需求不符.函数的表达式很长,变量大概有10多个,不是可以打字打出来的那种,但是已经计算出来了其表达式,就是想把他转化成fminunc可以运算的函数形式。请问有什么命令或者方法吗?

面向符号表达式的优化函数

 

花费近一个小时的时间,给你编了个函数,细节上或许还有可完善的地方,但基本框架应该没大问题了。觉得有用就采纳了吧。

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