Haskellで拡散方程式を書いてみた。その二

拡散方程式をHaskellで書いてみた。

拡散方程式の陽解法にあるCのプログラムをHaskellに書き直した。

diffusion.hs

import qualified  Data.Vector.Unboxed as D

nmax :: Double
nmax = 200
dt :: Double
dt = 1.0 / 100000.0
dx :: Double
dx = 1.0 / nmax
a :: Double
a = dt/dx/dx

-- initial data
vec_u_init :: D.Vector Double
vec_u_init = D.fromList [2.0  * (x/nmax) * (1.0 - (x/nmax)) | x <- [0 .. nmax]]

--iteration
uu :: (Eq t, Num t) => (D.Vector Double, t) -> D.Vector Double
uu (vec,0)= vec
uu (vec,num)= D.cons 0
	(D.zipWith3 (\x y z -> a  * x + (1.0 - 2.0 * a) * y + a * z)
	(D.tail (D.tail u)) (D.tail u) u)
	D.++ D.fromList [0]
	where  u = uu (vec,num-1)

uu (vec_u_init ,1000)で計算。

iterationの部分は遅延評価であるメリットは計算速度的には特にないので、普通にループを書いても良いかなと思った。つまり、Haskellで拡散方程式を書いてみた。その一 - hiroki_fの日記のやり方、もしくはそれに準ずるやり方。

再帰的に書けるというのは、数値計算用のプログラムとしては書きやすいのかもしれない。


参考
kamonama@Blogger: Haskellのプログラムを高速化するための7つの方法
プログラミング言語探訪 遅延評価について。または、あえてそれをやめさせる方法(正格化)について。同じサイトのプログラミング言語探訪はコンパクトにまとまっていてよい。
高速化について
 Haskellコードの高速化
 induceBackwardを高速化しようとした - www.kotha.netの裏
Haskell数値計算でつかう方法
 Numeric Haskell: A Vector Tutorial - HaskellWiki
 モジュールをimportするのは、pythonNumpy と Scipyと同じ。
Hskell vs C
 HaskellのFusionがあれば速度と抽象化を両立できる - りんごがでている

Haskellについてコンパクトにまとまっている。読みやすい。Haskell数値計算向き
https://www.shido.info/hs/index.html

vector packageについて。数値計算にはこれらが必須 Data.Vector.Unboxedを使った。
vector: Efficient Arrays

Haskell 98 言語とライブラリ改訂レポート December 2002
困ったときに検索 Hoogle

ざっと見るにはよいかも Haskell基礎文法最速マスター - think and error