2011-11-17 16 views
2

假設我有一個線性遞推*,並且我想要找到它的封閉形式'Binet'表示形式。有沒有在Mathematica中做到這一點的好方法?在Mathematica中查找Binet形式

這似乎是一個非常基本的要求,當然有很多自然的方法可以讓Mathematica爲我做。但到目前爲止,我嘗試過的所有東西都失敗了:它一直在攪動,直到內存使用量過高,操作系統不得不關閉它,或者它警告說它不知道如何簡化簡單表達式或類似內容。如果問題很難解決,我可以理解這一點,但這並不是—因素的特徵方程,找到根源,並解決線性系統。我最近一次嘗試這種方式(並且程序崩潰)是以9度爲例,我不認爲9乘9線性系統應該很難解決。

當然,我不是唯一一個不時需要這樣做的人!什麼是正確的方法來做到這一點?

我失去了我的會議,所以我沒有我試過的確切代碼。一個解決方案使用RSolve創建了一個包含重複和初始點的List。另一個發現並考慮了特徵方程,並且將適當的根用到乘以與C [i]產生的係數相關的多重度的多項式的n次冪。我也試過各種方式解決和減少。

*或者是一個合理的生成函數。實際上,我將從一個List數字開始,這些數字是由不到一半長度的重複數字描述的,並且FindLinearRecurrenceFindGeneratingFunction可以執行不太難的轉換。例如,當我要求它解決一次復發時,它在計算過程中因sin^2(3pi/14)+ cos^2(3pi/14)而窒息,表示精度不夠。你會認爲它可以象徵性地簡化這樣的事情,但不會。

+0

你的意思呢? http://mathworld.wolfram.com/BinetForms.html 如果是這樣,將不會有一個函數來爲你做,但它看起來不像一個程序太糟糕寫。 – Searke

+0

@ Sekke:是的。對於某些列表多項式,任何線性遞歸都有形式爲'a [n_]:= Sum [polynomial [[i]] [n] * base [[i]]^n,{i,1,k}]'和長度爲k的基數。我想找到這些列表。我寫的四個程序都沒有給出答案:程序是正確的,但Mathematica無法解決上述原因導致的方程式。我正在尋找解決Mathemastica侷限性的方法。 – Charles

+0

推動推動我可以從頭開始編寫一個程序來完成此任務,而不是使用Mathematica的符號功能,但在這種情況下,我將不會使用Mathematica - 爲什麼要支付性能成本,如果不能使用任何高級功能? – Charles

回答

1

我不知道如果這是你腦子裏想的是什麼,但你可以做這樣的事情

Binet[ker_List, init_List] := 
Module[{charp, roots, polynomials, coeffs, base, p}, 
    roots = Tally[ 
    [email protected][ 
     PadLeft[Append[IdentityMatrix[Length[ker] - 1], Reverse[ker]]]]]; 
    coeffs = Table[p[i, j], {i, Length[roots]}, {j, roots[[i, 2]]}]; 
    polynomials = 
    Table[(Evaluate[i.#^Range[0, Length[i] - 1]]) &, {i, coeffs}]; 
    base = roots[[All, 1]]; 
    {polynomials /. 
    Solve[Table[ 
     Through[polynomials[n]].base^n == init[[n + 1]], {n, 0, 
     Length[init] - 1}], Flatten[coeffs]][[1]], base}] 

然後,對於一個線性遞推kernel和初始值initBinet[kernel, init]返回兩個列表。第一個包含多項式,第二個包含特徵多項式的根。在重複表的n個條目就等於a[kernel, init][n]

a[kernel_, init_] := [email protected][{p, b}, 
    {p, b} = Binet[kernel, init]; 
    Through[p[#]].b^#] & 

所以例如用於Fibonacci序列,你會得到

kernel = {1, 1}; 
init = {1, 1}; 
{p, b} = Binet[kernel, init] 

(* ==> {{0.723607 &, 0.276393 &}, {1.61803, -0.618034}} *) 

With[{sol = a[{1, 1}, {1, 1}]}, 
    Table[[email protected][n], {n, 0, 10}]]; 

(* ==> {1., 1., 2., 3., 5., 8., 13., 21., 34., 55., 89.} *) 
+0

這似乎工作,謝謝。 Mathematica是否有可能在這裏用'Root'對象(或者它們存在的簡單等價物)給出確切的解答? – Charles

+0

@Charles嘗試去除特徵值前的N @ @,看看它是否在速度和正確性方面起作用。 (我認爲這是正確的,但不確定速度或結果的大小。)我也懷疑可以從RSolve結果中獲得這種形式,但我不清楚Binet形式的確定性。 –

+0

好的,我刪除了'N @'並運行了'f = Binet [{2,-1,0,0,0,0,1,-2,1},{2,3,4,5,6,7 ,10,13,16]]。 (這是導致更早崩潰的例子。)f [[1]] [[i]]'當然是函數,所以我評估它們將它們轉換爲可以簡化的數字。 'f [[1]] [[1]] []','f [[1]] [[2]] []'等等,但[f [[1]] [[5]] [ ]'沒有出於某種原因:它給出了一個'Function :: slotn'錯誤。任何想法爲什麼會這樣? – Charles

1

我沒有比奈形式的知識,但解決您的關於簡化關注:

expr = Sin[3 pi/14]^2 + Cos[3 pi/14]^2; 

Simplify[expr] 
1
+0

是的,如果我直接餵它,它可以簡化它。但是當它在計算過程中遇到它時,它不僅不會簡化它,而且會完全結束計算。 – Charles

+0

@Charles我很抱歉,這沒有幫助。你能給我一個簡短的代碼示例,其中* Mathematica *扼殺在這個?表達式是在評估過程中產生的,還是明確給出的(在這種情況下,首先簡化是合理的)? –

+0

在評估過程中生成。我從來沒有輸入過Sin,它是由Mathematica生成的,Mathematica決定在沒有它的情況下不能完成計算。如果它完成了計算並保持不變,我可以使用'Simplify','FullSimplify',甚至是'/ .'來擺脫它,但它沒有。 – Charles