我是Matlab的新手,我应该使用此功能查找所有3个零点。
f.m(我的文件中可以找到该功能)
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;
显然我写了#34;键入f"阅读我的功能,但后来我尝试做fzero(' f',0),我得到了ans 0.4347,我认为我的3个零点中的1个但是如何找到另一个2?
答案 0 :(得分:2)
如果x = fzero(fun,x0)
是标量,
x0
会尝试在x0
附近找到乐趣。fun
是一个函数句柄。 fzero返回的值x
接近乐趣变化符号的点,如果搜索失败则为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);
从this info,您还可以看到实际根位于0.434738
,1.47755
和4.84368
。因此,如果你用0.4,1.5和4.8调用fzero,你可能会得到这些值(fzero的收敛取决于它使用的算法和你提供的函数)。
答案 1 :(得分:0)
只是为了补充Gunther Struyf的回答:Stephen Morris在文件交换中有一个很好的功能叫做FindRealRoots。此函数查找任何区间上任何函数的所有根的近似值。
它的工作原理是用Chebyshev多项式逼近函数,然后计算该多项式的根。这显然只适用于连续,平滑和其他表现良好的功能,但您提供的功能似乎具有这些特性。
你会使用这样的东西:
%# 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