連分數近似演算法

2022-08-20 23:18:09 字數 1929 閱讀 6771

(2023年2月19日註:這篇文章原先發在自己github那邊的部落格,時間是2023年2月5日)

這道題源自數學實驗上面的一組實驗,當時困擾了我特別久,題目的內容是用matlab求出π的連分數展開及每層迭代的值。

因為matlab的數值精度的問題,當你執行3+16450/16421時,就算你設定了format rat,也沒有辦法顯示準確的有理分數的值。原書是用mathmatica做的,直接一句命令就出來了。

其實matlab裡面也是有相應的連分數展開的命令的,詳細可以檢視以下:

continued fraction expansion

但是顯然精度高時,就會遇到那天敘森寫的學習筆記的另外一面,精度要求太高,函式無法滿足要求,舉個例子。

>> rat(pi,1e-31)

ans =

3 + 1/(7 + 1/(16 + 1/(-294 + 1/(3 + 1/(-4 + 1/(5 + 1/(-15)))))))

>> rat(pi,1e-18)

ans =

3 + 1/(7 + 1/(16 + 1/(-294 + 1/(3 + 1/(-4 + 1/(5 + 1/(-15)))))))

其實後來我測試自己的演算法也是有問題的,但是至少比之前迭代不到10次就直接誤差為0了要好得多,究其原因還是因為前面運算的時候用的是double型數,這裡我嘗試過,如果在一開始就使用符號運算的話,不僅運算時間無法忍受,而且很容易迭代到20次以後就直接程式堆疊溢位或者nan或者是inf了。

好了,說了這麼多,該介紹下連分數是什麼了,其實也不難,據說拉馬努金對這個非常的了解。$$s_ = \frac+\frac+\frac+…}}}$$

為了演算法的簡便,我們設定的是這組數列全部都是正整數。對於有理數,我們知道,這組數列一定是有限數列,對於無理數,這組數列大部分情況下是無限數列。我們可以從某乙個數開始,設定它為0,按照這樣子的順序,加出來乙個有理分數,這個有理分數就是我們需要的值,舉個例子。$$\pi = \frac}}$$

演算法的大致步驟如下:

(1) 根據輸入的number值,取不足近似整數(matlab裡面就是fix函式),比如π就是取3,同時將3存入陣列p的第乙個值$p[1]=fix(number)$(matlab的陣列從1開始的)

(2) 做運算$π-3$,作為陣列a的第乙個值$a[1]$

(3) $p[2]=\frac$

(4) $a[2]=fix(p[2])$

下乙個p和a重複上述過程

function result=test(number,n)

%number=(sqrt(5)-1)/2; %測試用

%n=100; %測試用

result=0;

p=zeros(1,n);a=zeros(1,n);

p(1)=fix(number);

a(1)=number-fix(number);

for i=2:n-1

p(i)=1/a(i-1);

a(i)=p(i)-fix(p(i));

endp=sym(fix(p)); %轉成符號計算

for j=n-1:-1:2

result=1/(p(j)+result);

endresult=result+p(1);

測試以後發現,這組演算法還是有問題的,前面也說過,最大問題就是陣列a是乙個double型的陣列,把精度截斷了。我嘗試過用sym型來寫,但是會在某個數值的時候因為大數相乘(分子分母比較大的時候,通分造成的原因)直接超過1e308變成inf,然後就nan了。綜合上面,只能放棄掉一些精度。經過測試,直接sym型的時候連分數能寫到20層,如果將a進行double化,目前沒發現層數的問題,但是有效的層數,100層的話大約在70層左右,vpa以後精度在1e-15左右,還是可以的。計算處理速度上基本沒有大的問題,100層的時間大約是2秒鐘左右,300層的時間大約是3秒鐘左右。

近似演算法 貪心演算法與近似演算法

1.1 教室排程問題 假設有如下課程表,你希望將盡可能多的課程安排在某間教室上。你沒法讓這些課都在這間教室上,因為有些課的上課時間有衝突。你希望在這間教室上盡可能多的課。如何選出盡可能多且時間不衝突的課程呢?這個問題好像很難,不是嗎?實際上,演算法可能簡單得讓你大吃一驚。具體做法如下。1 選出結束最...

近似演算法作業

近似演算法作業 題目 證明g中的最大團size為 等價於 g m中最大團size為m 證明 充分性 若g中最大團size為 根據g m的構造過程,g m中至少有存在乙個size為m 的團。首先g m中的最大團不可能小於m 如果小於小於m 則說明,構成g m最大團,每個g貢獻了少於 的結點,這種情況是...

概率演算法和近似演算法

前面已經提到了顯示中大多數難解問題問題最後都被證明是np 完全問題。這意味著,除非np p,它們是不可能有多項式時間演算法的 而且,在這篇文章提到即使np p,人們也可能找不到乙個np完全問題的 有效 演算法 所以人們發展了各種工具來避開它們,最常用的兩種方法是使用概率演算法和近似演算法,這兩種方法...