1

我是 Matlab 的新手,我应该使用这个函数来找到所有 3 个零点。

fm(我的文件可以找到函数)

function fval = f(x)
% FVAL = F(X), compute the value of a test function in x
fval = exp(-x) - exp(-2*x) + 0.05*x - 0.25;

所以很明显我写了“type f”来读取我的函数,但是我尝试像 fzero ('f', 0) 那样做,我得到 ans 0.4347,我假设这是我的 3 个零点中的 1 个,但是如何找到其他 2 ?

4

2 回答 2

2

来自fzero 文档

x = fzero(fun,x0)试图在 附近找到零乐趣x0,如果x0是标量。fun是一个函数句柄。fzero 返回的值x靠近 fun 更改符号的点,如果搜索失败,则返回 NaN。在这种情况下,搜索会在搜索间隔扩大直到找到 Inf、NaN 或复数值时终止。

所以它不能自己找到全零,只有一个!哪一个取决于您输入的x0.

如果您知道间隔,这是一个如何找到更多零的示例。然而,它只是重复调用fzero区间中的不同点(如果您的离散化过于粗糙,那么仍然可能会错过零),更聪明的技术显然会更快:

http://www.mathworks.nl/support/solutions/en/data/1-19BT9/index.html?product=ML&solution=1-19BT9

正如您在文档和上面的示例中所见,调用 fzero 的正确方法是使用函数句柄 ( @fun),因此在您的情况下:

zero1 = fzero(@f, 0);

该信息中,您还可以看到实际的根0.434738位于1.477554.84368。因此,如果您使用 0.4、1.5 和 4.8 调用 fzero,您可能会从中得到这些值(fzero 的收敛取决于它使用的算法以及您提供的函数)。

于 2012-09-21T07:28:24.877 回答
0

只是为了补充 Gunther Struyf 的回答:Stephen Morris 的文件交换中有一个很好的功能,称为FindRealRoots。此函数在任何间隔上找到任何函数的所有根的近似值。

它通过用切比雪夫多项式逼近函数来工作,然后计算该多项式的根。这显然只适用于连续、平滑和表现良好的函数,但你给出的函数似乎具有这些品质。

你会像这样使用它:

%# find approximate roots
R = FindRealRoots(@f, -1, 10, 100);

%# refine all roots thus found
for ii = 1:numel(R)
    R(ii) = fzero(@f, R(ii)); end
于 2012-09-21T09:47:42.447 回答