2011-05-20 36 views
1

我使用matlab進行符號計算。經過長時間的計算,我得到了一個x的函數,這是bessel函數的組合,我想找到它的零點。對於'sym'類型的輸入參數,使用fzero:未定義的函數或方法'isfinite'

爲此,我在Matlab中使用fzero函數。但是,雖然它對於單一的貝賽爾功能來說是完美的,但它不會爲礦山工作。

>> fzero(@(x)besselj(0,x), 3.5) 
ans = 
    2.4048

>> fzero(@(x)DELTA_xi, 3.5) ??? Undefined function or method 'isfinite' for input arguments of type 'sym'.

Error in ==> fzero at 333 elseif ~isfinite(fx) || ~isreal(fx)

>> DELTA_xi besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x)

爲什麼會發生這種情況?如何解決這個問題?

在此先感謝

回答

2

我想你錯誤的符號表示函數句柄。

fzero需要一個函數句柄。

所以,如果你這樣做:

DELTA_xi = @(x) besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x) 
fzero(DELTA_xi, 3.5) 

3.8173 

請注意,如果你要調用一個象徵功能,你將不得不間接地做到這一點:

fzero(@(x)eval(DELTA_xi), 3.5) 
+0

謝謝,那作品 – edio 2011-05-22 05:56:42

2

Rasman已經給你提供了一個解決你的問題的方法,但是我想我會更詳細地解釋你爲什麼要這麼做e得到你的錯誤並給你另一個可能的解決方案。

首先,從你的代碼考慮這個匿名函數:

fcn1 = @(x) besselj(0,x); 

函數有一個輸入變量x並把它傳遞給函數BESSELJ進行評估並返回作爲輸出。 FZERO使用此功能沒有問題。

現在考慮從您的代碼,它有它的表達式中使用創建的符號式DELTA_xi符號變量'x'這個其他匿名函數:

fcn2 = @(x) DELTA_xi; 

這個函數的輸入參數x,但應該做什麼用這個輸入參數? MATLAB不會自動知道將輸入變量x連接到DELTA_xi中的符號變量'x',所以當此函數被FZERO評估時,它將簡單地返回符號方程DELTA_xi(FZERO無法使用,如錯誤所示看到)。

使用功能EVALRasman's solution將使用可用值x從FZERO傳遞給匿名函數評估DELTA_xi,解決您的問題。然而,另一種解決方案是使用SUBS功能,像這樣:

fzero(@(x) subs(DELTA_xi,'x',x), 3.5) 

這將替換輸入值xDELTA_xi符號變量'x'的每一次出現,基本上做同樣的事情,EVAL但明確指出輸入參數替換哪個符號變量。區別?請注意,這將工作:

fzero(@(y) subs(DELTA_xi,'x',y), 3.5) 

但這不會:

fzero(@(y) eval(DELTA_xi), 3.5) 

由於輸入變量的名稱和符號變量不匹配。

+0

感謝您的解釋。這非常有用! – edio 2011-05-22 05:56:20

相關問題