展开全部
这是一个很好的问题,虽然看似简单,但涉及到很多值得思考的问题。
首先,应该明确一点——fzero求函数零点是和初值的选取有密切关系的,例如,x^2-1有两个零点,取不同的初值,可能会求得不同的零点,如下图所示。
从图中能发现一些奇怪的现象,例如:
>> fzero(f,0.01)
ans =
-1
>> fzero(f,0.16)
ans =
1
>> fzero(f,0.161)
ans =
-1
>> fzero(f,-0.01)
ans =
1
>> fzero(f,-0.16)
ans =
-1
>> fzero(f,-0.161)
ans =
1
按常理,应该求得距离初值比较近的零点才对,但上面的例子显示,事实并非如此,甚至,求得相同零点所对应的初值范围还不连续,的确很让人崩溃。。。
说明一下fzero求零点的基本步骤:它会首先确定一个区间,使得区间两端的函数值异号,这样,只要函数连续,就能够求出一个零点。
确定区间的过程与初值x0有关,如果x0非零,就以x0/50为初始步长,向正负两个方向分别扩展区间,如果满足函数值异号,则确定区间的步骤完成,否则按照sqrt(2)的倍数增大步长,继续扩展区间。需要注意的是,扩展区间时,按照先负方向减步长、后正方向加步长的顺序,而且一旦左端点满足要求就会终止,这样,就可能出现从某个正的初值x0出发,分别向正负方向n次扩展区间,直到n+1次时,刚好负方向的符号改变,从而这个区间就确定为包围了负方向(例如-1)这个零点。
以上应该大致可以解释,为什么不是象直觉理解的那样“求出的零点应该靠近初值”。
展开全部
我也很好奇 就试了一下 fzero(@(x)x^2-1,0.05)时,ans=1,。fzero是一个数值搜索过程,依赖于函数特性,值的指定,以及matlab所能识别的最小步长。
如果想计算更准确,可以用符号函数求解0点。符号函数不用关心具体的函数值,完全当做符号处理,所以,不存在上述不稳定因素。
如果想计算更准确,可以用符号函数求解0点。符号函数不用关心具体的函数值,完全当做符号处理,所以,不存在上述不稳定因素。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
都说简单问题了,还问?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询