数学とか語学とか楽しいよね

フランス語、ドイツ語、ロシア語、アラビア語、オランダ語、英語、スペイン語、ラテン語とか数学とか数値計算(有限要素法、有限体積法、差分法、格子ボルツマン法、数理最適化、C++コード付き)とか勉強したことをまとめます。右のカテゴリーから興味のある記事を探してください。最近はクラシックの名演も紹介しています。Amazonアソシエイトを使用しています。

理工書を紹介します(数学、物理、数値計算などなど、漸次追加)

はじめに

今回は理工書を紹介します。

数値計算

河村哲也 著『数値計算入門』
数値解析の全体を概観する本です。ニュートン法、直接法、反復法、固有値問題、補間、数値積分、常・偏微分方程式と基礎的な内容を網羅しています。『英語で学ぶ数値解析』よりとっきやすいと思います。例が充実しており自分のコードを確認できます。アルゴリズのまとめかたがわかりやすく、実装も十分に可能です。数値解析が必要な学生に何か読ませる場合、私なら入門書としてこの本を渡します。理論に深入りしすぎずちょうどよい塩梅です。ただ河村哲也氏の著作で気をつけなければならないのは、ほぼ同じ内容の別名の著作が存在している、ということです。これはかなり複雑なのでまた今度説明しますが、ほぼコピペという箇所、ちょっとだけ違う箇所などあります。ご注意ください。これだけ理解していれば、結構なものが自作できると思います。しかし、偏微分方程式の離散化に関しては他の本を読む必要があります。

数値計算入門 (Computer Science Library 17)

数値計算入門 (Computer Science Library 17)


『英語で学ぶ数値解析』
全体像が分かる本です。これだけわかれば組み合わせて自分でコードが書けます。内容は、連立一次方程式、非線型方程式、固有値問題、補間、数値積分常微分方程式、差分法による偏微分方程式と盛りだくさんです。表紙は日本語ですが中身は英語です。しかし、簡単な英語で書かれておりおすすめです。

英語で学ぶ数値解析

英語で学ぶ数値解析


『計算力学 有限要素法の基礎』
有限要素法の本で一番読みやすい本だと思います。固体、流体ともに書いてある点が珍しいです。例が充実しており、離散化した際の行列の値が示されているので自分で離散化した結果と比べることができます。また、定常、非定常ともに載っているのもうれしいです。もっと早くこの本を読みたかったです。本当に至れり尽くせりです。あと紙がよいです。質の悪い紙を使っている本だと線を引くのすら億劫ですが、この本の紙は質がよいです。

計算力学(第2版)-有限要素法の基礎

計算力学(第2版)-有限要素法の基礎


『流れ解析のための有限要素法入門』
題名の通り有限要素法でNavier-Stokes方程式を離散化することを目的としています。最後まで読むと自分で有限要素法でNavier-Stokes方程式を解けるようになります。2部構成で第1部で離散化の基礎を、第2部でNavier-Stokes方程式をいかに扱うかを説明してくれます。第1部では、有限要素法の紹介、1次元のポワソン方程式に対する離散化、2次元のラプラス方程式に対する離散化、プログラミングの方法、面積座標、非定常問題をやります。第2部では、Navier-Stokes方程式の定式化、様々な解法(直接法、分離解法)、風上有限要素法(SUPG法)、熱流体をやります。1次元のポワソン方程式に対する離散化は、有限要素法の入門として非常に優れています。私が有限要素法のはじめて理解したのはこの本です。実際のプログラミングの方法が書かれている点も便利です。実装につなげやすいです。また、非定常問題に対する記述があるのもうれしいところです。第2部は盛りだくさんです。まさにNavier-Stokes天国です。Navier-Stokes方程式を有限要素法で解く際に重要になるのが速度と圧力に対する補間関数で、この組み合わせが悪いと上手く解けなくなります。それに関しても詳しく説明されています。各要素に対する行列の要素も明記されていてとても便利です。この本の白眉はNavier-Stokes方程式をいかに離散化するかを説明している第8章です。直接法、ペナルティ関数法、疑似圧縮性法、MAC法、SMAC法、SIMPLER法、流速圧力同次緩和法、移流拡散分離解法が載っています。こんなにたくさんNavier-Stokes方程式に対する解法が載っている本は和書では貴重です。MAC法、SMAC法、SIMPLER法の導出も整理されて私のお気に入りです。章末には数値計算例が載っており、かなり詳細な情報が書いてあります。計算例を再現するときに役に立ちます。

流れ解析のための有限要素法入門

流れ解析のための有限要素法入門

  • 作者:中山 司
  • 発売日: 2008/04/01
  • メディア: 単行本


『はじめてのCFD』
「はじめての」とありますが初心者向けの本ではなく、中級以上です。移流拡散方程式の離散化をひたすら説明してくれます。様々なスキームを統一的な視点から整理してくれるので、非常に勉強になります。時間進行、移流方程式、拡散方程式、定常・非定常移流方程式と進みます。特性曲線、システム方程式、Riemann不変量、エントロピー解、Rankine-Hugoniot条件、Riemann問題、単調性、単調性保存、衝撃波、膨張波、TVD、Osherスキーム、Roeスキームなど、双曲型方程式を扱う際に必須となる概念が説明されている貴重な和書です。類書は『流体力学数値計算法』でしょうか。ただし、部分的に読みづらいと感じる箇所があります。私は、あまり圧縮性流体の知識がないのでそう感じるのだと思います。なので、圧縮性流体力学を学んでから読むと理解が深まるのではないでしょうか。この本以上の知識は洋書をあたるしかないです。

はじめてのCFD―移流拡散方程式

はじめてのCFD―移流拡散方程式


微分方程式による計算科学入門』
常微分方程式数値計算について解説した本です。Cのプログラム例がついています。全体は4章構成で、オイラー法やルンゲクッタ法などの基礎事項、ハミルトン系に対するシンプレティック数値解法、遅れのある微分方程式の数値解法、そして確率微分方程式の数値解法となっています。シンプレティック、遅延、確率微分方程式の数値解法のいずれをとっても類書はなかなかないので重宝します。アルゴリズムだけでなく、収束性や誤差、安定性など理論的な部分がかなり丁寧に説明されています。最初の章だけでもよくまとまっており読む価値があると思います。常微分方程式数値計算を扱う方は是非読むことをおすすめします。ちなみに、偏微分方程式は出てこないので注意しましょう。

数学

『最適化法 数理ファイナンスへの確率解析入門』
ページ数は120でとても薄いですが密度の濃い本です。最適化と数理ファイナンスを概観するのにおすすめです。本書で流れを確認し、分からない箇所を他の本で補いつつ読むと効果的かもしれません。前半は最適化法で川崎英文氏の執筆、後半は数理ファイナンスへの確率解析入門で谷口説男氏執筆という、二大巨頭による本となっています。前半は非線型計画法、凸計画法、線型計画法、離散最適化法を概観します。後半は確率論の基礎、ブラウン運動マルチンゲール、確率解析、ブラックショールズ方程式を概観します。最適化法の順番は独特です。まず、最も一般的な非線型最適化を解説してから凸計画法、線型計画法と狭めていきます。これは非常におもしろい試みですね。確かにいきなり線型計画法をやると挫折しやすい気がします。数式や定理の意味がたくさん書いてありとてもよいです。参考文献もとても詳しいです。数理ファイナンスのほうはブラックショールズ方程式がゴールで関連する事柄だけ解説されています。確率空間からスタートしてかなり深く書いてありますし(これだけでわかる人がいるのだろうか…)、式変形も丁寧です。最適化法より読むのが難しいですね。


『これなら分かる最適化数学―基礎原理から計算手法まで』
最適化を勉強したいけれど何から読んだらわからない方におすすめです。著者の金谷氏はわかりやすい本を書くことで定評があり(私の中で)、最適化手法の原理をわかりやすく学ぶことができます。原理(どうしてそのやり方でよいのか)が説明されているのがとてもよいです。この本の内容を理解しておけば、他の専門書へとスムーズに移行できるでしょう。内容は以下の通りです。まず数学準備として、ベクトルや行列の微分極値ラグランジュの未定乗数法あたりを詳しく説明してくれます。最適化の数学で詰まる方はこのへんが苦手なことが多いのではないでしょうか。3章では先程学んだ知識を使って、直線探索、ニュートン法共役勾配法を説明します。4章は最小二乗法です。どのような原理に従っているか理解せずにエクセルで使っている方も多いと思います。そんな方はこの章に従って一度自らの手で最小二乗法を導出してみるとよいと思います。また、特異値分解と一般逆行列非線型最小二乗法も載っていて盛りだくさんです。5章は統計的最適化です。最尤推定EMアルゴリズムなどです。最小二乗法が最尤推定になっていることも説明されます。6章は線型計画法です。1章分しかありませんが幾何的な解釈や双対などかなり踏み込んだ説明がなされています。7章は非線型計画法です。分量の関係で非線型計画法はほんの少ししか記述がありません。他の専門書を読む必要があります。8章は動的計画法です。これも主に使い方や応用例を示すだけです。ハミルトン・ヤコビ方程式などについて学ぶには他の専門書を読む必要があります。また、注が充実しており読んでいてハッとすることが多々あります。中・上級者の方でも何らかの発見があると思います。

物理

『地形現象のモデリング
地形の共通原理(地形形成のダイナミクス)の探求を目指して、河川、砂丘、雪崩、断層、柱状節理、クレーターなどの地形現象をモデリングしシミュレーションや実験で解析します。第I部では流れによる地形現象を、第II部では破壊による地形現象を扱っています。モデルを使うことによって、時空間のスケールの大きさや時間スケールの大きく異なる複数の現象が同時進行する点を乗り越えようとしています。特に河川のモデリングでは、浅水流方程式とExner方程式を持ちいた河床波の線型安定性解析や蛇行流路の解析が紹介されています。見た目が異なる現象でも数理モデルとして書いてみると似た式になったりするのでとてもおもしろいです。


『ゼロから学ぶ熱力学』
熱力学発展の歴史を交えつつ、基礎的な事項を網羅的に学べる良い本でした。まったく何も知らない状態から、熱力学第一、第二、第三法則、エントロピー、ギブスとヘルムホルツの自由エネルギー、相変化、化学反応、一通り概観することができます。最初に読む熱力学本として優れていると思います。第5章にブラウン運動BZ反応が載っているのがおもしろいです。BZ反応はあまり解説がないですが、ブラウン運動に関してはアインシュタインの関係式を導出するなどなかなかエキサイティングな流れになっています。ただ、サイクルの扱い方はもう少し説明してほしいところですね(サイクルをうまくつなげてクラウジウスの原理やトムソンの原理をの同値性を示すあたり)。そこは、他の本を見たほうがよいかもしれません。

ゼロから学ぶ熱力学

ゼロから学ぶ熱力学


『単位が取れる熱力学ノート』
非常によく整理されたわかりやすい熱力学本です。高校物理程度の知識から一気に第一、第二法則、エントロピー、ギブスとヘルムホルツの自由エネルギーまで連れていってくれます。合間に挟まれる演習問題が良問でさらに丁寧な解答が本文中にあるのがとてもよいです。カルノーサイクルの扱いが丁寧で、トムソンの原理とクラウジウスの原理の同値性や絶対温度を定義する方法などわかりやすく説明されている点が良いです。エントロピーの導入も違和感なく、実際に手を動かしてエントロピーの変化を計算する問題がたくさんあってためになります。ギブスとヘルムホルツの自由エネルギーの物理的な意味も書いてあります。

単位が取れる熱力学ノート (KS単位が取れるシリーズ)

単位が取れる熱力学ノート (KS単位が取れるシリーズ)

  • 作者:橋元 淳一郎
  • 発売日: 2005/06/22
  • メディア: 単行本(ソフトカバー)

【有限要素法】1次元移流方程式をSUPG法で解く C++コード付き

はじめに

今回は1次元移流方程式をSUPG(Stremline Upwind Petrov Galerkin)法で解いていきます。今までずっとやろうと思いながらも放置してきましたが、やっとやりました。

1次元移流方程式とは

 \displaystyle \frac{\partial u}{\partial t} + V\frac{\partial u}{\partial x} =0, \quad x \in [0, L]

のような一階の偏微分方程式のことをいいます。ここで、 u は溶質の濃度、 V は風などによる移流速度です。

SUPG法とは?

SUPG法とは、有限要素法における風上化の一種です。Petrov Galerkin法とは、形状関数とは異なる重み関数を用いる有限要素法のことを言います。風上方向に重み関数を歪ませたのがSUPG法です。移流方程式にたいして通常のGalerkin法を適用すると数値振動が発生することから開発されました。

簡単に離散化を説明します(詳細な離散化は現在執筆中です)。行列で書くと


 \displaystyle
(\boldsymbol{M} + \boldsymbol{M}_{\delta}) \boldsymbol{\dot{u}} + (\boldsymbol{S} + \boldsymbol{S}_{\delta}) \boldsymbol{u} = \boldsymbol{0}

となります。ここで、 \boldsymbol{M} が質量行列、 \boldsymbol{S} が移流行列、 \boldsymbol{M}_{\delta} が質量行列にたいするSUPG項、 \boldsymbol{S}_{\delta} がにたいするSUPG項です。それぞれ、

 \displaystyle
\boldsymbol{M}_{\delta} = 
\frac{1}{2} \tau V
\left( \begin{array}{cc} -1 & 1 \\ -1 & 1 \\ \end{array} \right)

 \displaystyle
\boldsymbol{S}_{\delta} = 
\frac{1}{\Delta x} \tau V^2
\left( \begin{array}{cc} 1 & -1 \\ 1 & -1 \\ \end{array} \right)

 \displaystyle
\tau = \left( \left( \frac{2}{\Delta t} \right)^2 + \left( \frac{2 |V|}{\Delta x}^2 \right) \right)^{-\frac{1}{2}}


のような形をしています。つまり、SUPG項は移流行列と拡散行列に適当な係数をかけた形になっています。なので、ガラーキン法で一度離散化していれば楽に計算できます。あとは時間項に対して適当な時間進行を入れればOKです。今回はオイラー法を使います(陰解法にすると数値振動を抑えられます)。

計算結果

今回の計算条件は、移流速度が正  V=0.1 で、初期条件は領域の左端の矩形波(長方形の波)です。以下が計算結果です。青が数値解です。

f:id:mutsumunemitsutan:20191025235015g:plain:w500

どうしても最初少し振動するのでコーディングが間違っているのかと思いましたが、どうやらSUPG法単体では、特に衝撃波面(勾配が急な箇所)で完全に振動を抑えられないようです。精度は有限体積法における1次風上差分と同じ、といった感触です。たしか、棚橋氏の本に、「SUPG法とは有限要素法における1次風上差分である」とった趣旨の記述があったと思います。SUPG法で振動を抑えるには別にリミターとか衝撃波補足項を入れる必要があるようです。SUPG法で移流方程式を計算した際にオーバーシュートとアンダーシュートが発生する、という記述が以下の論文にありました。みなさんもご注意下さい。彼らはリミター(カットオフ)を入れて対処しているようです。また、『計算力学』のp.184にある1次元移流方程式や『有限要素法による流れのシミュレーション』のp.56にある2次元移流方程式の例を見ても、オーバーシュートとアンダーシュートが発生しています。解が負にもなり得るというのは嫌ですね。解の非負性と離散最大値原理は満たしていてほしいです。

http://library.jsce.or.jp/jsce/open/00561/2005/3-24_3012f.pdf

C++コード

#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>

using namespace std;

//TDMA//a:diagonal,c:left,b:right,
inline void tdma(double a[], double c[], double b[], double d[], double x[], int size)
{
	int i;
	double *P=new double[size];
	double *Q=new double[size];
	
	//first step//
	P[0]=-b[0]/a[0];
	Q[0]=d[0]/a[0];
	
	//second step//
	for(i=1;i<size;i++)
	{
		P[i]=-b[i]/(a[i]+c[i]*P[i-1]);
		Q[i]=(d[i]-c[i]*Q[i-1])/(a[i]+c[i]*P[i-1]);
	}
	
	//third step, backward//
	x[size-1]=Q[size-1];

	for(i=size-2;i>-1;i=i-1)
	{
		x[i]=P[i]*x[i+1]+Q[i];
	}
	
	delete [] P,Q;
}

inline void mat(double AD[],double AL[],double AR[],double BD[],double BL[],double BR[],double b[],double f[], int &Ele, double &dx, double &Diff, double &dt, double &V, int &Node)
{
	//initialization//
	for(int i=0;i<Node;i++)
	{
		AD[i]=0.0;AL[i]=0.0;AR[i]=0.0;BD[i]=0.0;BL[i]=0.0;BR[i]=0.0;
	}
	
	for(int i=0;i<Ele;i++)
	{
		double time=(2.0/dt);
		double advec=(2.0*abs(V)/dx);
		double tau=1.0/sqrt(time*time+advec*advec);
		
		double the=0.0;

		//A//
		//temporal//
		AD[i]+=dx*2.0/6.0/dt;
		AR[i]+=dx*1.0/6.0/dt;
		AL[i+1]+=dx*1.0/6.0/dt;
		AD[i+1]+=dx*2.0/6.0/dt;

		//SUPG for temporal//
		AD[i]+=-tau*V/2.0/dt;
		AR[i]+=tau*V/2.0/dt;
		AL[i+1]+=-tau*V/2.0/dt;
		AD[i+1]+=tau*V/2.0/dt;

		//advection//
        AD[i]+=the*-V/2.0;
		AR[i]+=the*V/2.0;
		AL[i+1]+=the*-V/2.0;
		AD[i+1]+=the*V/2.0;

		//SUPG for advection//
		AD[i]+=the*tau*V*V/dx;
		AR[i]+=-the*tau*V*V/dx;
		AL[i+1]+=the*-tau*V*V/dx;
		AD[i+1]+=the*tau*V*V/dx;
		
		//B//
		//temporal//
		BD[i]+=dx*2.0/6.0/dt;
		BR[i]+=dx*1.0/6.0/dt;
		BL[i+1]+=dx*1.0/6.0/dt;
		BD[i+1]+=dx*2.0/6.0/dt;

		//SUPG for temporal//
		BD[i]+=-tau*V/2.0/dt;
		BR[i]+=tau*V/2.0/dt;
		BL[i+1]+=-tau*V/2.0/dt;
		BD[i+1]+=tau*V/2.0/dt;
		
		//advection//
		BD[i]-=(1.0-the)*-V/2.0;
		BR[i]-=(1.0-the)*V/2.0;
		BL[i+1]-=(1.0-the)*-V/2.0;
		BD[i+1]-=(1.0-the)*V/2.0;

		//SUPG for advection//
		BD[i]-=(1.0-the)*tau*V*V/dx;
		BR[i]-=(1.0-the)*-tau*V*V/dx;
		BL[i+1]-=(1.0-the)*-tau*V*V/dx;
		BD[i+1]-=(1.0-the)*tau*V*V/dx;
	}
}

inline void boundary(int &bc,double AD[],double AL[],double AR[],double BD[],double BL[],double BR[],double b[],int &Node)
{
	if(bc==1)
	{
		AD[0]=1.0;AR[0]=0.0;BD[0]=1.0;BR[0]=0.0;
		AL[Node-1]=0.0;AD[Node-1]=1.0;BL[Node-1]=0.0;BD[Node-1]=1.0;
	}
	if(bc==2)
	{
		AL[Node-1]=0.0;AD[Node-1]=1.0;BL[Node-1]=0.0;BD[Node-1]=1.0;
	}
	if(bc==3)
	{
		AD[0]=1.0;AR[0]=0.0;BD[0]=1.0;BR[0]=0.0;
	}
}

inline void output(double x[], int Node, double dx)
{
	stringstream ss;
	string name;
	ofstream fo;
	static int count=0;
	
	ss<<count;
	name=ss.str();
	name="answer_" + name + ".txt";
	fo.open(name.c_str ());
	
	for(int i=0;i<Node;i++)
	{
		fo<<dx*double(i)<<" "<<x[i]<<endl;
	}
	fo<<endl;
	
	count+=1;
}

int main()
{
	int i,j;
	int Ele=600;
	int Node=Ele+1;
	double LL=1.0;
	double dx=LL/Ele;
	double dt=0.001;
	double NT=1500;
	double eps=pow(2.0,-50);
	double Diff=0.01;
	double V=0.1;
	int bc=3;//bc=1 both Diriclet bc=2 left Neumann bc=3 right Neumann
	double D0=0.0;
	double D1=0.0;
	double N0=0.0;
	double N1=0.0;
    int div=5;
	
	double *b=new double[Node];
	double *x=new double[Node];
	double *xx=new double[Node];
	double *f=new double[Node];
	double *AD=new double[Node];
	double *AL=new double[Node];
	double *AR=new double[Node];
	double *BD=new double[Node];
	double *BL=new double[Node];
	double *BR=new double[Node];
	
	//initial condition//
	for(i=0;i<Node;i++)
	{
		x[i]=0.0;
	}

	for(i=20;i<100;i++)
	{
		x[i]=1.0;
	}

    output(x,Node,dx);
	mat(AD,AL,AR,BD,BL,BR,b,f,Ele,dx,Diff,dt,V,Node);
	boundary(bc,AD,AL,AR,BD,BL,BR,b,Node);
	
	for(i=1;i<=NT;i++)
	{
		//for b//
		if(bc==1)
		{
			b[0]=D0;
			b[Node-1]=D1;
		}
		if(bc==2)
		{
			b[Node-1]=D1;
			b[0]=BD[0]*x[0]+BR[0]*x[1]-N0*Diff;
		}
		if(bc==3)
		{
			b[0]=D0;
			b[Node-1]=BL[Node-1]*x[Node-2]+BD[Node-1]*x[Node-1]+N1*Diff;
		}
		
		for(j=1;j<Node-1;j++)
		{
			b[j]=BL[j]*x[j-1]+BD[j]*x[j]+BR[j]*x[j+1];
		}

		tdma(AD,AL,AR,b,xx,Node);
		for(j=0;j<Node;j++) x[j]=xx[j];
		
		if(i%div==0)
		{
			cout<<i<<endl;
			output(x,Node,dx);
		}
	}
	
	delete[] b,x,xx,f,AD,AL,AR,BD,BL,BR;
	
	return 0;
}

参考文献

最も参考にしたのが、『計算力学(第2版) 有限要素法の基礎』の第7章です。こちらは1次元移流方程式の例が載っています。この本は、有限要素法の入門書の中で一番読みやすい本だと思います。固体、流体ともに書いてある点が珍しいです。例が充実しており、離散化した際の行列の値が示されているので自分で離散化した結果と比べることができます。また、定常、非定常ともに載っているのもうれしいです。他には、『第3版 有限要素法による流れのシミュレーション』の第3章を参考にしました。こちらは2次元移流方程式の例が載っています。

計算力学(第2版)-有限要素法の基礎

計算力学(第2版)-有限要素法の基礎

  • 作者: 竹内則雄,樫山和男,寺田賢二郎,日本計算工学会
  • 出版社/メーカー: 森北出版
  • 発売日: 2012/12/05
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

第3版 有限要素法による流れのシミュレーション OpenMPに基づくFortranソースコード付

第3版 有限要素法による流れのシミュレーション OpenMPに基づくFortranソースコード付

【確率微分方程式】確率微分方程式を数値計算してみよう C++コード付き

はじめに

今回は確率微分方程式を数値的に計算するC++コードを紹介しようと思います。パスがランダムに進展していく様は見ていて非常に興味深いです。

確率微分方程式とは?

一般論

 dX_t = f(t,X_t)dt+ g(t,X_t)dW_t

のような式のことを伊藤の確率微分方程式(Stochastic Differential Equation、SDE)と呼んでいます。ここで、 X が時刻  t における未知数(例えば株価や生物の個体数など)、 t は時間、 f はドリフト係数、 g は拡散係数(ボラティリティ)、 W_t は1次元の標準ブラウン運動で、この項が確率論的なゆらぎをあらわしています。標準ブラウン運動は、平均0、分散tの正規分布に従います。この事実を使うと、確率微分方程式を数値的に解くことができるようになります。

幾何ブラウン運動

今回扱う具体的な確率微分方程式

 dX_t = \mu X_t dt+ \sigma X_t W_t

としましょう。ここで、 f(t,X_t) = \mu X_t g(t,X_t) = \sigma X_t と設定しています。このようにドリフトと拡散係数が線型で  X_t を含むものを幾何ブラウン運動と呼びます。ウィナー過程とも呼ばれています。幾何ブラウン運動は数理ファイナンス金融工学の分野で頻出します。例えば、ブラック・ショールズ方程式で使われています。幾何ブラウン運動の利点は線型で比較的解析が簡単であることと解析解が求まることです。上記の幾何ブラウン運動の解析解は

 X_t = X_0 \exp\left( \left( \mu-\frac{\sigma^2}{2} \right) + \sigma dW_t \right)

とあらわすことができます。ここで、 X_0 は初期値です。

オイラー・丸山スキー

オイラー・丸山スキームは、確率微分方程式に対するもっともシンプルな数値計算手法です。常微分方程式におけるオイラー法と対応しています。収束次数は1/2次となかなかしょっぱいです。オイラー・丸山スキームは確率微分方程式

 X_{n+1} = f(t_n,X_n)\Delta t+ g(t_n,X_n)\Delta W_n

のように近似します。ここで、 n はタイムステップ、 \Delta t は時間の刻み幅、 \Delta W_n= q\sqrt{\Delta t} です。 q は標準正規分布に従い、平均0、分散1を満たすものとしています。つまりブラウン運動の増分は、平均0、分散  \Delta t正規分布に従います。ここがとても大切です。数値計算では  q、すなわち標準正規分布を発生させればよいのです。

計算結果

パラメータとしては、 \mu=1 \sigma=\sqrt{2} X_0=1 \Delta t=0.0001、計算終了時刻は1としました。乱数はメルセンヌツイスターを使っています。計算結果を見ていきましょう。数値解と解析解の両方をプロットしています。青が数値解で、赤が解析解です。解析解は数値解と同じブラウン運動を使って計算します。

f:id:mutsumunemitsutan:20190926223450p:plain

このように、ブラウン運動において、パスはギザギザしており微分不可能ですが、確率1で連続となります。値が増えたり減ったりランダムな動きをしていることがわかると思います。赤と青の線はほぼ重なっており、ちゃんと確率微分方程式が解けていることがわかりました。シード値を変えることにより異なるパスが実現します。いろいろ変えて遊んでみてください。

f:id:mutsumunemitsutan:20190926223240p:plain

C++コード

#include <random>
#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>

using namespace std;

inline double drift(double x, double t, double mu)
{
    return x*mu;
}

inline double diffusion(double x, double t, double sigma)
{
    return x*sigma;
}

int main()
{
    int seed=80;
	mt19937 mt(seed);
    normal_distribution<> gauss(0.0, 1.0);

    ofstream file;
    file.open("path.txt");

    double mu=1.0;
    double sigma=sqrt(2.0);
    double x=1.0;
    double dt=0.0001;
    double TotalTime=1.0;
    double t;
    double exact=1.0;
    double random;
    double W=0.0;

    file<<0.0<<" "<<x<<" "<<exact<<endl;
    
	for(int i=0;dt*double(i)<TotalTime;++i)
	{
        t=dt*double(i);
        random=gauss(mt);
        W+=random*sqrt(dt);
        x=x+drift(x,t,mu)*dt+diffusion(x,t,sigma)*sqrt(dt)*random;
        exact=exp(sigma*W);

	    file<<t<<" "<<x<<" "<<exact<<endl;
	}

    return 0;
}

参考文献

微分方程式による計算科学入門』の第4章を参考にしています。この本は確率微分方程式の数値解法に関して解説してある数少ない和書で重宝しています。

あとは毛利光希氏によるこちらの資料です。
http://www-mmc.es.hokudai.ac.jp/~masakazu/Software/Manual/SDE_Solver/Manual.pdf

幾何ブラウン運動の解析解の導出は『確率微分方程式入門』のpp.77-78の例題4.3に載っています。伊藤の公式を適用するだけです。

【アラビア語】『アラビア語の入門』【2冊目】

はじめに

『ニューエクスプレス アラビア語』の次の教材として、本田孝一 著『アラビア語の入門』を読んだのでその紹介をしようと思います。派生形の手前までの文法を丁寧に解説してくれる本です。

アラビア語の入門 (<CD+テキスト>)

アラビア語の入門 ()

ニューエクスプレス アラビア語

ニューエクスプレス アラビア語

どんな本?

まったくの初心者がアラビア語をはじめるのに最適な本です。文法と会話のバランスがよく、実地で使うことを想定しています。アラビア文字の解説も丁寧で読み方、書き方を習得できます。文字自体の書き方やつなげかたまで丁寧です。扱っている範囲は派生形の手前ぐらいまでです。初心者がいきなり派生形を勉強しても挫折してしまうのでこれでちょうどよいと思います。そこまで初心者を挫折することなく導こうとする気概が感じられます。だいたい『ニューエクスプレス アラビア語』と同じような範囲です。ページ数は202ページでコンパクトです。著者の本田氏はアラビア書道で有名な方です。なので、表紙やいたるところに氏の作品を見ることができます。

構成は?

全部で20課から構成されています。各課のページ数はまちまちですが10ページぐらいです。最初にキーフレーズや大事な文法事項が説明されて、それをテキスト(会話)や例文を通して学んでいくスタイルです。はじめて出てくる単語の意味もかいてあります。

f:id:mutsumunemitsutan:20190913220723j:plain:w500

良い点

  • コンパクトで十分に読み切ることができる

読み切ることは大事です。さらに、図が多く、レイアウトも余裕があり目が疲れません。アラビア文字も十分大きく読みやすいです。

  • 文法を小出しにしてくれる

文法を少しづつ小出しにしてくれるので、そのおかげで頭がパンクすることなく読み進められます。例えば、動詞はかなり後半まで読まないとでてきません。表に全ての活用を与えて覚えろ、ということはないです。もちろん文法自体の説明もスマートでわかりやすいです。

  • 覚えるべき単語のリストがついている

基本単語(名詞と形容詞、名詞は複数形付き)が200、基本動詞が100のリストが載っています。初心者のうちは何を覚えたらよいかわからないのでとても重宝しています。全部ちゃんと覚えようと思います。

悪い点

入門としてはこのほうが負担が少なくて私はよいと思います。次は『ステップアップ アラビア語の入門』でしっかり派生形を勉強してアラビア語初級文法の完成を目指しましょう!

新版 ステップアップ アラビア語の入門

新版 ステップアップ アラビア語の入門

  • ある程度いろいろな語彙が出てくる

いろいろな語彙に触れられるのはよいことですが、少々多めかもしれません。なので、一周目で覚えきろうとせずに何度も読むとよいと思います。

おわりに

『ニューエクスプレス アラビア語』を読んだ後にやったので非常にスムーズに読めました。まずは『ニューエクスプレス アラビア語』をやるのがよさそうです。次はいよいよ『ステップアップ アラビア語の入門』です!余裕があれば『アラビア語表現とことんトレーニング』を並行して読み進めたいです。

アラビア語表現とことんトレーニング

アラビア語表現とことんトレーニング

【アラビア語】『ニューエクスプレス アラビア語』【1冊目】

はじめに

最近アラビア語をはじめました。まずは文法を勉強しようと思い、竹田敏之 著『ニューエクスプレス アラビア語』を読んだのでその紹介をしようと思います。まったくの初心者がアラビア語をはじめるのに最適な本です。

ニューエクスプレス アラビア語

ニューエクスプレス アラビア語

どんな本?

まったくの初心者がアラビア語をはじめるのに最適な本です。文法と会話のバランスがよく、実地で使うことを想定しています。アラビア文字の解説も丁寧で読み方、書き方を習得できます。扱っている範囲は派生形の手前ぐらいまでです。しかし、初心者がいきなり派生形を勉強しても挫折してしまうのでこれでちょうどよいと思います。だいたい『アラビア語の入門』と同じような範囲です。ページ数は153ページでコンパクトです。

アラビア語の入門 (<CD+テキスト>)

アラビア語の入門 ()

構成は?

全部で20課から構成されています。各課は4ページで、最初の見開き1ページ目でテキスト(会話)が提示されます。左ページにアラビア語、右ページに和訳が載っており、対訳のようになっています。下の方には新しく出てきた単語の意味と慣用表現が載っています。これはなかなか便利です。一々辞書をひいているとどうしても時間がかかって勉強意欲が減退するからです。次のページの見開きは文法説明にあてられています。限られたスペースの中で例文を示しつつ非常にわかりやすく解説してくれます。2課ごとに練習問題もついています。しかし、私は練習問題はやらないようにしています(特に1周目)。面倒くさくなってやる気がなくなるからです。勉強を続けるために徹底的に楽をしましょう。また、単語力アップ、表現力アップというページも時折あり、語彙や表現を強化できます。巻末にはこの本に出てくるアラビア語の単語が集めてあります。便利なのは活用した形(私は~する、のような形)がそのまま載っていることです。これは初心者にはうれしいです。

f:id:mutsumunemitsutan:20190912194033j:plain:w500

良い点

  • コンパクトで十分に読み切ることができる

読み切ることは大事です。

  • 文法の説明がスマートでわかりやすい

初心者には十分です。さらに勉強するには『アラビア語文法ハンドブック』あたりでしょうか。

アラビア語文法ハンドブック

アラビア語文法ハンドブック

  • ある程度語彙をしぼってあるのでパンクしないですむ

容赦のない語学書を読んでいると、最初から小難しい語彙がわんさか出てきて本質でない部分で挫折することになってしまいます。初級のうちは語彙をしぼり、文法の概観と骨格を学ぶことが大事だと思います。

悪い点

入門としてはこのほうが負担が少なくて私はよいと思います。この本にうまく接続できそうなのが『ステップアップ アラビア語の入門』です。

新版 ステップアップ アラビア語の入門

新版 ステップアップ アラビア語の入門

  • テキスト(会話)が無難で面白くない

はっきりいって普通です。パスポートを途中で無くすぐらいです。せっかく20課あるので何かストーリーが欲しかったですね。例えば『ドイツ語、もっと先へ!』はストーリーがぶっとんでいました。落語したり言語学を語りだしたり。

ドイツ語、もっと先へ!

ドイツ語、もっと先へ!

おわりに

スムーズにアラビア語に入門できました。最初からこの本で勉強したかったですね。次は、『アラビア語の入門』を読みたいと思います。『ステップアップ アラビア語の入門』まで頑張ります!

【アラビア語】アラビア語をはじめました!!!

はじめに

アラビア語をはじめました!!!実は第二外国語として学んだので厳密に言うと再開ですね。しかし、そのときはフラフラになりながら派生形をやって終わった、という程度です。単語も全然覚えていません。ただアラビア文字は全部読めるし書ける状態です。授業では『現代アラビア語入門』という参考書を使っていましたが、今見返してみても、初心者がこの本を勉強してアラビア語が読めるようになるとは到底思えません。一冊目としては解説が簡潔すぎます。なので、今回は別の参考書からはじめてみようと思います。ちなみに辞書はHans Wehrの"Arabic English Dictionary of Modern Written Arabic"でした。さすがにこれを初学者に与えるのはやりすぎでしたね。辞書も別のものを使っていきたいと思います。

現代アラビア語入門

現代アラビア語入門

Arabic English Dictionary of Modern Written Arabic

Arabic English Dictionary of Modern Written Arabic

目標

目標は、アラビア語Wikipediaを読めるようになることです。そのために、取りあえず文法は全体をやって、単語を確実に1000以上覚えたいです。欲を言えばコーランや本まで読めるようになりたいですね。

どんな本を読むか

文法

まず文法をやるということで、『ニューエクスプレス アラビア語』をひと通り読みました。100ページちょっとでアラビア語の文法や単語を派生形に入るかどうかまで解説してくれるのでとても便利です。下の記事も参考にしてください。

ニューエクスプレス アラビア語

ニューエクスプレス アラビア語


ここからは予定ですが、次に読む本としては『アラビア語の入門』ですね。この本は、『ニューエクスプレス アラビア語』と同じような範囲を扱っていますが、ページをたくさん使ってアラビア語に親しませようと努力してくれます。この続編が『ステップアップ アラビア語の入門』です。最近新版が出てうれしいです。派生形にかなり力を入れており、「この本を終えれば、アラビア語の初級は完成。」とのことです。また、副読本として『ニューエクスプレス アラビア語』と同じ著者による『アラビア語表現とことんトレーニング』がよさそうです。文法と単語を無理なく定着させるのに使えそうです。こちらも文法全体を扱っています。初級文法が固まったらまとめとして『アラビア語文法ハンドブック』を通読したいと思います。分厚いですが非常に見やすいレイアウトです。

アラビア語の入門 (<CD+テキスト>)

アラビア語の入門 ()

新版 ステップアップ アラビア語の入門

新版 ステップアップ アラビア語の入門

アラビア語表現とことんトレーニング

アラビア語表現とことんトレーニング

アラビア語文法ハンドブック

アラビア語文法ハンドブック

単語

文法を学びながらある程度単語を覚えてから単語帳を使おうと思います。最初から単語帳を使うと未知語ばかりでしんどいからです。まずは、知人が薦めてくれた『これなら覚えられる! アラビア語単語帳』を読もうと思います。基本単語約1400語が載っているようです。例文もあってよいですね。もう一冊は『例文で学ぶ アラビア語単語集』です。この本はこの前出たばかりで、本屋で見てみたところかなり有望です。こちらは2500語載っているようです。『これなら覚えられる! アラビア語単語帳』のあとに取り組むとちょうどよさそうです。例文があるのはやはりよいものです。最終的には"A Frequency Dictionary of Arabic: Core Vocabulary for Learners"まで行きたいですが、時間がかかるでしょう。頻度順にアラビア語単語5000語を並べた本です。例文もひとつずつ付いています。

NHK出版CDブック これなら覚えられる!  アラビア語単語帳

NHK出版CDブック これなら覚えられる! アラビア語単語帳

例文で学ぶ アラビア語単語集

例文で学ぶ アラビア語単語集

辞書

前回の反省から辞書は語根順ではない『パスポート 初級アラビア語辞典』を使います。文字でひけるし、用例も載っています。「見出し語は約4,200語。また最も頻度の高い基本単語として約500語を選び出し、窓見出しとなっている。」とのことなので、将来的に単語帳としても使えそうです。オンラインの辞書としては「アラジン」が便利です。アラビア語をクリックで入力できるのでとても楽です。用例もあり、派生語や派生形も出てくる、活用表も出てくる、などなどすさまじい機能があります。私は全然使いこなせていません。よくわからない単語はアラジンにぶちこむと大概わかります。下手な辞書より何倍も使い勝手がよいです。

パスポート 初級アラビア語辞典

パスポート 初級アラビア語辞典

おわりに

今後の見通しとしては、『ニューエクスプレス アラビア語』の復習(出てくる単語を全部覚えてしまいたい)と『アラビア語の入門』を読み進めることですね。『ステップアップ アラビア語の入門』までは失速する前に一気に行きたいところです。

【ドイツ語】『ドイツ語の小説を読む〈1〉ベル:きまぐれな客たち』【14冊目】

はじめに

佐藤清昭 著『ドイツ語の小説を読む〈1〉ベル:きまぐれな客たち』を読んだので、その紹介をしようと思います。ドイツ語で書かれた短編小説を精読することによって、読むためのドイツ語を身につけるための本です。

ドイツ語の小説を読む〈1〉ベル:きまぐれな客たち

ドイツ語の小説を読む〈1〉ベル:きまぐれな客たち

どんな本?

初級文法を学んだあとに、実際にドイツ語で書かれた短編小説を精読することによって、読むためのドイツ語を身につけるための本です。「ドイツ語の初級文法を一通り終え、「さて、次のステップは?」」と考えている人向けの本です。精読する短編小説は、Heinrich Böll(ハインリッヒ・ベル)の『きまぐれな客たち』("Unberechenbare Gäste")です。主人公の家に次から次へと珍客(動物たち)が訪れるというユーモラスな作品です。小説自体の長さは8ページ分で、それをじっくり精読していきます。ドイツ語学者である関口存男による、関口文法の影響を受けているのが本書の特徴です。この本自体のページ数は144ページでコンパクトです。

構成は?

小説全体を4部に分けて、さらに各部を約10課に分割しています。各課は見開き1ページで完結しており、読みやすいです。まず、小説の本文があります。10行満たないぐらいで、長すぎなくてよいです。その後丁寧な文法・構文・語彙の説明があります。ここを読めば独学でも十分に文章の構造を理解できます。そして、最後に日本語訳があります。私の大好きな古き良き構成です。また、ところどことに文法コラムが挿入されます。後でも述べるように、例文選びにセンスがあり、言語学的な説明も豊富で非常に読み甲斐があります。

f:id:mutsumunemitsutan:20190904204140j:plain:w500

良い点

  • 文法を使って実際のドイツ語をどうやって読むかが懇切丁寧に解説される

やはり理論だけわかっても読めないものです。このように実地で丁寧に鍛えてくれる本は貴重です。

  • 豊富な例文を用いて文法の解説をしてくれる

例文選びにセンスがあり、言語学的な説明も豊富です。ドイツ語に対して、外面(文法)と内面(文脈)からせまるアプローチが面白いです。このへんが関口存男の影響の一部かもしれません。

  • 話自体が面白い

ベルの文章はユーモラスで読んでいて楽しくなります。また、構文が複雑すぎないのもよいです。

  • あまり長くないため息切れせずに読み切ることができる

どんな本でもやはり読み切らないと効果は出ません。

  • 文脈の中で単語・熟語を覚えることができる

悪い点

  • 144ページと短いためすぐに読み終わってしまい人によっては物足りないかも

これを補うために下記のように姉妹編があります。

おわりに

非常に読んでいて爽やかで軽やかな本でした。ドイツ語で短編小説を読み終えたというのは自身に繋がります。次は姉妹編の、佐藤清昭 著『ドイツ語の小説を読む〈2〉ベル:ある若き王様の思い出』を読んでいこうと思います。