2010-09-07 123 views
1

的解決方案,我有以下公式:簡單的方法來找到方程

f(N): N = ((1+lam)^3)/ ((1-lam)*(1+lam^2)); 

我需要創建指定N發現lam的功能。

現在我正在做使用簡單的循環:

lam = 0.9999; 
n = f(lam); 
pow = 0; 
delta = 0.1; 
while(abs(N - n)) > 0.1 & pow < 10000) 
    lam = lam - 0.001; 
    n = f(lam) 
    pow = pow+1; 
end 

我怎樣才能解決這個問題更準確,更沒有使用循環?

回答

3

如果你有

N = ((1+lam)^3)/ ((1-lam)*(1+lam^2)) 

那麼你知道

(1+lam)^3 = N*(1-lam)*(1+lam^2) 

假設你是擴大這些條款?合併成一個簡單的三次方程,實係數等於零?有沒有可以爲你解決的功能?

答案是肯定的。一種解決方案可能是使用fzero,但由於方程只是一個三次多項式,所以除非需要符號解決方案,否則根就是答案。使用符號工具箱處理符號問題。

+0

或者只是將方程式放在Maxima(free)中,並要求它解決lam。 – phkahler 2010-09-07 11:14:45

+0

或Wolfram Alpha。 – duffymo 2010-09-07 11:33:45

+0

謝謝,'fzero'的工作相當好:) – Gacek 2010-09-16 20:23:15

2

下面是Wolfram Alpha的爲N = 10的解決方案:

http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10 

代數解決方案爲您的特定情況下工作,因爲它不是非常困難。問題在於,一般而言,非線性方程需要迭代求解:從猜測開始,沿特定方向開始,並希望收斂到解決方案。一般情況下,您無法求解非線性方程,而無需迭代和循環。

1

繪圖表明,對於N正數,區間[-1,1)中只有一個解。你應該考慮Newton's method,它會很快收斂爲零初始猜測。

+0

事實上,在間隔(0,1) – Gacek 2010-09-09 08:59:36

0

有一個代數問題的解決方案爲N.這裏的大多數值是解決方案,通過Wolfram Alpha作爲解決:

if N+1!=0 
    x = (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3)/(3 2^(1/3) (N+1))-(2^(1/3) (2 N^2+3 N))/(3 (N+1) (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3))+N/(3 (N+1)) 

是的,這是醜陋的。

如果您有一個確切的代數解決方案,即使是像這樣的一個大丑陋的解決方案,總是優於數值解決方案。正如duffymo所指出的那樣,用數值方法解決問題需要迭代(所以速度很慢),解算器可能會陷入局部最小值。

+2

中總是應該有一個解決方案,我敢打賭10美元牛頓的方法與仔細選擇的初始猜測比這個更快。 – 2010-09-08 17:22:47

+0

我會非常驚訝,儘管這是相對有效的,儘管是醜陋的。但我很樂意被證明是錯誤的。 – Kena 2010-09-27 20:14:18

1

如其他答案中所討論的那樣,您可以用封閉形式解這個方程,但老實說,對於度數> 2的多項式的封閉形式解在實踐中並不是非常有用,因爲結果往往條件欠佳。

對於您的特定多項式,我同意亞歷山大說牛頓的方法可能是要走的路。從長遠來看,儘管如此,我強烈建議編寫(或從Internet重用)Jenkins-Traub根發現算法的實現。維基百科將其描述爲「實際上是黑箱多項式根找到者的標準」,並且它們並不誇張。它滿足了我多年來解決多項式的所有需求;根據我的經驗,它比牛頓的方法更強大(不依賴於最初的猜測)和基於特徵值的方法,而且啓動速度相當快。

+0

我可以第二個事實是封閉形式求解器在2或3度以外不是非常穩定的數字。 僅供參考有一個名爲[RPOLY ++]的Jenkins-Traub算法的開源C++實現(BSD許可證)(https://github.com/sweeneychris/RpolyPlusPlus) – kip622 2015-09-20 15:02:54