替代fzero功能

时间:2014-02-06 16:34:47

标签: matlab function

让我们考虑在MATLAB中使用以下代码:

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中有另一种方法?

3 个答案:

答案 0 :(得分:3)

fzero能够找到符号更改的根,其他人找不到。

如果可用,请使用符号工具箱:

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

答案 1 :(得分: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

答案 2 :(得分: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 = 0x = 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