ใช้ JFreechart เพื่อวาดเส้นโค้งที่ราบรื่นและคำนวณโดยใช้หลักการทางคณิตศาสตร์ของวิธีการกำลังสองน้อยที่สุดสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
วาดกราฟิก:
รหัส:
FittingCurve.java
แพ็คเกจ org.jevy; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า org.jfree.chart.chartfactory; นำเข้า org.jfree.chart.chartpanel; นำเข้า org.jfree.chart.jfreechart; นำเข้า org.jfree.chart.axis.valueAxis; นำเข้า org.jfree.chart.plot.plotorientation; นำเข้า org.jfree.chart.plot.xyplot; นำเข้า org.jfree.chart.renderer.xy.xyitemrenderer; นำเข้า org.jfree.chart.renderer.xy.xylineandshaperenderer; นำเข้า org.jfree.data.xy.xydataset; นำเข้า org.jfree.data.xy.xyseries; นำเข้า org.jfree.data.xy.xyseriescollection; นำเข้า org.jfree.ui.applicationframe; นำเข้า org.jfree.ui.refineryutilities; Public Class FittingCurve ขยาย ApplicationFrame {รายการ <bould> สมการ = null; // ตั้งค่าจำนวนพหุนาม Int Times = 2; Public FittingCurve (ชื่อสตริง) {super (ชื่อ); // ใช้วิธีการกำลังสองน้อยที่สุดในการคำนวณค่าสัมประสิทธิ์ก่อนแต่ละเทอมในพหุนามที่ติดตั้ง /* โปรดทราบ: การคำนวณพารามิเตอร์พารามิเตอร์พหุนามถูกประมวลผลแยกต่างหากจากการสร้างแผนภูมิแผนภูมิ การคำนวณพารามิเตอร์เส้นโค้งพหุนาม: รับผิดชอบในการคำนวณค่าสัมประสิทธิ์พหุนามและส่งคืนรายการค่าสัมประสิทธิ์พหุนาม การสร้างแผนภูมิ: รับผิดชอบเฉพาะการวาดตามข้อมูลที่กำหนด ตัวอย่างเช่นเชื่อมต่อจุดที่กำหนด ในตัวอย่างนี้เส้นโค้งเรียบจะถูกวาดด้วยเส้นที่หนาแน่นมาก เนื่องจากเราคำนวณค่าสัมประสิทธิ์ของพหุนามเราจึงทำให้ข้อมูลแกน x เพิ่มขึ้นในขั้นตอนที่เล็กมากและสำหรับค่า X แต่ละค่าเราจึงใช้พหุนามเพื่อคำนวณค่า y ดังนั้นจึงได้รับจำนวนกลุ่ม (x, y) วาดเส้นจุดที่ประกอบด้วย (x, y) เหล่านี้และแสดงเส้นโค้งที่ราบรื่น Xyseries เป็นชุดข้อมูลพล็อต JFreechart ซึ่งใช้ในการวาดชุดข้อมูลที่เกี่ยวข้อง Xyseries สอดคล้องกับชุดข้อมูลแกน x และ y ข้อมูลจะถูกเพิ่มดังนี้: Xyseries S.Add (x, y); Xyseriescollection เป็นคอลเลกชันของ Xyseries เมื่อต้องมีการวาดหลายเส้นโค้งบนแผนภูมิ Xyseries ที่สอดคล้องกับหลายเส้นโค้งจะต้องเพิ่มลงใน XyseriesCollection วิธีเพิ่ม: ชุดข้อมูล Addseries (S1); DataSet.Addseries (S2); */// จำนวนพหุนามนั้นมาจากสูงถึงต่ำ พารามิเตอร์ที่ต้องการโดยฟังก์ชั่นนี้คือ: X-Axis Data <list>, ข้อมูลแกน y <list> และจำนวนพหุนาม <2> this.equation = this.getCurveequation (this.getData () รับ (0), this.getData () รับ (1) // สร้างแผนภูมิ jfreechart chart = this.getChart (); ChartPanel ChartPanel = ChartPanel ใหม่ (แผนภูมิ); ChartPanel.SetPreferredSize (Java.Awt.Dimension ใหม่ (500, 270)); ChartPanel.SetMouseZoomable (จริง, เท็จ); SetContentPane (ChartPanel); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วิธีการที่สร้างขึ้นอัตโนมัติวิธีการ demo fittingcurve demo = ใหม่ fittingCurve ("xyfittingCurve"); demo.pack (); RefineryUtilities.CenterFrameOnsCreen (สาธิต); demo.setVisible (จริง); } // สร้างแผนภูมิสาธารณะ jfreechart getChart () {// รับ xydataset xydataset = this.getXyDataSet (); // สร้างแผนภูมิบรรทัดที่แสดงโดยพิกัด jfreechart xychart = chartfactory.createxylinechart ("polynomial polynomial fit curve", "แกน x", "แกน y", xydataset, plotorientation.vertical, จริง, จริง, เท็จ); // สร้างรูปร่างของจุดพิกัด xyplot plot = (xyplot) xychart.getPlot (); xyitemrenderer r = plot.getRenderer (); if (r อินสแตนซ์ของ xylineandshaperenderer) {xylineandshaperenderer renderer = (xylineandshaperenderer) r; render.setbaseshapesvisible (เท็จ); // เป็นรูปร่างของจุดประสานงานที่มองเห็นได้ } valueAxis yaxis = plot.getRangeAxis (); Yaxis.SetLowerMargin (2); กลับ xychart; } // ชุดข้อมูลจะถูกเพิ่มเข้าไปในชุดที่สอดคล้องกันตามความสัมพันธ์เชิงตรรกะสาธารณะ XyDataset getXyDataset () {// ข้อมูลจุดข้อมูลจุดที่ตั้งไว้ล่วงหน้า XySeries S2 = ใหม่ xyseries ("Double-Dot Line"); สำหรับ (int i = 0; i <data.get (0) .size (); i ++) {s2.add (data.get (0) .get (i), data.get (1) .get (i)); } // ชุดข้อมูลถูกวาดโดยการปรับเส้นโค้ง xyseries s1 = ใหม่ xyseries ("เส้นโค้งที่เหมาะสม"); // รับค่าสัมประสิทธิ์พหุนามพอดีสมการได้รับการสร้างอินสแตนซ์ในรายการวิธีการก่อสร้าง <bouble> list = this.equation; // รับรายการข้อมูลจุดที่ตั้งไว้ล่วงหน้า <list <double>> data = this.getData (); // รับสูงสุดและนาทีของ x; รายการ <bould> xlist = data.get (0); double max = this.getmax (xlist); double min = this.getmin (xlist); สองขั้นตอน = สูงสุด - นาที; double x = min; double step2 = step/800.0; // คืนค่าพหุนามในรูปแบบของพหุนามและใช้พหุนามเพื่อคำนวณค่าของ y เมื่อได้รับ x สำหรับ (int i = 0; i <800; i ++) {x = x+step2; int num = list.size ()-1; อุณหภูมิสองครั้ง = 0.0; สำหรับ (int j = 0; j <list.size (); j ++) {temp = temp+math.pow (x, (num-j))*list.get (j); } s1.add (x, temp); } // เพิ่มชุดข้อมูลที่ตั้งไว้ล่วงหน้าเพื่อให้พอดีกับชุดข้อมูลเป็น XySeriesCollection XySeriesCollection Set = New XySeriesCollection (); DataSet.Addseries (S1); DataSet.Addseries (S2); ส่งคืนชุดข้อมูล } // จำลองข้อมูลการพล็อต (คะแนน) รายการสาธารณะ <รายการ <bould>> getData () {// x คือรายการพิกัด X-axis <bouble> x = new ArrayList <bould> (); รายการ <bould> y = arraylist ใหม่ <bouble> (); สำหรับ (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); รายการ <list <double>> list = new ArrayList <list <double>> (); list.add (x); list.add (y); รายการคืน; } // รหัสต่อไปนี้คำนวณค่าสัมประสิทธิ์พหุนามสำหรับวิธีการกำลังสองน้อยที่สุด // วิธีการสี่เหลี่ยมน้อยที่สุดรายการพหุนามพหุนามที่เหมาะสมรายการสาธารณะ <boukle> getCurveequation (รายการ <bouks> x, รายการ <bouly> y, int m) {ถ้า (x.size (x.size)! = y.size } list <bouble> result = new ArrayList <bould> (); รายการ <bould> s = arraylist ใหม่ <bouble> (); รายการ <bould> t = arraylist ใหม่ <bouble> (); // คำนวณ S0 S1 ... s2m สำหรับ (int i = 0; i <= 2*m; i ++) {double si = 0.0; สำหรับ (double xx: x) {si = si + math.pow (xx, i); } s.add (Si); } // คำนวณ t0 t1 … tm สำหรับ (int j = 0; j <= m; j ++) {double ti = 0.0; สำหรับ (int k = 0; k <y.size (); k ++) {ti = ti+y.get (k)*math.pow (x.get (k), j); } t.add (ti); } // ใส่ s และ t ลงในอาร์เรย์สองมิติเป็นเมทริกซ์คู่ [] [] เมทริกซ์ = ใหม่สองเท่า [M+1] [M+2]; สำหรับ (int k = 0; k <m+1; k ++) {double [] matrix = matrix [k]; สำหรับ (int q = 0; q <m+1; q ++) {matrixi [q] = s.get (k+q); } matrixi [m+1] = t.get (k); } สำหรับ (int p = 0; p <matrix.length; p ++) {สำหรับ (int pp = 0; pp <matrix [p] .length; pp ++) {system.out.print ("matrix ["+p+"] ["+pp+"] ="+matrix [p] } system.out.println (); } // แปลงเมทริกซ์เป็นเมทริกซ์สามเหลี่ยมเมทริกซ์ = this.matrixConvert (เมทริกซ์); // คำนวณค่าสัมประสิทธิ์พหุนามและพหุนามถูกจัดเรียงจากผลลัพธ์สูงถึงต่ำ = this.matrixcalcu (เมทริกซ์); ผลการกลับมา; } // แปลงเมทริกซ์เป็นรูปสามเหลี่ยมเมทริกซ์สาธารณะสองเท่า [] [] matrixConvert (double [] [] d) {สำหรับ (int i = 0; i <d.length-1; i ++) {double [] dd1 = d [i]; double num1 = dd1 [i]; สำหรับ (int j = i; j <d.length-1; j ++) {double [] dd2 = d [j+1]; double num2 = dd2 [i]; สำหรับ (int k = 0; k <dd2.length; k ++) {dd2 [k] = (dd2 [k]*num1 - dd1 [k]*num2); }}} สำหรับ (int ii = 0; ii <d.length; ii ++) {สำหรับ (int kk = 0; kk <d [ii] .length; kk ++) system.out.print (d [ii] [kk]+""); System.out.println (); } return d; } // คำนวณค่าสัมประสิทธิ์ก่อนสมการหลายลำดับแบบ univariate ซึ่งจัดเป็น xm xm-1 … x0 (คำสั่งพหุนามถูกจัดเรียงจากสูงถึงต่ำ) รายการสาธารณะ <bould> matrixcalcu (double [] [] d) {int i = d.length -1; int j = d [0] .length -1; รายการ <bould> list = new ArrayList <bould> (); double res = d [i] [j]/d [i] [j-1]; list.add (res); สำหรับ (int k = i-1; k> = 0; k-) {double num = d [k] [j]; สำหรับ (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); } return list; } // รับค่าสูงสุดและต่ำสุดของข้อมูลสองเท่าในรายการสาธารณะ double getMax (รายการ <bouble> data) {double res = data.get (0); สำหรับ (int i = 0; i <data.size ()-1; i ++) {ถ้า (res <data.get (i+1)) {res = data.get (i+1); }} return res; } public double getMin (รายการ <bould> data) {double res = data.get (0); สำหรับ (int i = 0; i <data.size ()-1; i ++) {ถ้า (res> data.get (i+1)) {res = data.get (i+1); }} return res; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น