jfreechartを使用して、滑らかな曲線を描画し、参照のために最小二乗法の数学的原理を使用してそれらを計算します。特定のコンテンツは次のとおりです
グラフィックを描く:
コード:
FittingCurve.java
パッケージorg.jevy; java.util.arraylistをインポートします。 java.util.listをインポートします。 Import org.jfree.chart.chartfactory; Import org.jfree.chart.chartpanel; Import org.jfree.chart.jfreechart; Import org.jfree.chart.axis.valueaxis; Import org.jfree.chart.plot.plotorientation; Import org.jfree.chart.plot.xyplot; Import org.jfree.chart.renderer.xy.xyitemrenderer; Import org.jfree.chart.renderer.xy.xylinedshaperender; Import org.jfree.data.xy.xydataset; Import org.jfree.data.xy.xyseries; Import org.jfree.data.xy.xyseriescollection; Import org.jfree.ui.applicationframe; Import org.jfree.ui.refineryutitivities; Public Class FittingCurveは、ApplicationFrame {List <Double> equation = null; //多項式の数を設定しますint times = 2; public FittingCurve(String Title){super(title); //最小二乗法を使用して、適合多項式の各用語の前に係数を計算します。 /*注意:多項式曲線パラメーターの計算は、チャートチャート生成とは別に処理されます。多項式曲線パラメーターの計算:多項式係数の計算と多項式係数リストの返却を担当します。チャートチャート生成:指定されたデータに従って描画する責任があります。たとえば、特定のポイントを接続します。この例では、滑らかな曲線は非常に高密度のポイントラインで描画されます。多項式の係数を計算したため、X軸データを非常に小さなステップで成長させ、各X値について、多項式を使用してY値を計算し、多くの(X、Y)ポイントグループを取得しました。これら(x、y)で構成されるドット線を描き、滑らかな曲線を示します。 Xyseriesは、関連データのセットを描画するために使用されるjfreechartプロットデータセットです。 Xyseriesは、xおよびy軸データセットに対応しています。データは次のように追加されます。XyseriesS.Add(x、y); XyseriesCollectionはXyseriesのコレクションです。複数の曲線をチャートに描画する必要がある場合、複数の曲線に対応するXyseriesをXyseriesCollection Add Methodに追加する必要があります:DataSet.Addseries(S1); dataset.addseries(s2); *///多項式の数は高から低いものです。この関数で必要なパラメーターは、x軸データ<リスト>、y軸データ<リスト>、および多項式の数<2> this.equation = this.getCurve equation(this.getData()。get(0)、this.getData()。 //チャートを生成jfreechartチャート= this.getChart(); Chartpanel Chartpanel = new Chartpanel(チャート); chartpanel.setPreferredSize(new Java.awt.Dimension(500、270)); chartpanel.setMousezoomable(true、false); SetContentPane(Chartpanel); } public static void main(string [] args){// todo auto-fittingcurve demo = new FittingCurve( "xyfittingcurve"); demo.pack(); refineryutilities.centerframeonscreen(demo); demo.setVisible(true); } //チャートを生成public jfreechart getChart(){// get xydataset xydataset = this.getxydataset(); //座標で表されるラインチャートの作成//座標ポイントxyplot plot =(xyplot)xychart.getplot()の形状を生成します。 xyitemrenderer r = plot.getRenderer(); if(r instanceof xylineandshaperender){xylineandshaperender renderer =(xylineandshaperender)r; renderer.setBaseshapesVisible(false); //座標ポイントの形状可視renderer.setbaseshapesfilld(false); } valueaxis yaxis = plot.getrangeaxis(); yaxis.setlowermargin(2); xychartを返します。 } //データセットは、論理関係public xydataset getxydataset()に従って対応するセットに追加されます{//プリセットデータポイントデータセットXyseries s2 = new Xyseries( "double-dot line"); for(int i = 0; i <data.get(0).size(); i ++){s2.add(data.get(0).get(i)、data.get(1).get(i)); } //データセットは、曲線xyseries s1 = new Xyseries( "フィッティングカーブ")をフィットすることで描画されます。 //多項式係数を適合させると、方程式は建設方法リスト<double> list = this.equationにインスタンス化されています。 //プリセットポイントデータリストを取得<リスト<ダブル>>データ= this.getData(); // xの最大とminを取得します。リスト<double> xlist = data.get(0); double max = this.getmax(xlist); double min = this.getmin(xlist); double step = max -min; double x = min; double step2 = step/800.0; //多項式を多項式の形で復元し、多項式を使用して、(int i = 0; i <800; i ++){x = x+step2; int num = list.size()-1;二重温度= 0.0; for(int j = 0; j <list.size(); j ++){temp = temp+math.pow(x、(num-j))*list.get(j); } s1.add(x、temp); } //プリセットデータセットを追加して、データセットをxyseriesCollection xyseriesCollection dataset = new XyseriesCollection()に適合させます。 DataSet.Addseries(S1); dataset.addseries(s2);データセットを返します。 } //プロットデータ(ポイント)パブリックリスト<list <double >> getData(){// xはx軸座標リスト<double> x = new arraylist <double>();リスト<double> y = new arraylist <double>(); for(int i = 0; i <10; i ++){x.add(-5.0+i); } Y.Add(26.0); Y.Add(17.1); Y.Add(10.01); Y.Add(5.0); Y.Add(2.01); Y.Add(1.0); Y.Add(2.0); Y.Add(5.01); Y.Add(10.1); Y.Add(17.001);リスト<リスト<double >> list = new arraylist <list <double >>(); list.add(x); list.add(y);返品リスト。 } //次のコードは、最小二乗法の多項式係数を計算します。 } list <double> result = new arrayList <double>();リスト<double> s = new ArrayList <double>();リスト<double> t = new ArrayList <double>(); // s0 s1 ... s2m for(int i = 0; i <= 2*m; i ++){double si = 0.0; for(double xx:x){si = si + math.pow(xx、i); } s.add(si); } // t0 t1…tm for(int j = 0; j <= m; j ++){double ti = 0.0; for(int k = 0; k <y.size(); k ++){ti = ti+y.get(k)*math.pow(x.get(k)、j); } t.add(ti); } //マトリックスダブル[] []マトリックス= new double [M+1] [M+2]として2次元配列にSとTを入れます。 for(int k = 0; k <m+1; k ++){double [] matrix = matrix [k]; for(int q = 0; q <m+1; q ++){matrixi [q] = s.get(k+q); } matrixi [m+1] = t.get(k); } for(int p = 0; p <matrix.length; p ++){for(int pp = 0; pp <matrix [p] .length; pp ++){system.out.print( "matrix ["+p+"] ["+pp+"] =" = "+matrix [p]); } system.out.println(); } //マトリックスを三角形行列に変換します= this.MatrixConvert(Matrix); //多項式係数を計算すると、多項式は高結果から低い結果から低いものから低いものに配置されます= this.matrixcalcu(matrix);返品結果; } //マトリックスを三角形行列に変換しますpublic double [] [] matrixConvert(double [] [] d){for(int i = 0; i <d.length-1; i ++){double [] dd1 = d [i]; double num1 = dd1 [i]; for(int j = i; j <d.length-1; j ++){double [] dd2 = d [j+1]; double num2 = dd2 [i]; for(int k = 0; k <dd2.length; k ++){dd2 [k] =(dd2 [k]*num1 -dd1 [k]*num2); }}} for(int ii = 0; ii <d.length; ii ++){for(int kk = 0; kk <d [ii] .length; kk ++)system.out.print(d [ii] [kk]+""); System.out.println(); } return d; } // xm xm-1…x0(多項式順序が高から低いものに配置されます)パブリックリスト<double> matrixcalcu(double [] [] d){int i = d.length -1; int j = d [0] .length -1;リスト<double> list = new arraylist <double>(); double res = d [i] [j]/d [i] [j-1]; list.add(res); for(int k = i-1; k> = 0; k-){double num = d [k] [j]; for(int q = j-1; q> k; q-){num = num-d [k] [q]*list.get(j-1-q); } res = num/d [k] [k]; list.add(res); }返品リスト。 } //リスト内の二重データの最大値と最小値を取得しますpublic double getmax(list <double> data){double res = data.get(0); for(int i = 0; i <data.size() - 1; i ++){if(res <data.get(i+1)){res = data.get(i+1); }} RESを返します。 } public double getmin(list <double> data){double res = data.get(0); for(int i = 0; i <data.size() - 1; i ++){if(res> data.get(i+1)){res = data.get(i+1); }} RESを返します。 }}}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。