2014年2月10日月曜日

関数プログラミング

プログラミングの書き方はいくつかあると思いますが、
私のこれまでの感覚だと、手続き型とオブジェクト指向型がメインだったように思います。

最近の書籍、雑誌、ネットでは「関数プログラミング」というキーワードが多くあるとおもいます。

私が関数プログラミングに触れ始めたのはEmacsからです。Emacsを使いこなそうとすると、Elispを使わなければなりません。いや、使わなくてもEmacsは使えるんですが、これがないなら他のエディタを使った方が良いです。

Elispを見て、それまでの命令型と全く違って面食らいました・・・。
かっこまみれは良いとして、関数型の思想を勉強してないので、頭が大混乱・・・。

そこから関数型言語としてCommonLispとか、Schemeとかあるんだなと。
ハッカーと画家も買って読みました。読み物として面白いです。
が、その威力が未だに見えてきません。変数書き換え不可!なぜ?

ある程度大規模な科学技術計算(私は流体解析メイン)はFortran、C/C++で書かれることが多く、空間離散点が数百万、時間積分も長時間やる場合は、Intel、PGIのコンパイラが多いようです。

中規模であれば、javaやC#なんかも使われているようです。

小規模であったり、統計解析や定常計算等であれば、Excel、Python、Ruby、R等が使われることが多いようです。

さて、自分のフィールドである科学技術計算に関数プログラミングを使えないかと考えたのですが、なかなか難しいです・・・。

その理由の第一は関数プログラミングを十分理解出来ていないことです。これは本読んで、コーディングすれば少しずつ解決しそうです。

第二に関数プログラミングが適用されている他のフィールドで求められている機能について理解出来ていないことです。これはなかなか難しそうですが、第一の理由を解決する過程で何か答えの断片を得られそうです。

その上で、第一、第二を踏まえて科学技術計算にどのように適用するのかを考えようと思います。

一つの機能としては、並列化への適用は可能性がありそうです。科学技術計算をやる上で、「解析時間の短縮」は大きなウェートです。
可読性向上については、厳しいような気がします。計算屋は命令型しか勉強しないですし、オブジェクト指向すら知らない人が多いです。実際、オブジェクト指向で書くと、遅くなることが多いです。
あとは、保守管理、過去の遺産の利用等々、いくつかの側面についても検討する必要があると思います。

ちなみに、関数プログラミングについては、Twitterで、おそらくその道のプロ(NY先生)であろう方からの返信があって、考え始めました。資料もご提示いただき、少し頭が晴れてきました。このページを見ているとは思いませんが、お礼申し上げます。ありがとうございます。

また、考えがまとまったら書こうと思います。



2014年2月9日日曜日

KKスキーム

河村・桑原スキームについてです。

1984年のLESに関する論文だったかと思います。

数値解析のうち、移流項の解法は以下の流れで勉強しました(私の場合)。

・中央差分(必ず発散)
・1次精度風上差分(解けるけど解が鈍る)
→中央差分の方が精度が良さそうだが解けない。なぜなら移流項(対流項)は移流速度に乗って情報が上流から下流に伝搬するからである。1次精度風上差分の場合、意図しない所で、拡散的な項(数値粘性)が入っているため解が鈍る。

・LaxWendroff法(2次精度だが振動が入る)
・MacCormack法(2次精度だが振動が入る)
→1次精度風上差分では数値粘性が入っていたため、安定的に解けた。同様の考え方で人工粘性を入れることで、振動を小さくする。

・KKスキーム
→3次精度を実現するために4次精度の中央差分+4次の拡散項を入れる。振動は残るが、河村先生の論文以降、実現象解明へ適用されてきた実績がある。

以降、QUICK、TVD(MUSCL系、Non-MUSCL系)、CIP(オリジナル、有理関数補間、CSL系)の勉強をしました。個人的にはCIP-CSLR1が好きですが、既存のコードの書き換えは結構大変です。マルチモーメントなので・・・。
その後は、小松先生の6Point Scheme、牛島先生のQSIスキーム、ENO、WENO等もかじってます。

今回、気が向いて、KKスキームについてちょっと勉強し直しました。
ベンチマークで使われる2D-Cavity Flowに適用しようと考えてます。
非圧縮性流体の解析なので、MAC系の解法を使って、移流項にKKスキームをと・・。

KKスキームは非保存系のスキームでした。ということで、ある論文の方法を使って保存系に変形しました。線形移流方程式に対して、保存系、非保存系で解いた結果、同様の結果を得られたので、適用は出来そうです。

うまくいったら、結果を載せようと思います。

2014年2月4日火曜日

xojo



xojoの2月の課題があったのでやってみた。
全然きれいじゃないし分ってないことを認識しているが、
とりあえずやってみみた。

下記ページを参考にさせていただいた。

http://www.geocities.co.jp/SiliconValley/2413/tips.html#16

なんかプリントスクリーンが巧くいかない・・・。

2014年1月24日金曜日

河川のシミュレーション!

河村先生の書籍です。
現在は絶版になっております。

大学の時に購入しました。
解析の基本的な説明の後、1次元、2次元、3次元の解析について記述されています。

偏微分方程式については移流拡散方程式、ポアソン方程式の解法を、
また一般座標系の説明があります。

河川に焦点を当てた(浅水流方程式に焦点を当てた)書籍は他にないような気がします。

サンプルプログラムもありますが、実用性は低いように思います。
また、流砂量公式については記述がありません。

ただし、勉強し始めた人にとっては有用な本の一つであることは間違いないと感じました。最近は大学レベルでも1からプログラムを書くことは少なくなっているようですし、
あくまでソフロウェアのユーザーであっても、知っておいた方が良いように思います。


個人的にはKKスキームについて記述されていないのが、ちょっと残念です。
日本人が作った数少ない移流項の解法ですからね。
(河村先生のその他の本には記述されています。河川だから省いたのかなと邪推しています)


日本の技術書は薄い本が多いように感じます。
ゼロから勉強しようにも、技術のバックグラウンドや基礎方程式について記述されているだけの本が多いです。基本的には基礎方程式は複雑なことが多く、複雑な方程式を解くには数値計算に頼らざるを得ないことが多いです。そのためには数値解析の基本的事項およびそれを実用的に使う方法まで書くには厚くすべきだと思ってます。
その点、海外の書籍は厚く、読むのが大変ですが、独学に向いています。
日本でもそのような流れにしていただきたいです。

ちなみに河村先生は多くの書籍を出されています。数値計算の基本的な所を記述した教科書になるものが多いです。私はファンなので買ってしまいます・・・。
エクセルVBAを使った解析について書かれているものもありますので、興味のある人は是非!



履歴

年明け一発目です。
せっかくなので、これまでのプログラミング履歴をまとめておこうと思います。
順番は適当です。


  • C/C++
Cは大学のときに最初に学んだ言語。その後、数値解析に目覚めて、CIP法を書いてみて、数式を展開して、思いどおりの結果が出てハマる。研究室に所属して、修論ではC++となるが、当時はあまりオブジェクト指向を理解していなかった。社会人になってからはチマチマ勉強して多少理解が進んだ。業務でも扱うこと(VC++)が多く、とりあえず、一番利用していると思う。


  • Fortran
科学技術計算をやるならFortranは外せない。もちろんゼロから書くならC/C++でも良いが、如何せん、研究室の遺産を利用しようとすると、書けなくても読めなければならなかった。まあ、C/C++に比べれば大したことはない。研究室では77しかなかったが、社会人になってから京都大学の牛島先生の本が出て、90/95を勉強した。当時は配列の動的確保やintent文が使えるなという印象だった。牛島先生の本は90/95の文法だけでなく、科学技術計算のプログラムの書き方について記述してあるのが優れていると思う。


  • python
初めて存在を知ったのは、研究室に入ってから。共有のパソコンにヘビのアイコンがあったのを記憶している。しばらく忘れていたが、社会人になってみんpyをちょくちょく読みながら少しずつ勉強した。高速な計算でなければ使いやすいと思う。数学者が作成した言語というのも好感度アップ。matplotlibによるグラフ作成や、ベクトルやコンター図も簡単にできるのが良い。また、マルチパラダイムなのも良い。特にFortranユーザーにも使いやすいと思う。海外研修時に簡単な温度応力解析のプログラムをこいつで書いた。


  • ruby
日本人が作ったとのことで、たのしいRubyを手に取ったのが始まり。pythonに比べて科学技術計算用途のmoduleは少ないと思う。ただし、オブジェクト指向の勉強としては優れていると思う。Railsは使ったことがない・・・。ごめんなさい。データ整理なら特に問題なく使える。業務で使ったことはない。ただし、日本人ならruby使って発展させた方が良い気がする。黒魔術も使えるし。


  • perl
仕事で海外研修時にO'Reillyの例のやつ(初めてのPerl)を読んでいた。出張中はWindowsしか触れなかったのでPadreを入れていたと記憶している。言語学者が作っているのであまりピンとこなかった。ただし、上記書籍は読んだ方が良いと思う。普通に面白い。業務では科学技術計算用Linuxの設定のついでにLAMPを入れた時に多少触ったくらい。python、ruby、perlについては用途が被るが好みで選択すれば良いと思う。どれが優れているとかは感じなかった。


  • xojo
real basicだったのxojoになった。勉強会も開かれているようだ。もちろん会社では一切使わない。移流方程式を解いて、図化する程度のプログラムは書いてみた。これも海外出張時に多少勉強した。日本語の情報は少ないが、英語の情報はたくさんあるし、リファレンスやサンプルはしっかりしている。ただ、サードパーティなので一抹の不安はある。Linux、Mac、Windowsの環境で使えるし、ネイティブコードを吐き出せるのは良い所。

  • VBA
いや、プログラム言語じゃない!と言われると思いますが、ごめんなさい。会社ではデータ整理やちょっとした統計解析なんかはVBAでやることが多いです。VBAが優れている点は、Excelがインストールしてあれば細かい設定は関係無しにみんな使える所です。通信関係は触ったことはないです。


  • VB.NET
メールを読み込んで添付ファイルを抽出するプログラムを業務で書いた。好んで使った訳でなく、遺産がVBだったから使ったまで。文法については「Must Inherits」とかカッコいいと思った。6.0から.NETで強烈に変化してしまったため、ユーザーは減ってるらしい。私の周り?そもそもプログラム書くことに情熱を持ってるやつなんていないっす。


  • java
javaによるCIP法の本が出てちょっとだけ勉強した。解析結果を表示しながら解析を進めるというもので、結構面白かった。ただ、Fortran的な書き方しかしてないので、javaを勉強した気はしなかった。ほんとはちゃんと勉強したい。Androidアプリも弄ることが出来そうだし。。。


  • ELisp
Emacsを使い始めると必然的に使わなきゃいけない。今だに使えるようになったとは思わないが、Emacsは楽しい。C/C++から入った私としては、文法に面食らった。何かに使うわけでなくEmacsのカスタマイズのみである。なおWindows環境でのEmacsライクなエディタにxyzzyがあるがこちらはCommon Lispでカスタマイズする。


  • AWK
読んだ本はプログラミング言語AWK。スクリプト言語はsh、sed、awk等が基本的な所にあると思う。利用としてはテキスト処理しかないが、結構簡単に書けるしパイプラインで繋いで処理していく過程は楽しい。完全な主観だが、ワンラインならはやりのスクリプトよりこっちの方が良いかもしれない。


2013年12月18日水曜日

C++

C++はマルチパラダイム言語ですが、
最近、再勉強をしています。

楽しいです。とりあえず、微分方程式を解くためのアルゴリズムを中心に書いていますが、本当に色々な書き方があるんだなと。

本も数冊購入しました。一冊は本当に初学者の本です。なぜなら、C++の全体のイメージを思い出すことが必要だと思ったからです。新しい発見でしたが、比較的初学者の本を読んで、ちょっと説明が違うな、と認識できるところがありました。少しは成長していたんだなと。

別の一冊はSTL中心です。STLは本当にコードが短くなるだけでなく、デバッグすべき項目を減らせるなという印象です。世の中の、どの分野で、どの程度使われているかわかりませんが・・・。加えてBoostの知識も入れておこうと思います。

最後の一冊はWindowsに特化したMFC中心の本です。
今さら感が強いですが・・・。
VC++はC++とは全然違うものというのが再認識されました・・・。

ライブラリを含めると、C++という言語はあまりにも広すぎます。
プラットフォームに依存したVC++だと別物です。

なかなか学習の仕方が難しいですが、今のところ、やりたいことは微分方程式を解くことなので、いろいろな書き方を試したいと思います。

2013年12月12日木曜日

全然書けてない・・・。

ようやく落ち着いたので、書き始めようと思います。

次の会社に向けて、C++の復習と統計の勉強を少しずつしています。

・C++について
プログラミング言語の学習は文法をマスターすることではありません。
その言語がどのような思想で設計され、与えられる課題に対して、どのようにアプローチすべきか?というような「思考方法」を学ぶことだと捉えています。

C++のようないろんな書き方がある場合、つまりは思考方法が複数あることを意味しています。そのような混沌としたような言語は非常に難しく感じます。
ただし、それが非常に面白いです。

結局、C言語の思考方法に振り返ることになってます(笑)
でもコーディングする人間が忘れてはならないことは、
「このコードが何をするために使われるか?」
だと思います。

・統計
「統計学は最・・・」とかいう本が出てますが、読んでません。
個人的には、統計学で説明できる事象とは何か?に興味があります。
特に時系列分析やスペクトル解析でしょうか。

統計学はあくまで考え方の一つであり、統計学に准ずれば正解、ということではありません。如何せん、現象論は考えていないからです。ただ、現象としては捉えられるけど、メカニズムは不明、という状況において、何らかしら定量的なアプローチをする方法としては有効であるように思います。すべての現象をニュートン力学や微分方程式で表現できる訳ではない(いや、ほとんどは出来るんですが、その場合、時空間解像度を相当確保しなければなりません)ですし、表現できたとしても、実現象を再現できるほど精度がある訳ではありません。

そういった現象と結果を結びつけたり、そのためのツールとして非常に有効な学問だと思います。平均値、相関、標準偏差とかです。

でも、中学や高校で確率の勉強が、工場の品質管理に使われるなんて想像もつきませんでした(笑)。鵜呑みにして勉強した結果、あ、そういうことか、と納得したのが大学です。

さらに言えば、水文学なんかもそうです。母数推定や関数へのフィッティング等。。。

怖いのは、ツールを使えばなんか答えがでる、ということです。
勉強していない人間がテキトーなことをして、定量的に評価することほど怖いことはありません。

統計学にはそういう恐ろしさも孕んでます。