如果是多變量函數(shù),相對要麻煩一些,請你給個(gè)具體的例子,我再幫你做.否則我自己費(fèi)時(shí)間構(gòu)造半天的例子,很可能和你的需求不符.函數(shù)的表達(dá)式很長,變量大概有10多個(gè),不是可以打字打出來的那種,但是已經(jīng)計(jì)算出來了其表達(dá)式,就是想把他轉(zhuǎn)化成fminunc可以運(yùn)算的函數(shù)形式。請問有什么命令或者方法嗎?
面向符號表達(dá)式的優(yōu)化函數(shù)
花費(fèi)近一個(gè)小時(shí)的時(shí)間,給你編了個(gè)函數(shù),細(xì)節(jié)上或許還有可完善的地方,但基本框架應(yīng)該沒大問題了。覺得有用就采納了吧。
function [x_opt, fval] = fminunc_sym(f)
% 首先分析表達(dá)式中有哪些符號變量
vars=symvar(f);
N = length(vars);
varmap = cell(1, N);
% 要把所有變量替換為向量x的元素,首先單獨(dú)考慮表達(dá)式中有沒有x
syms x
idx = find(vars==x);
if ~isempty(idx)
f = subs(f, x, sprintf('x(%i)',idx));
varmap{idx} = x;
end
% 替換表達(dá)式中除x之外的變量
for k = 1 : N
if k == idx, continue, end
f = subs(f, vars(k), sprintf('x(%i)',k));
varmap{k} = vars(k);
end
% 轉(zhuǎn)換為關(guān)于x的內(nèi)聯(lián)函數(shù)
f_inline = inline(char(f), 'x');
% 調(diào)用優(yōu)化函數(shù)
[x, fval] = fminunc(f_inline, rand(N,1));
% 處理結(jié)果:把最優(yōu)點(diǎn)保存在一個(gè)struct中
for i = 1 : N
x_opt.(char(varmap{i})) = x(i);
end
調(diào)用實(shí)例
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