用JFreeChart绘制光滑曲线,利用最小二乘法数学原理计算,供大家参考,具体内容如下
绘制图形:
代码:
FittingCurve.java
package org.jevy;
import java.util.ArrayList;
import 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.XYLineAndShapeRenderer;
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.RefineryUtilities;
public class FittingCurve extends Applicationframe{
List equation = null;
//设置多项式的次数
int times = 2;
public FittingCurve(String title) {
super(title);
//使用最小二乘法计算拟合多项式中各项前的系数。
//多项式的次数从高到低,该函数需要的参数:x轴数据,y轴数据,多项式的次数<2>
this.equation = this.getCurveEquation(this.getData().get(0),this.getData().get(1),this.times);
//生成Chart
JFreeChart chart = this.getChart();
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
chartPanel.setMouseZoomable(true, false);
setContentPane(chartPanel);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
FittingCurve demo = new FittingCurve("XYFittingCurve");
demo.pack();
RefineryUtilities.centerframeonScreen(demo);
demo.setVisible(true);
}
//生成chart
public JFreeChart getChart(){
//获取X和Y轴数据集
XYDataset xydataset = this.getXYDataset();
//创建用坐标表示的折线图
JFreeChart xyChart = ChartFactory.createXYLineChart(
"二次多项式拟合光滑曲线", "X轴", "Y轴", xydataset, PlotOrientation.VERTICAL, true, true, false);
//生成坐标点点的形状
XYPlot plot = (XYPlot) xyChart.getPlot();
XYItemRenderer r = plot.getRenderer();
if (r instanceof XYLineAndShapeRenderer) {
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
renderer.setbaseShapesVisible(false);//坐标点的形状是否可见
renderer.setbaseShapesFilled(false);
}
ValueAxis yAxis = plot.getRangeAxis();
yAxis.setLowerMargin(2);
return xyChart;
}
//数据集按照逻辑关系添加到对应的集合
public XYDataset getXYDataset() {
//预设数据点数据集
XYSeries s2 = new XYSeries("点点连线");
for(int i=0; i list = this.equation;
//获取预设的点数据
List> data = this.getData();
//get Max and Min of x;
List 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;
//按照多项式的形式 还原多项式,并利用多项式计算给定x时y的值
for(int i=0; i<800; i++){
x = x + step2;
int num = list.size()-1;
double temp = 0.0;
for(int j=0; j> getData(){
//x为x轴坐标
List x = new ArrayList();
List y = new ArrayList();
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);
List> list = new ArrayList>();
list.add(x);
list.add(y);
return list;
}
//以下代码为最小二乘法计算多项式系数
//最小二乘法多项式拟合
public List getCurveEquation(List x, List y, int m){
if(x.size() != y.size() || x.size() <= m+1){
return new ArrayList();
}
List result = new ArrayList();
List S = new ArrayList();
List T = new ArrayList();
//计算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 MatrixCalcu(double[][] d){
int i = d.length -1;
int j = d[0].length -1;
List list = new ArrayList();
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);
}
return list;
}
//获取List中Double数据的最大最小值
public double getMax(List data){
double res = data.get(0);
for(int i=0; i data){
double res = data.get(0);
for(int i=0; idata.get(i+1)){
res = data.get(i+1);
}
}
return res;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



