2011年12月14日 星期三

Re: [問題] 請教有關遞迴式

作者: chungyuandye (養花種魚數月亮賞星星) 看板: Mathematica
標題: Re: [問題] 請教有關遞迴式
時間: Wed Nov 16 00:02:08 2011

※ 引述《sphwny (時間過的真快>"<)》之銘言:
: 不好意思又來問問題了
: 目前小弟寫到定義分段函數
: 然後使用遞迴的方式把剩下的函數定義完
: 舉例如下:
: H[-1,x1_,x2_,x3_,n_] :=E^(-x1*x3)*(n!/x2^n)*Sqrt[1/(2*x2)]
: 然後
: H[0,x1_,x2_,x3_,n_]:=
: x3/(2*n)*H[-1,x1,x2,x3,n+1]-x1/(2*n)*H[-1,x1,x2,x3,n] /; x2==0.5*x3^2
: H[0,x1_,x2_,x3_,n_]:=
: n!*(0.5*x1*H[-1,x1,x2,x3,n-1]-0.5*x3*H[-1,x1,x2,x3,n]) /; x2!=0.5*x3^2 ; x1>0
: H[0,x1_,x2_,x3_,n_]:=
: 0.5*x1*H[-1,x1,x2,x3,n-1]-0.5x3*H[-1,x1,x2,x3,n] /; x2!=0.5*x3^2 ; x1<0
: H[0,x1_,x2_,x3_,n_]:=
: 0.5*x3*H[-1,x1,x2,x3,n] /; x2!=0.5*x3^2; x1==0
: Table[H[i,x1_,x2_,x3_,n_]:= (1/i)*H[i-2,x1,x2,x3,n+1]-
: (x3/i)*H[i-1,x1,x2,x3,n+1]-(x1/i)*H[i-1,x1,x2,x3,n], {i,12}];
: 最後再把這些函數做些計算處理的時候
: 出現了遞迴次數超過256次之類的訊息以及後面伴隨很多錯誤訊息
: 當中似乎出現了什麼問題
: 是我的定義語法錯誤了嗎?
: 還是有其他的方法來定義這樣子的遞迴函數?
: 麻煩各位大師替我解惑!! 謝謝!!


上面的函數可以改用Which試試看!至於遞迴次數可以利用$RecursionLimit=?? 來設定
上面的函數因為都是利用SetDelayed來定義,所以每次都必須重新計算,
因此當i大的時候會非常耗時,可以試著用動態定義來改善

H[-1,x1_,x2_,x3_,n_]=E^(-x1*x3)*(n!/x2^n)*Sqrt[1/(2*x2)]

H[0,x1_,x2_,x3_,n_]:=Which[
x2==0.5*x3^2,
x3/(2*n)*H[-1,x1,x2,x3,n+1]-x1/(2*n)*H[-1,x1,x2,x3,n],
x2!=0.5*x3^2&&x1>0,
n!*(0.5*x1*H[-1,x1,x2,x3,n-1]-0.5*x3*H[-1,x1,x2,x3,n]),
x2!=0.5*x3^2&&x1<0,
0.5*x1*H[-1,x1,x2,x3,n-1]-0.5x3*H[-1,x1,x2,x3,n],
x2!=0.5*x3^2&&x1==0,
0.5*x3*H[-1,x1,x2,x3,n]
]

H[i_,x1_,x2_,x3_,n_]:=H[i,x1,x2,x3,n]=(1/i)*H[i-2,x1,x2,x3,n+1]-(x3/i)*
H[i-1,x1,x2,x3,n+1]-(x1/i)*H[i-1,x1,x2,x3,n]

利用相同的原理,可以利用Fibonacci number的函數來做實驗

f1[0] = 0; f1[1] = 1; f2[0] = 0; f2[1] = 1;
f1[x_Integer] := f1[x - 1] + f1[x - 2]
f2[x_Integer] := f2[x] = f2[x - 1] + f2[x - 2]
AbsoluteTiming@f1[30]
AbsoluteTiming@f2[30]

f1沒利用動態定義,f2則是利用動態定義來定義函數。

--
養花種魚數月亮賞星星

http://chungyuandye.twbbs.org


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.136.123
※ 編輯: chungyuandye 來自: 218.173.136.123 (11/16 00:04)
※ 編輯: chungyuandye 來自: 218.173.136.123 (11/16 00:10)

沒有留言:

張貼留言