2014-02-06 91 views
1

的让我们考虑下面的代码在MATLAB:替代fzero功能

f=inline('x.^4-29*x.^2-132','x') 
f = 
    Inline function: 
    f(x) = x.^4-29*x.^2-132 

x=fzero(f,-5.5) 
x = 
    -5.744562646538029 

f(x) 
ans = 
    0 

有fzero工作正常,但下面的代码

g=inline('x^2','x') 
g = 
    Inline function: 
    g(x) = x^2 

h=fzero(g,-1.3) 
Exiting fzero: aborting search for an interval containing a sign change 
    because NaN or Inf function value encountered during search. 
(Function value at 1.5776e+154 is Inf.) 
Check function or try again with a different starting value. 

h = 
    NaN 

返回这个结果,我该如何解决?我应该引入一些容差还是在MATLAB中有另一种方法?

+0

'fzero'用于函数会在一定的时间间隔内改变它的符号,文档清楚地说,[这里](http://www.mathworks.com/help/matlab/ref/fzero.html#btoc6lj-10),“'x = fzero(FUN,X0)'试图找到一个'x'的地方,其中'fun(x)= 0'。这个解决方案是'fun(x)'改变符号的地方。 'fzero'找不到函数的根,例如'x^2'“。 –

+0

我知道这个,所以我的问题是替代方法 –

+0

我以为你想用'fsolve'来解决你的问题 –

回答

3

fzero能够找到符号变化的根源,其他未找到。

如果可以使用符号工具箱:

syms x 
w=x.^4-29*x.^2-132 
solve(w) 
v=x^2 
solve(v) 
+0

所以这意味着解决方案是另一种方式吗?感谢您的回复 –

3

您还可以使用fminsearch

x=fminsearch(@(x) abs(x^2),-5.5) 
x =  
    4.4409e-15 

x=fminsearch(@(x) abs(x.^4-29*x.^2-132),-5.5)  
x =  
    -5.7446 
3

而只是为了完成此行的答案,有roots。它适用于多项式并为您提供所有可能的解决方案(包括复杂的解决方案)。

f = [1 0 -29 0 -132]; %// x^4 + 0x^3 -29x^2 + 0x -132 
roots(f)  
ans = 
    -5.7446   
    5.7446   
    0.0000 + 2.0000i  %// Funny coincidence 
    0.0000 - 2.0000i 

而且现在对其他例子(注意:x^2 = 0具有x = 0双根:

f = [1 0 0];   %// x^2 + 0x + 0 
roots(f) 
ans = 
    0 
    0 

而只是为了好玩,x^2 = -1

f = [1 0 1]; 
roots(f) 
ans = 
     0 + 1.0000i 
     0 - 1.0000i 
+0

+1感谢回复 –