« 高周波・RFニュース 2025年2月19日 3GPPが6Gに向けAI/ML関連作業、Xiaomi 15 ProにQualcommのチップ搭載、CMTの44GHzまでの2ポートUSBネットアナ、MOKOのアセット・社員トラッカーにNordicのチップ採用 | トップページ | いつの間にかMicrosoft 365 Copilotが使えるようになった(6)ダミーデータを作ってもらう。名前、性別、年齢、住所はすぐできた。相関係数がある値になるようなデータを作って、というと高度な分析というのでPythonを使ってこれもできた。 »

2025年2月19日 (水)

Visual C#(C_sharp)用のグラフプロットライブラリScottPlotを使う(1) 数値計算ライブラリMath.NET Numericsと組み合わせてルンゲクッタ法でローレンツ方程式を計算、図示して拡大縮小移動してみる。

Visual C#でグラフを描くには.NET framework 4.xならExcelのグラフのようなものが描けるMS Chartが使える。

https://atmarkit.itmedia.co.jp/ait/articles/1007/22/news111.html

しかしもうframeworkを使ってる場合じゃない。今は.NET 9が出ている時代。

サーバー アプリ用 .NET と .NET Framework

しかし残念ながら.NETではChartが使えない。そこで使えそうなライブラリを探すと

ScottPlot

https://scottplot.net/

OxyPlot

https://oxyplot.github.io/

などがあった。とりあえずScottPlotの方が情報量多そうなのでこっちを使ってみる。今回はVisual C#の.NET 8でやってみる。

まず、インストールはNuGetで簡単にできる。ScottPlot.WinFormsを選択。

Scottplotrk00

するとツールボックスにFormsPlotが現れるので、これをChartと同じようにフォームに貼り付けるだけ。

Scottplotrk01

何のグラフを描こうか、と思ったがここはMath.NET Numericsを使ってルンゲクッタ法でローレンツ方程式を描いてみよう。

ソースコードはこんな感じで。


using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.OdeSolvers;

namespace PlotRungeKutta01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var axis = formsPlot1.Plot.Axes;
            axis.Bottom.Label.Text = "X";
            axis.Bottom.TickLabelStyle.FontSize = 21;
            axis.Left.Label.Text = "Y, Z";
            axis.Left.TickLabelStyle.FontSize = 21;
            axis.Title.Label.Text = "Lorenz Equation";
            axis.Title.Label.FontSize = 32;
            axis.SetLimits(-20, 20, -30, 50);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            double dt = 0.01;
            double tmax = 200.0;
            int n = Convert.ToInt32(tmax / dt);
            var xs = new double[n];
            var ys = new double[n];
            var zs = new double[n];

            var t = MathNet.Numerics.Generate.LinearSpaced(n, 0.0, tmax);
            var x0 = Vector<double>.Build.DenseOfArray(new double[] { 1.0, 1.0, 1.0 });
            var x = RungeKutta.FourthOrder(x0, 0, tmax, n, Func);
            for (int i = 0; i < n; i++)
            {
                xs[i] = x[i][0];
                ys[i] = x[i][1];
                zs[i] = x[i][2];
            }

            var xy = formsPlot1.Plot.Add.ScatterLine(xs, ys);
            xy.LegendText = "Y";
            var xz = formsPlot1.Plot.Add.ScatterLine(xs, zs);
            xz.LegendText = "Z";
            formsPlot1.Plot.Legend.FontSize = 21;
            formsPlot1.Plot.ShowLegend();
            formsPlot1.Plot.Axes.AutoScale();
            formsPlot1.Refresh();
           
        }
        Vector<double> Func(double t, Vector<double> x)
        {
            double s = 10.0, r = 28.0, b = 8.0 / 3.0;

            double x_dot = s * (x[1] - x[0]);
            double y_dot = r * x[0] - x[1] - x[0] * x[2];
            double z_dot = x[0] * x[1] - b * x[2];

            return Vector<double>.Build.DenseOfArray(new double[] { x_dot, y_dot, z_dot });
        }
    }
}

結果を動画にしたもの。拡大縮小移動が簡単にできる。

このScottPlotでいろいろやってみよう。

 

« 高周波・RFニュース 2025年2月19日 3GPPが6Gに向けAI/ML関連作業、Xiaomi 15 ProにQualcommのチップ搭載、CMTの44GHzまでの2ポートUSBネットアナ、MOKOのアセット・社員トラッカーにNordicのチップ採用 | トップページ | いつの間にかMicrosoft 365 Copilotが使えるようになった(6)ダミーデータを作ってもらう。名前、性別、年齢、住所はすぐできた。相関係数がある値になるようなデータを作って、というと高度な分析というのでPythonを使ってこれもできた。 »

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

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

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

コメント

コメントを書く

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

« 高周波・RFニュース 2025年2月19日 3GPPが6Gに向けAI/ML関連作業、Xiaomi 15 ProにQualcommのチップ搭載、CMTの44GHzまでの2ポートUSBネットアナ、MOKOのアセット・社員トラッカーにNordicのチップ採用 | トップページ | いつの間にかMicrosoft 365 Copilotが使えるようになった(6)ダミーデータを作ってもらう。名前、性別、年齢、住所はすぐできた。相関係数がある値になるようなデータを作って、というと高度な分析というのでPythonを使ってこれもできた。 »

最近の記事

2025年3月
            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          

最近のコメント

無料ブログはココログ
フォト