【问题标题】:How do you evaluate functions from list in MATLAB如何在 MATLAB 中评估列表中的函数
【发布时间】:2015-01-21 21:37:52
【问题描述】:

我有一个问题,我需要评估存储在列表中的一堆函数。

我在 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)

但从变量中提取。

任何帮助都会很棒。谢谢。

【问题讨论】:

  • “准确评估”是什么意思?你想要浮点表示吗?你对subs(funList(1,1),x,5) 所做的对我来说似乎很好。

标签: matlab list function anonymous-function evaluate


【解决方案1】:

您可以做的另一件事是修改您的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)

【讨论】:

    【解决方案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'))
    

    将函数保存在元胞数组中很重要。函数数组是不可能的。对于 symfun,你会得到一个返回数组而不是函数数组的函数。

    【讨论】:

    • 这有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多