复制辛普森的规则,错误与eval

时间:2013-10-26 08:59:00

标签: matlab

我试图通过为它编写一个函数来复制辛普森的规则。但是,我还不清楚如何使用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传递给函数的字符串形式?

2 个答案:

答案 0 :(得分:1)

干净的方法:使用函数句柄,避免使用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. Sneaky方式:simpson('@(x) x.^2')(eval创建一个正确的函数句柄)

  2. 肮脏的方式:

    function result = simpson(fun)
        x = 4;
        f = eval(fun);
        result = f;
        return;
    end
    
  3. 这样称呼:simpson('x.^2')

答案 1 :(得分: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;

我建议使用函数句柄作为一种更安全,更简单的方法来实现它,但正如评论中所提到的那样,在你的情况下是不允许的。