0

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

4

2 回答 2

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. 偷偷摸摸的方式: simpson('@(x) x.^2')(eval 创建一个适当的函数句柄)

  2. 肮脏的方式:

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

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

于 2013-10-26T09:04:12.427 回答
1

这里的问题eval是正在使用的方式。该文档表明,在您的示例中,输出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;

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

于 2013-10-26T09:56:21.473 回答