読者です 読者をやめる 読者になる 読者になる

C#で複素数を使ってみる

あすかです。

今週は小話でお茶を濁します。
複素数のおはなしです。


複素数は、高校の数学で勉強した実数虚数が混ざった数のことです。
例えば、

f:id:kmynews:20170514153721p:plain

この数式では、ia虚数部、bを実数部といいます。
なにかとめんどいですね。

これをC#で表現するには、Complex構造体を使います。
これはSystem.Numerics名前空間にありますが、作成直後のプロジェクトにはないので、自分で参照に含める必要があります。

f:id:kmynews:20170514154154p:plain

さて、上の式を、C#で表現してみます。

var x = new Complex(a, b);

それでは、以下の式であらわされるxを手に入れたいってなったら、どうすればいいんでしょう。

f:id:kmynews:20170514154009p:plain

Reというのは、「ここで囲んだ部分の実数を使ってね」という意味です。
つまり、複素数の実数部分がほしいわけです。

C#Complexなら、これが簡単にできます。Realプロパティを使います。結果はdoubleで得られます。

var x = new Complex(a, b).Real;

では、この複素数に新たに実数を足したい、ってなったらどうすればいいのでしょうか。

var y = new Complex(a, b) + 5;

なんとComplexdoubleの演算が可能になっています。ただし、結果はComplexで返されます。
演算子が最初からオーバーロードされていて便利ですね。

では、これを使って、何か複素数を使った公式をC#で書いてみます。強制振動の解X(t)を求めてみます。
強制振動は、運動方程式が以下のようになっています。

f:id:kmynews:20170514155904p:plain
(出典:裳華房テキストシリーズ・物理学 振動・波動 小形正男 裳華房 P90)

この時点でもうわけわからないですね。F(t)が外側から入ってくる力ということまでは分かるのですが(´・ω・`)一体何を微分するのやら。東大生すごいです。
この式の解(一般解)が、こうなるみたいです。ここまでくるための途中経過だけで3ページ弱あります。

f:id:kmynews:20170514160732p:plain
(出典:同 P93)

これをC#で計算してみます。大体以下のような式になります。

var xtComplex = (omegaZero * omegaZero - omega * omega + new Complex(0, roe * omega)) * Complex.Pow(Math.E, new Complex(0, omega * t));
var xt = xtComplex.Real;

複素数を含む数値のべき乗はMath.Powではできません。Complex.Powメソッドが用意されているので、それを使いましょう。
それ以外にも、複素数を含む三角関数、対数などを求めるメソッドがComplex構造体に用意されています。
Complexのおかげで、複雑な公式をC#に落とし込むことが簡単にできますね!

最後に、上のコードを混ぜて作ったプログラムの実行結果置いときます。
https://mstdn.jp/@kmy/10542189

いやほんと、何がしたかったのかよくわからないですね。数学はストレス発散におすすめです。