我正試圖學習如何用python解決差分方程(也叫遞回關系)。
有關問題是方程
$x_{n 2}。- 4x_{n 1}。- x_{n} = 0$ 其中x_0 = 1 and x_1 = 1
這時輸出的序列:n=1, 1, 5, 21, 89, 377, ....
我通過使用數學來找到這個序列的一般運算式,然后將其定義為python中的一個函式來解決這個問題--并使其作業(有點)。
然而,我發布這個帖子的原因是,我認為有更好的方法可以做到這一點,我上面提到的解決方案是次優的。
在看了一些類似的例子后,比如如何用數字計算斐波那契數列。 我試著將這一方法概括化,并根據我正在研究的問題對其進行修改,希望它能夠發揮作用。它有點像,但不完全是。
我想出的解決方案是:
from numpy import zeros
N=100
x = zeros(N 1, int)
x[0] =1
x[1] =1
for n in range(2, N 1)。
x[n] = x[n-2] 4*x[n-1]
print(f "x[{n}] = {x[n]}"/span>)
##在x[15]之后產生錯誤的計算結果#。
所以我的兩個問題是:
是否有解決這類問題的一般和 "可靠 "的方法?如果有的話,有沒有人愿意分享任何例子?
為什么我在x[15]之后會得到奇怪的結果?有沒有人可以幫助我解決這個問題?
為什么我在x[15]之后會得到奇怪的結果?
輸出結果應該是
迭代序列輸出
===========================
x[0] 1
x[1] 1
x[2] 5
x[3] 21
x[4] 89
x[5] 377
x[6] 1597
x[7] 6765
.......
x[100] 137347080577163458295919672868222343249131054524487463986003968
而我得到的是:
x[0] 1
x[1] 1
x[2] 5
x[3] 21
x[4] 89
x[5] 377
x[6] 1597
x[7] 6765。
...
x[15] =701408733
.......
x[16] =-1323752223
x[17] = -298632863[/span>)
x[18] = =1776683621。
x[19] = -1781832971。
...
x[100] = -855830631 ...
uj5u.com熱心網友回復:
差分方程只是遞回關系。它們背后的數學可能相當棘手......尋找伴生矩陣的基礎,......但你需要一個堅實的背景。對于這些東西,我建議你使用sympy,它是一個用于符號操作的數學包。
import functools
@functools.lru_cache
def diff_eq(n)。
if n == 0 or n == 1: return 1: return
return 4*diff_eq(n-1) diff_eq(n-2)
for i in range(20)。
print(diff_eq(i))
輸出
1
5
21
89 89
377 377
1597 1597
6765[/span
28657[/span
121393[/span
514229 514229
2178309[/span
9227465[/span
39088169
165580141
701408733
2971215073
12586269025
53316291173
225851433717
為了提高遞回,你可以使用functools中的裝飾器lru_cache,docs。 備忘錄可呼叫程式,可保存最大尺寸的最近呼叫。我很感謝Nachiket的建議。
對于你的第二個問題:你忘了添加錯誤日志。RuntimeWarning: overflow encountered in long_scalars。如果你使用np.int64,你可能達到的最大整數是9223372036854775807.
uj5u.com熱心網友回復:
Numpy的開發是為了對數字陣列進行快速操作。這意味著型別提示被翻譯成一個固定位長的numpy內部數字型別。人們可以通過定義dtype=object來濫用numpy對其他物件進行操作,但一般來說,這不會比基于串列和迭代器的解決方案快。
你將numpy零陣列的型別定義為int,這顯然會被鑄成32位整數。因此,你得到的結果是在32位整數的限制下,溢位折疊到負數范圍。用print(x.type)檢查,你應該得到int32或者,就像我在python3中一樣,int64。
Python的內置整數物件在所有的整數操作中都會自動使用,它有一個多精度或大int型別,但這與numpy不是很兼容。試試吧
x=(N 1)*[0]
或者通過追加來構建串列,作為無numpy的替代方案。然后只需做這樣的改變,你的代碼就會產生
x[14] = 165580141
x[15] = 701408733
x[16] = 2971215073
x[17] = 12586269025
...
x[30] = 1779979416004714189
x[31] = 7540113804746346429
x[32] = 31940434634990099905
x[33] = 135301852344706746049
...
x[100] = 137347080577163115432025771710279131845700275212767467264610201
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/309450.html
標籤:
