我试图通过为它编写一个函数来复制辛普森的规则。但是,我还不清楚如何使用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传递给函数的字符串形式?
答案 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 ,我可以看到两个解决方案:
Sneaky方式:simpson('@(x) x.^2')
(eval创建一个正确的函数句柄)
肮脏的方式:
function result = simpson(fun)
x = 4;
f = eval(fun);
result = f;
return;
end
这样称呼: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;
我建议使用函数句柄作为一种更安全,更简单的方法来实现它,但正如评论中所提到的那样,在你的情况下是不允许的。