【问题标题】:Replicating Simpson's rule, error with eval复制辛普森的规则,eval 出错
【发布时间】:2013-11-05 10:56:25
【问题描述】:

我试图通过为它编写一个函数来复制辛普森规则。但是,我仍然不清楚如何使用 eval 将字符串转换为 MatLab 中的实际函数。

函数是:

function result = simpson(fun, x0, xn, n)
    f = eval(fun);
    h = (xn-x0)/2;
    xstart = f(x0) + f(xn);
    x1 = 0;
    x2 = 0;

    for i = 1:n-1
        x = x0 + h*i;
        if (mod(i,2) == 0)
            x2 = x2 + f(x);
        else
            x1 = x1 + f(x);
        end
    end

    result = h*(xstart + 2*x2 + 4*x1)/3;

报错是

Error using eval
Undefined function or variable 'x'

如何将 x 传递给函数的字符串形式?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这里的问题是eval 的使用方式。 documentation 表示在您的示例中,输出 f 不是函数句柄(正如代码使用它的方式所预期的那样),而是 fun 函数的输出。

    因此,为了使eval 函数正常工作,您需要为其提供输入。

    例如:

    fun = 'x.^2';    
    x = 4;    
    f = eval(fun);
    

    f == 16 中的结果

    简而言之,只要您想调用fun,就必须将x 设置为适当的值,调用eval 并存储结果。

    例如,在您的代码中:

    f = eval(fun);
    h = (xn-x0)/2;
    xstart = f(x0) + f(xn);
    

    会变成:

    h = (xn-x0)/2;
    x = x0;
    fx0 = eval(fun);
    x = xn; 
    fxn = eval(fun);
    xstart = fx0 + fxn;
    

    我建议将函数句柄作为一种更安全、更简单的实现方式,但正如 cmets 中所述,这在您的情况下是不允许的。

    【讨论】:

      【解决方案2】:

      干净的方法:使用函数句柄,避免 eval。

      函数句柄记录在这里:http://www.mathworks.de/de/help/matlab/ref/function_handle.html

      像这样定义它们:

      sqr = @(x) x.^2;
      

      然后调用你的函数:

      simpson(sqr, 1, 2, 3);
      

      在你的函数中,你应该能够调用 fun(3) 并得到 9 作为结果。


      如果您必须使用 eval,我可以看到两种解决方案:

      1. 偷偷摸摸的方式:simpson('@(x) x.^2')(eval 创建一个适当的函数句柄)

      2. 肮脏的方式:

        function result = simpson(fun)
            x = 4;
            f = eval(fun);
            result = f;
            return;
        end
        

      这样称呼它:simpson('x.^2')

      【讨论】:

      • 谢谢,但它没有回答我的问题。我知道如何使用函数句柄,只是我被要求用 eval() 解决这个问题。
      猜你喜欢
      • 2015-12-15
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2012-10-19
      • 1970-01-01
      • 2020-01-19
      • 2016-01-12
      相关资源
      最近更新 更多