C#で複素数を使ってみる
あすかです。
今週は小話でお茶を濁します。
複素数のおはなしです。
複素数は、高校の数学で勉強した実数と虚数が混ざった数のことです。
例えば、
この数式では、ia
を虚数部、b
を実数部といいます。
なにかとめんどいですね。
これをC#で表現するには、Complex構造体を使います。
これはSystem.Numerics
名前空間にありますが、作成直後のプロジェクトにはないので、自分で参照に含める必要があります。
さて、上の式を、C#で表現してみます。
var x = new Complex(a, b);
それでは、以下の式であらわされるx
を手に入れたいってなったら、どうすればいいんでしょう。
Re
というのは、「ここで囲んだ部分の実数を使ってね」という意味です。
つまり、複素数の実数部分がほしいわけです。
C#のComplex
なら、これが簡単にできます。Real
プロパティを使います。結果はdouble
で得られます。
var x = new Complex(a, b).Real;
では、この複素数に新たに実数を足したい、ってなったらどうすればいいのでしょうか。
var y = new Complex(a, b) + 5;
なんとComplex
とdouble
の演算が可能になっています。ただし、結果はComplex
で返されます。
演算子が最初からオーバーロードされていて便利ですね。
では、これを使って、何か複素数を使った公式をC#で書いてみます。強制振動の解X(t)
を求めてみます。
強制振動は、運動方程式が以下のようになっています。
この時点でもうわけわからないですね。F(t)が外側から入ってくる力ということまでは分かるのですが(´・ω・`)一体何を微分するのやら。東大生すごいです。
この式の解(一般解)が、こうなるみたいです。ここまでくるための途中経過だけで3ページ弱あります。
(出典:同 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
いやほんと、何がしたかったのかよくわからないですね。数学はストレス発散におすすめです。