« 瓢箪山稲荷神社でお参り。 | トップページ | 展覧会 岡本太郎@大阪中之島美術館を観てきた。面白かった!幻の作品A,B,Cや巨大な明日の神話など絵画も多いが造形物がやはり気になる(ノンとか)。近鉄バファローズのデザインもされてた!そして午後の日のぬいぐるみを買ってきた。 »

2022年7月27日 (水)

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(4) 多項式フィッティングをして、Array.ConvertAllで一括でフィッティングデータを得る。

その(1)~(3)でははMath.NET numericsを使って

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

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(2) 補間を行う(Interpolate) リニア、3次スプライン、有理関数などいろいろ使える。

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(3) 高速フーリエ変換(FFT)を実行する。FourierOptionsにMatlabとNumerical Recipesがあるのが意外。

というのをやってみた。今回はその(4)、多項式フィッティング。

これは簡単で、Fit.Polynomial(xの配列, yの配列 , 次数);とするだけ。ただ、これで多項式の係数は得られるがそれをまたデータに直すのを効率的にはどうやるんだ?と悩む(というか普通にfor使うのがなんかもったいないというか)。もっといい方法があるかもしれないが、Polynomial.Evaluate(x, p) と Array.ConvertAllを使うことにした。

例題はいつのものようにNumpyから。

https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html

計算部分はこんな感じで、

Mathnet_polyfit02

結果はこんな感じ。

Mathnet_polyfit01

なるほどこれは簡単。

全ソースコードはこちら:

 

 


 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 初期化
            chart1.Series.Clear();     
            chart1.Titles.Clear();      
            chart1.Legends.Clear();     
            chart1.ChartAreas.Clear();  
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Title title = new Title("多項式フィッティング", Docking.Top);
            chart1.Titles.Add(title);
            Legend legend = new Legend();
            chart1.Legends.Add(legend);

            Series series1 = new Series();
            series1.ChartType = SeriesChartType.Point;
            series1.BorderWidth = 1;
            series1.LegendText = "元データ";
            chart1.Series.Add(series1);

            Series series2 = new Series();
            series2.ChartType = SeriesChartType.Line;
            series2.BorderWidth = 1;
            series2.LegendText = "3次フィッティング";
            chart1.Series.Add(series2);
            chart1.ChartAreas.Add("");
            Axis axisX = new Axis();
            axisX.Title = "X軸";
            axisX.Minimum = -2;
            axisX.Maximum = 6;
            axisX.Interval = 1;
            chart1.ChartAreas[0].AxisX = axisX;

            Axis axisY = new Axis();
            axisY.Title = "Y軸";
            axisY.Minimum = -2;
            axisY.Maximum = 2;
            axisY.Interval = 0.5;
            chart1.ChartAreas[0].AxisY = axisY;

            double[] x = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
            double[] y = { 0.0, 0.8, 0.9, 0.1, -0.8, -1.0 };
            double[] p = Fit.Polynomial(x, y , 3);


            double[] xfit = Generate.LinearSpaced(100, -2, 6);
            double[] yfit = Array.ConvertAll(xfit , xtemp => Polynomial.Evaluate(xtemp, p));


            for (int i = 0; i < x.Length; i++)
            {
                series1.Points.AddXY(x[i], y[i]);
            }

            for (int i = 0; i < xfit.Length; i++)
            {
                series2.Points.AddXY(xfit[i], yfit[i]);

            }

        }


« 瓢箪山稲荷神社でお参り。 | トップページ | 展覧会 岡本太郎@大阪中之島美術館を観てきた。面白かった!幻の作品A,B,Cや巨大な明日の神話など絵画も多いが造形物がやはり気になる(ノンとか)。近鉄バファローズのデザインもされてた!そして午後の日のぬいぐるみを買ってきた。 »

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

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

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

コメント

コメントを書く

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

« 瓢箪山稲荷神社でお参り。 | トップページ | 展覧会 岡本太郎@大阪中之島美術館を観てきた。面白かった!幻の作品A,B,Cや巨大な明日の神話など絵画も多いが造形物がやはり気になる(ノンとか)。近鉄バファローズのデザインもされてた!そして午後の日のぬいぐるみを買ってきた。 »

最近の記事

最近のコメント

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        
フォト
無料ブログはココログ