2014-02-06 129 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感謝回覆 –