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

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

【数物リンク】畳み込みの意味

畳み込みの意味をわかりやすく説明してくれるサイトのリンクです。畳み込みはフーリエ変換、拡散方程式や常微分方程式の解の表示の際などにあらわれます。畳み込みは何を表しているのか、その意味が書いてあります。「発熱 川に落ち 失恋 転校 失恋 留年 靴下の穴」

【有限要素法】1次元非定常移流拡散方程式の解析解を導く

今回は一次元非定常移流拡散方程式の解析解を導きたいと思います(実は途中まで)。有限要素法のプログラムがきちんと動くかどうか確かめるために使いたいのです。これ意外と本に載っていないのではないでしょうか。

一次元非定常移流拡散方程式とは

 \displaystyle \frac{\partial u}{\partial t}+V\frac{\partial u}{\partial x}-D\frac{\partial^2 u}{\partial x^2}=0 in  (-\infty, \infty)

のような無限領域で定義された偏微分方程式のこととし、初期条件はある関数  f(x) で与えられるとします。ここで、 u(t,x) は未知数で時間と空間の二変数関数、 V は流速で定数、 D は拡散係数で定数です。熱またはある溶質が時間が経過するにつれてどのような分布をとるか(移流拡散していくか)求めるのがこの問題です。無限領域なので境界条件は必要なく、初期条件だけです。

まず、以下のように座標を  (t,x) から  (\tau,y) へと変換します。


 
\displaystyle 
\begin{eqnarray} 

\tau &=& t \\
y &=& x-Vt \\

\end{eqnarray}

それぞれの偏微分を計算しておきましょう。

 \displaystyle \frac{\partial \tau}{\partial x}=0, \frac{\partial \tau}{\partial t} =1, \frac{\partial y}{\partial t}=-V, \frac{\partial y}{\partial x}=1

このとき空間と時間の一階微分はそれぞれ



\displaystyle 
\begin{eqnarray} 

\frac{\partial u}{\partial x} &=& \frac{\partial u}{\partial \tau}\frac{\partial \tau}{\partial x} + \frac{\partial u}{\partial y}\frac{\partial y}{\partial x} \\
 &=& 0 +  \frac{\partial u}{\partial y}\\

\frac{\partial u}{\partial t} &=& \frac{\partial u}{\partial \tau}\frac{\partial \tau}{\partial t} + \frac{\partial u}{\partial y}\frac{\partial t}{\partial x} \\
 &=& \frac{\partial u}{\partial \tau} -  V\frac{\partial u}{\partial y}\\

\end{eqnarray}

と計算できます。これらをもとの式に代入すると



\displaystyle 
\begin{eqnarray} 

\frac{\partial u}{\partial t}+V\frac{\partial u}{\partial x}-D\frac{\partial^2 u}{\partial x^2} &=& \frac{\partial u}{\partial \tau} -  V\frac{\partial u}{\partial y} +V\frac{\partial u}{\partial y} -D\frac{\partial^2 u}{\partial y^2}\\
 &=& \frac{\partial u}{\partial \tau} -D\frac{\partial^2 u}{\partial y^2} =0

\end{eqnarray}

となります。すなわち

 \displaystyle \frac{\partial u}{\partial \tau} = D\frac{\partial^2 u}{\partial y^2}

であり、最終的に拡散方程式に変換できるのです!初期条件は  f(y+Vt)=f(y) です。これはフーリエ変換を使って簡単に解くことができます。フーリエ変換 u(\tau,y) について解いて、座標の逆変換で  u(t,x-Vt) としてやればもとの非定常移流拡散方程式の解析解が得られます。

上記の解は

 \displaystyle u(\tau,y) = \frac{1}{\sqrt{4D\tau\pi}} \int_{-\infty}^{\infty} f(s)  e^{-\frac{(y-s)^2}{4D\tau}} ds

となります。なので、座標の逆変換  u(t,x-Vt) を使うと解の表示が

 \displaystyle u(t,x) = \frac{1}{\sqrt{4Dt\pi}} \int_{-\infty}^{\infty} f(s)  e^{-\frac{(x-Vt-s)^2}{4Dt}} ds

のように得られます。解析解と初めに言いましたが、この積分を解析的に求められる場合以外は解析解にはならないのでご注意下さい。ただ  f(x) をうまく選べば大丈夫です。

【英語】Weblioの語彙力診断で全問正解

Weblioの語彙力診断でレベル28、推定語彙数24001~26000語、大学者、スコア247.1が出ました。

f:id:mutsumunemitsutan:20181017215529p:plain

f:id:mutsumunemitsutan:20181017215524p:plain

全問正解は初めてです。全問正解してもレベル30はいかないのですね。ただ、これは気休めなので現在の語彙数は16,000語ぐらいでしょう。英語のボキャビルも再開したいです。

f:id:mutsumunemitsutan:20181017215513p:plainf:id:mutsumunemitsutan:20181017215524p:plain

【語学学習】単語帳一日一周勉強法が続けられる7つの理由

意識高い系のタイトルにしてみました。私は今単語帳を一日一周する勉強法をやっています。今回はなぜこの単語帳一日一周勉強法は続くのか?について私の考えを書いていきたいと思います。

単語帳一日一周勉強法とは?

一単語一秒で単語を見てその意味がわかるかどうかサクサク確かめてく方法です。わからなくても気にせずに日本語訳を確かめて次の単語へ進みます。完璧にわかったと思った単語は周回からはずしていきます。英単語で実験してみたところ、1週間で93%の単語を暗記できました!


なぜこの単語帳一日一周勉強法は続くのか?を考えるために、まず私の単語学習の失敗から考察していきましょう。3種類あります。

なぜ今までの単語学習はうまくいかなかったか?

一つ目の方法は私が高校生の時にやっていた単語学習法で、いわゆる前から順番に覚えていこうとする方法でした。何回も紙に書いたり発音したりして一語ずつ固めていく方法です。この方法の欠点は

1. 圧倒的に繰り返し回数が足りない
2. そもそも単語帳の最後まで辿り着けない(終わりが見えない)
3. 覚えているか試してみると案の定覚えておらずやる気を無くす
4. 同じ日で何回も繰り返しているだけ(睡眠をはさまない)
5. 一日に進むページ数が少ない
6. 飽きる

です。とにかく苦痛で全く覚えられませんでした。それから単語学習が嫌いになりました。

次にやったのが木田元の単語学習法です。この方法は『人生力が運を呼ぶ』という木田元渡部昇一の対談本に載っている方法のことです。

人生力が運を呼ぶ

人生力が運を呼ぶ

簡単に説明すると、1日目は1ページ目を暗記する。2日目は1ページ目を復習し2ページ目を暗記する。その調子で5日目は1から5ページ目までやります。そして6日目に1ページ目は外して2から6ページ目を暗記する方法です。正味で同じページを5回暗記することになります。この方法の欠点は

1. そもそも凡人は5回程度の繰り返しでは覚えない
2. 一日に進むページ数が少ない
3. 覚えようとする強い気持ちが必要
4. 飽きる

です。確かにこの方法である程度単語を覚えられましたが、あまり効率はよくなかったです。

そして最後にやったのが不完全な単語帳一日一周勉強法です。これは要するに周回が十分でない単語帳一日一周勉強法です。これの欠点は

1. 成果をあせり完全に覚えきっていない単語をはずしてしまう
2. 短期記憶に入っただけで満足して周回をやめてしまう

です。一時的には単語を覚えたつもりになるのですが、結局全然覚えられませんでした。

なぜ単語帳一日一周勉強法は続くのか?

では以上を踏まえて単語帳一日一周勉強法を検討していきましょう。この方法の利点は

1. 見るだけという簡単さ(ゲーム感覚)
2. 一回で覚えられなくてもよいという安心感
3. 曲がりなりにも全体を読み通している(一周一周が完結している)
4. だんだん覚えてきているという実感が得られる
5. 周回のスピードが着実に上がり成長を感じられる
6. 周回に必要な時間が着実に減少しかける労力が減少する
7. 周回を重ねれば重ねるほど苦手な単語と触れ合う機会が増加する

です。注目すべきは「心理障壁が非常に小さい」ことと「成長を実感できる」ことでしょうか。今までの勉強法の反対の性質を持っていることに気付くでしょう。まさに今までの手法の総反省として辿り着くべくして辿り着いた方法と言えます。


学校で方法論について教えるべきですね。この方法だと一か月あれば普通のサイズの単語帳(2,000語程度)は暗記できそうです。ただいま実験中です。

あと分量は適当に分割すべきでしょう。そうしたほうが負荷が減り続けやすくなります。周回のスピードが上がってきたら分量を増やせばよいと思います。

【語学学習】ロシア語単語帳を覚える【14周目】

単語帳を一日一周する学習法を始めて今日で8日目です。この学習法の詳細はこちらの記事をどうぞ。

『これなら覚えられる! ロシア語単語帳』を使っています。約1,600語載っているようですが、例文のついている見出し語667語とその他の二つに分けて暗記をしています。

CDブック これなら覚えられる!  ロシア語単語帳 (CDブック)

CDブック これなら覚えられる! ロシア語単語帳 (CDブック)

例文のついている見出し語667語については現在14周目で、テストをしてみたところ95%程度暗記できているようです。結局一日2周ぐらいしている計算になります。


そこで手付かずだった見出し語以外の単語の暗記もはじめました。およそ1,000語です。現在6周しました。最初は30分強かかっていましたが、今では20分で一周できます。単語帳一冊は40分程度で一周できます。だんだん頭に入ってきた感じです。ただ、今テストをしてしまうとあまり正答率が上がらずモチベーションが落ちてしまうかもしれないので、10周以上するまではテストはしないことにします。見出し語についてはぼちぼち周していけばよいでしょう。

【読書リンク】魅力ある科学をする力はどこから生まれるか?

たまたま見つけたPDF、「魅力ある科学をする力はどこから生まれるか?」のリンクです。

http://www.ims.tsukuba.ac.jp/~Kadowaki_lab/person/kadowaki/zatsubun/oyo_buturi_77_2008_1118.pdf

最近、各々の国家における学術の盛衰に関して興味があり調べています。

「米国は1960年代初頭、ソ連の科学技術の独創性とそのレベルに驚き、ソ連に視察団を送り、実地調査を行ったのは有名な話である。その結果として、大学での物理と工学教育のレベル向上のため、「教科書づくり」が一大国家プロジェクトとして行われたのである。この施策は大成功を収め、米国が1960年代後半から1970年代に、ソ連との宇宙開発競争に勝った一因とまで言われている。バークレーコースやファインマンの教科書などはこの時代に生まれた。米国では現在でもこの流れが引き継がれ、優れた教科書が次々と書かれ、世界各国で使われている。」

アメリカの教科書は分厚く丁寧で独習できるように作られています。一方日本の教科書はなるべく薄く簡潔にまとめられているが故にとてもじゃないが独習に耐えない教科書というものが多かったと思います。まるで、著者自身の頭の良さを見せつけているかのような本が私は嫌いです。少なくとも教科書でそれをやったらお終いでしょう。ただ、これは一昔前の教科書の話で、最近はわかりやすく独習可能な教科書が増えていると思います。しかし、厚くすると敬遠されてしまうと考えるのか、アメリカの教科書のように700や800ページもある教科書というのは出版されないですね。そうすると、結局他の本を参照しなければならなくなるのです。

日本も国策として良い教科書をたくさん作るようにすれば、またかつての繁栄を取り戻せるかもしれません。

【連立一次方程式】TDMA(三重対角行列アルゴリズム、Tri-Diagonal Matrix Algorithm)C++コード付き

今回は連立一次方程式の係数が三重対角行列のときにとても効率の良い、TDMA(三重対角行列アルゴリズム、Tri-Diagonal Matrix Algorithm)のC++コードを公開します。TDMAは直接法に分類される手法で、流体計算の際のソルバーとして用いられています。理論は

http://penguinitis.g1.xrea.com/study/note/tdma.pdf

がわかりやすく参考になります。方程式が3つの例がわざわざ示されており、とてもわかりやすいです。アルゴリズムの流れを書きます。連立一次方程式を

 
\left( \begin{array}{ccc} 
a_1 & b_1 &   &   &   & 0  \\
c_2 & a_2 & b_2 &   &   &   &   \\
  & c_3 & a_3 & b_3 &   &   &   \\
  &   & \ddots & \ddots & \ddots &  \\
  &   &   & c_{n-1}   &  a_{n-1} &  b_{n-1} \\
0 &   &   &   &  a_{n} &  b_{n} \\
\end{array} \right)

\left( \begin{array}{c} x_1 \\ x_2 \\ x_3 \\ \vdots \\ x_{n-1} \\ x_n \end{array} \right)
 = 
\left( \begin{array}{c} d_1 \\ d_2 \\ d_3 \\ \vdots \\ d_{n-1} \\ d_n \end{array} \right)

とします。このときTDMAのアルゴリズム


1.  P_1=-\frac{b_1}{a_1} Q_1=\frac{d_1}{a_1} と定める
2.  P_i=\frac{-b_i}{a_i+c_i P_{i-1}} Q_i=\frac{d_i-c_i Q_{i-1}}{a_i+c_i P_{i-1}} を使って  i=2 から  i=n までの  P_i Q_i を求める
3.  x_n=Q_n とする
4.  x_i=P_ix_{i+1}+Q_i を使って  i=n-1 から  i=1 までの  x_i を求める(後ろ向きであることに注意!)


となります。

今回解く連立一次方程式は

 Ax=d

とあらわされます。ここで、  A 4 \times 4 の行列、 x d 4 次元のベクトルです。 A d が既知で、 x が未知です。具体的には

 \left( \begin{array}{ccc} 2 & 1 & 0 & 0 \\ 1 & 2 & 1 & 0 \\ 0 & 1 & 2 & 1 \\ 0 & 0 & 1 & 2 \end{array} \right) \left( \begin{array}{c} x_1 \\ x_2 \\ x_3 \\ x_4 \end{array} \right) = \left( \begin{array}{c} 4 \\ 8 \\ 12 \\ 11 \end{array} \right)

であり、これを解くと  x_1=1, x_2=2, x_3=3, x_4=4 となります。

コード上ではそれぞれ対角要素を配列 t[i] に、対角右の要素を配列 r[i] に、対角左の要素を配列 l[i] に収納しています。ではコードを以下に示します。

#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>
#include <vector>

using namespace std;

//TDMA//
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//
	x[size-1]=Q[size-1];

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

int main()
{
	int i;
	int size=4;
	
	double *t=new double[size];
	double *l=new double[size];
	double *r=new double[size];
	double *b=new double[size];
	double *x=new double[size];
	
	t[0]=2.0;t[1]=2.0;t[2]=2.0;t[3]=2.0;
	l[0]=0.0;l[1]=1.0;l[2]=1.0;l[3]=1.0;
	r[0]=1.0;r[1]=1.0;r[2]=1.0;r[3]=0.0;
	b[0]=4.0;b[1]=8.0;b[2]=12.0;b[3]=11.0;
	
	
	tdma(t,l,r,b,x,size);
	
	for(i=0;i<size;i++) cout<<x[i]<<endl;
	
	delete [] t,l,r,b,x;

    return 0;
}