« ルクア大阪 11階 風の広場から下を見る。 | トップページ | 阪急清荒神駅から歩いて清荒神清澄寺でお参り。 »

2025年9月 8日 (月)

Javaの数値計算ライブラリApache Commons Mathを使う(2) 補間を行う(Interpolate) リニア、Akimaスプラインなどいろいろある。JFreeChartで散布図とXYプロットを描く。

今回は補間。

https://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/analysis/interpolation/package-summary.html

いろいろあるがリニアとAkima(秋間)スプラインを使ってみよう。

コードはこんな感じ。


import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.interpolation.AkimaSplineInterpolator;
import org.apache.commons.math3.analysis.interpolation.LinearInterpolator;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import java.awt.BorderLayout;
import javax.swing.JFrame;

public class Interpolation extends JFrame {
    public static void main(String[] args) {
        Interpolation frame = new Interpolation();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(10, 10, 640, 480);
        frame.setTitle("Interpolation");
        frame.setVisible(true);
       
    }
    public Interpolation() {
   
        JFreeChart chart =
          ChartFactory.createXYLineChart("Interpolation",
                                         "x",
                                         "y",
                                         createData(),
                                         PlotOrientation.VERTICAL,
                                         true,
                                         false,
                                         false);

        XYPlot plot = chart.getXYPlot();
        XYLineAndShapeRenderer renderer =new XYLineAndShapeRenderer();
        renderer.setSeriesLinesVisible(0, false);
        renderer.setSeriesShapesVisible(1, false);
        renderer.setSeriesShapesVisible(2, false);
        plot.setRenderer(renderer);
        ChartPanel cpanel = new ChartPanel(chart);
        getContentPane().add(cpanel, BorderLayout.CENTER);
}
    private XYSeriesCollection createData(){
         
            int n = 10;
            double[] x = new double[n];
            double[] y = new double[n];
            for (int i = 0; i < n; i++) {
                x[i] = 2.0 * Math.PI * (double)i / (double)(n - 1);
                y[i] = Math.sin(x[i]);
            }
           
            int m = 50;
            double[] xval = new double[m];
            double[] yline = new double[m];
            double[] yakima = new double[m];
           
            LinearInterpolator linearInterpolator = new LinearInterpolator();
            AkimaSplineInterpolator akimaSplineInterpolator = new AkimaSplineInterpolator();
            UnivariateFunction lineFunction = linearInterpolator.interpolate(x, y);
            UnivariateFunction akimaFunction = akimaSplineInterpolator.interpolate(x, y);
           
            for (int i = 0; i < m; i++) {
                xval[i] = 2.0 * Math.PI * (double)i / (double)(m - 1);
                yline[i] = lineFunction.value(xval[i]);
                yakima[i] = akimaFunction.value(xval[i]);
            }
           
            XYSeriesCollection data = new XYSeriesCollection();

            XYSeries series1 = new XYSeries("Original Points");
            for (int i = 0 ; i < n ; i++){
              series1.add(x[i], y[i]);
            }

            XYSeries series2 = new XYSeries("Linear");
            for (int i = 0 ; i < m ; i++){
              series2.add(xval[i], yline[i]);
            }
           
            XYSeries series3 = new XYSeries("Spline");
            for (int i = 0 ; i < m ; i++){
              series3.add(xval[i], yakima[i]);
            }

            data.addSeries(series1);
            data.addSeries(series2);
            data.addSeries(series3);
           
            return data;
          }
}

実行結果。

Javainterp01

ちゃんと補間されている。

 

« ルクア大阪 11階 風の広場から下を見る。 | トップページ | 阪急清荒神駅から歩いて清荒神清澄寺でお参り。 »

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

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

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

コメント

コメントを書く

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

« ルクア大阪 11階 風の広場から下を見る。 | トップページ | 阪急清荒神駅から歩いて清荒神清澄寺でお参り。 »

最近の記事

2026年2月
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

最近のコメント

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