你如何评估 MATLAB 列表中的函数
How do you evaluate functions from list in MATLAB
我有一个问题,我需要评估存储在列表中的一堆函数。
我在 paramList 中有一个函数 dg 和 'a' 和 'b' 的参数值:
syms a b x;
dg = symfun((a*exp(-a*(x-b)))/((1+exp(-a*(x-b)))^2),[a b x]);
paramList = [0.18, 20; 0.25, 25; 0.35, 15; 0.3, 20; 0.33, 30];
并且需要为 'a' 和 'b'.
列出具有不同参数值的函数 f(x)
我有一个函数可以做到这一点:
function [ out ] = getFunList( paramList, func )
syms a b x;
s = size(paramList);
s = s(1);
out = symfun.empty(1,s);
for i = 1:s
newFun = subs(func,a,paramList(i,1));
newFun = subs(newFun,b,paramList(i,2));
out(1,i) = newFun;
end
end
使用上面的函数会导致
>> funList = getFunList(paramList,dg)
funList =
[ (9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2), exp(25/4 - x/4)/(4*(exp(25/4 - x/4) + 1)^2), (7*exp(21/4 - (7*x)/20))/(20*(exp(21/4 - (7*x)/20) + 1)^2), (3*exp(6 - (3*x)/10))/(10*(exp(6 - (3*x)/10) + 1)^2), (33*exp(99/10 - (33*x)/100))/(100*(exp(99/10 - (33*x)/100) + 1)^2)]
但如果我尝试从这里进行评估,它不起作用:
>> subs(funList(1,1),x,5)
ans =
(9*exp(27/10))/(50*(exp(27/10) + 1)^2)
有没有办法让最后一个表达式准确计算?
>> eval(funList(1))
ans =
(9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2)
不起作用。
或者有存储匿名函数元胞数组的好方法吗?我试过了,但我不知道如何从变量创建匿名函数。例如:
>> cellarr = cell(1,3)
>> cellarr{1} = @(x) eval(funList(1))
cellarr =
@(x)eval(funList(1)) [] []
>>
这不是我想要的。我不确定如何让元胞数组存储
@(x) (9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2)
但从变量中提取。
任何帮助都会很棒。谢谢。
你真的需要symfun吗?在你的情况下,函数句柄似乎没问题。
f=@(a,b,x)((a*exp(-a*(x-b)))/((1+exp(-a*(x-b)))^2))
paramList = [0.18, 20; 0.25, 25; 0.35, 15; 0.3, 20; 0.33, 30];
for rw=1:size(paramList,1)
fcnList{rw}=@(x)f(paramList(rw,1),paramList(rw,2),x);
end
这将生成列表。如果您只想评估使用:
fcnList{1}(5)
或获取表达式:
fcnList{1}(sym('x'))
将函数保存在元胞数组中很重要。函数数组是不可能的。对于 symfuns,你得到一个返回数组而不是函数数组的函数。
您可以做的另一件事是修改 getFunList
,使其输出 元胞数组 。然后,您可以索引到访问所需函数的特定单元格,然后可以对该函数调用 subs
。类似于:
function [ out ] = getFunList( paramList, func )
syms a b x;
s = size(paramList);
s = s(1);
out = {}; %// Change
for i = 1:s
newFun = subs(func,a,paramList(i,1));
newFun = subs(newFun,b,paramList(i,2));
out{i} = newFun; %// Change
end
end
接下来,您可以获取任何您想要的函数并像这样替换您的 x
值:
>> subs(funList{1},x,5)
ans(a, b, x) =
(9*exp(27/10))/(50*(exp(27/10) + 1)^2)
我有一个问题,我需要评估存储在列表中的一堆函数。
我在 paramList 中有一个函数 dg 和 'a' 和 'b' 的参数值:
syms a b x;
dg = symfun((a*exp(-a*(x-b)))/((1+exp(-a*(x-b)))^2),[a b x]);
paramList = [0.18, 20; 0.25, 25; 0.35, 15; 0.3, 20; 0.33, 30];
并且需要为 'a' 和 'b'.
列出具有不同参数值的函数 f(x)我有一个函数可以做到这一点:
function [ out ] = getFunList( paramList, func )
syms a b x;
s = size(paramList);
s = s(1);
out = symfun.empty(1,s);
for i = 1:s
newFun = subs(func,a,paramList(i,1));
newFun = subs(newFun,b,paramList(i,2));
out(1,i) = newFun;
end
end
使用上面的函数会导致
>> funList = getFunList(paramList,dg)
funList =
[ (9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2), exp(25/4 - x/4)/(4*(exp(25/4 - x/4) + 1)^2), (7*exp(21/4 - (7*x)/20))/(20*(exp(21/4 - (7*x)/20) + 1)^2), (3*exp(6 - (3*x)/10))/(10*(exp(6 - (3*x)/10) + 1)^2), (33*exp(99/10 - (33*x)/100))/(100*(exp(99/10 - (33*x)/100) + 1)^2)]
但如果我尝试从这里进行评估,它不起作用:
>> subs(funList(1,1),x,5)
ans =
(9*exp(27/10))/(50*(exp(27/10) + 1)^2)
有没有办法让最后一个表达式准确计算?
>> eval(funList(1))
ans =
(9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2)
不起作用。
或者有存储匿名函数元胞数组的好方法吗?我试过了,但我不知道如何从变量创建匿名函数。例如:
>> cellarr = cell(1,3)
>> cellarr{1} = @(x) eval(funList(1))
cellarr =
@(x)eval(funList(1)) [] []
>>
这不是我想要的。我不确定如何让元胞数组存储
@(x) (9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2)
但从变量中提取。
任何帮助都会很棒。谢谢。
你真的需要symfun吗?在你的情况下,函数句柄似乎没问题。
f=@(a,b,x)((a*exp(-a*(x-b)))/((1+exp(-a*(x-b)))^2))
paramList = [0.18, 20; 0.25, 25; 0.35, 15; 0.3, 20; 0.33, 30];
for rw=1:size(paramList,1)
fcnList{rw}=@(x)f(paramList(rw,1),paramList(rw,2),x);
end
这将生成列表。如果您只想评估使用:
fcnList{1}(5)
或获取表达式:
fcnList{1}(sym('x'))
将函数保存在元胞数组中很重要。函数数组是不可能的。对于 symfuns,你得到一个返回数组而不是函数数组的函数。
您可以做的另一件事是修改 getFunList
,使其输出 元胞数组 。然后,您可以索引到访问所需函数的特定单元格,然后可以对该函数调用 subs
。类似于:
function [ out ] = getFunList( paramList, func )
syms a b x;
s = size(paramList);
s = s(1);
out = {}; %// Change
for i = 1:s
newFun = subs(func,a,paramList(i,1));
newFun = subs(newFun,b,paramList(i,2));
out{i} = newFun; %// Change
end
end
接下来,您可以获取任何您想要的函数并像这样替换您的 x
值:
>> subs(funList{1},x,5)
ans(a, b, x) =
(9*exp(27/10))/(50*(exp(27/10) + 1)^2)