« 松のやでレモン風味のねぎ塩ロースかつ定食をいただく。ものすごくさっぱりしている。梅肉もついてさらにさっぱり。 | トップページ | すき家でダブル以上のトリプルニンニク牛丼特盛(ニンニクの芽、フライドにんにく、ガリガリファイヤー)をいただく。これはニンニク三昧! »

2022年6月29日 (水)

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(1) 複素行列を定義して一次方程式や逆行列、行列式などを計算する。

周りの若者の使う言語でC#が流行ってきている(データサイエンティストとかじゃ全くない分野ですよ!)。

私つかったことないなー、と思ってちょっとやってみよう。高周波関係のもので作りたいものがあるし。

今はVisual Studioは2022が最新だが、都合上2019を使う。ちなみにC#ってTwitterで文にすると#はハッシュタグになってなんかうまく検索できないのでC_sharpもタイトルにつけた。

で、数学ライブラリって何が使える?と思って探すとMath.NET Numericsというのがよさげ。

Math.NET Numerics

ただあんまり文献がない。しかも本家のサイトの説明がとても不親切…(Githubでソース見ろということかもしれないが)。

なので動かす記録を残す。

まずはNuGetでMath.NET Numericsをとってくる…というのがそもそも.NETを使ってなかった私は???と思った。

なんでもいいからソリューションを立ち上げて、プロジェクト→NuGetの管理、という項目を選んで、

Mathnet001

参照で、Mathとでも検索してMathNet.Numericsを選ぶ。これでインストールすればこのソリューションで使えるようになる。

使うときは最初に

using MathNet.Numerics;

をつければOK。

で、まず使いたいのは複素数の行列。

Complexを使うためには、

using System.Numerics;

が必要。MathNet.Numericsも複素数型はあるのだが、Complex32という単精度になってしまう。

ただ後述しますが、こいつを使うとVectorの定義が2つできてしまう。

さて、行列を使うには、

using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Complex;

のどちらかによって設定が違う!

まず上を使う場合、密行列を使うなら(疎行列も対角行列も使えますがとりあえず)

var A = Matrix<Complex>.Build.DenseOfArray(new Complex[,]
    {
        { 2.0, 1.0, 1.0},
        { -1.0, 1.0, -1.0},
        { 1.0, 2.0, 3.0}
     }
  );
var b = MathNet.Numerics.LinearAlgebra.Vector<Complex>.Build.DenseOfArray(new Complex[]
           {2.0, 3.0, -10.0});

のようにする。DenseとBuildを使う。
ここでわざわざVectorのほうにMathNet.Numerics.LinearAlgebra.をつけてるのがさっき言ったSystem.NumericsのVectorとかぶるから。
DoubleだけつかうときはSystem.Numericsをなくせばいいが、倍精度の複素数を使うときはそうはいかないとので。
下を使う場合は

var A1 = DenseMatrix.OfArray(new Complex[,]
     {
            { 2.0, 1.0, 1.0},
            { -1.0, 1.0, -1.0},
            { 1.0, 2.0, 3.0}
     }
  );

var b1 = DenseVector.OfArray(new Complex[]
           {2.0, 3.0, -10.0});

のようにする。DenseMatrixを使う。この書き方が本家のサイトで混在していてよくわからなかったのだった。まあ最初で統一すべきな気がする。

ただここまで来たら後は簡単で、Ax=bを計算するのは

var x = A.Solve(b);

でいいし、逆行列は

A.Inverse();

行列式は
A.Determinant();

でOK。サンプルプログラムとしてこんなのを書いて、

Mathnet003


using System;
using System.Numerics;
using MathNet.Numerics;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Complex;

namespace MatrixTest001
{
    class Program
    {
        static void Main(string[] args)
        {
            var A = Matrix.Build.DenseOfArray(new Complex[,]
                {   
                    {  2.0, 1.0,  1.0},
                    { -1.0, 1.0, -1.0},
                    {  1.0, 2.0,  3.0}
                }
            );
            var b = MathNet.Numerics.LinearAlgebra.Vector.Build.DenseOfArray(new Complex[]
                {2.0, 3.0, -10.0});

            var x = A.Solve(b);

            Console.WriteLine(x);

            Console.WriteLine(A.Inverse());
            Console.WriteLine(A.Determinant());



        }
    }
}

実行すると、

Mathnet002

と想定している結果が得られた。

ここで複素数は(x,y)のような形で表示される。

ということで基本の基本はだいたいわかったので、ちょっといろいろやってみる(続く)。

« 松のやでレモン風味のねぎ塩ロースかつ定食をいただく。ものすごくさっぱりしている。梅肉もついてさらにさっぱり。 | トップページ | すき家でダブル以上のトリプルニンニク牛丼特盛(ニンニクの芽、フライドにんにく、ガリガリファイヤー)をいただく。これはニンニク三昧! »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 松のやでレモン風味のねぎ塩ロースかつ定食をいただく。ものすごくさっぱりしている。梅肉もついてさらにさっぱり。 | トップページ | すき家でダブル以上のトリプルニンニク牛丼特盛(ニンニクの芽、フライドにんにく、ガリガリファイヤー)をいただく。これはニンニク三昧! »

最近の記事

最近のコメント

2024年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
フォト
無料ブログはココログ