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するのは、pythonのNumpy と 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