189 8069 5689

ApacheCommonsMath3探索之多项式曲线拟合的示例分析

这篇文章将为大家详细讲解有关Apache Commons Math3探索之多项式曲线拟合的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

创新互联专注于九原企业网站建设,成都响应式网站建设公司,商城网站建设。九原网站建设公司,为九原等地区提供建站服务。全流程按需定制网站,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

具体如下。

多项式曲线拟合:org.apache.commons.math4.fitting.PolynomialCurveFitter类。

用法示例代码:

// ... 创建并初始化输入数据: 
double[] x = new double[...]; 
double[] y = new double[...]; 
将原始的x-y数据序列合成带权重的观察点数据序列: 
WeightedObservedPoints points = new WeightedObservedPoints(); 
// 将x-y数据元素调用points.add(x[i], y[i])加入到观察点序列中 
// ... 
PolynomialCurveFitter fitter = PolynomialCurveFitter.create(degree);  // degree 指定多项式阶数 
double[] result = fitter.fit(points.toList());  // 曲线拟合,结果保存于双精度数组中,由常数项至最高次幂系数排列

首先要准备好待拟合的曲线数据x和y,这是两个double数组,然后把这两个数组合并到WeightedObservedPoints对象实例中,可以调用WeightedObservedPoints.add(x[i], y[i])将x和y序列中的数据逐个添加到观察点序列对象中。随后创建PolynomialCurveFitter对象,创建时要指定拟合多项式的阶数,注意阶数要选择适当,不是越高越好,否则拟合误差会很大。最后调用PolynomialCurveFitter的fit方法即可完成多项式曲线拟合,fit方法的参数通过WeightedObservedPoints.toList()获得。拟合结果通过一个double数组返回,按元素顺序依次是常数项、一次项、二次项、……。

完整的演示代码如下:

interface TestCase 
{ 
  public Object run(List params) throws Exception; 
  public List getParams(); 
  public void printResult(Object result); 
} 
class CalcCurveFitting implements TestCase 
{ 
  public CalcCurveFitting() 
  { 
   System.out.print("本算例用于计算多项式曲线拟合。正在初始化 计算数据(" + arrayLength + "点, " + degree + "阶)... ..."); 
   inputDataX = new double[arrayLength]; 
   //   inputDataX = new double[] {1, 2, 3, 4, 5, 6, 7}; 
   inputDataY = new double[inputDataX.length]; 
   double[] factor = new double[degree + 1];  // N阶多项式会有N+1个系数,其中之一为常数项 
   for(int index = 0; index < factor.length; index ++) 
   { 
     factor[index] = index + 1; 
   } 
   for(int index = 0; index < inputDataY.length; index ++) 
   { 
     inputDataX[index] = index * 0.00001; 
     inputDataY[index] = calcPoly(inputDataX[index], factor);  // y = sum(x[n) * fact[n]) 
     // System.out.print(inputDataY[index] + ", "); 
   } 
   points = new WeightedObservedPoints(); 
   for(int index = 0; index < inputDataX.length; index ++) 
   { 
     points.add(inputDataX[index], inputDataY[index]); 
   } 
   System.out.println("初始化完成"); 
  } 
  @Override 
  public List getParams() 
  { 
   List params = new ArrayList(); 
   params.add(points); 
   return params; 
  } 
  @Override 
  public Object run(List params) throws Exception 
  { 
   PolynomialCurveFitter fitter = PolynomialCurveFitter.create(degree); 
   WeightedObservedPoints points = (WeightedObservedPoints)params.get(0); 
   double[] result = fitter.fit(points.toList()); 
   return result; 
  } 
  @Override 
  public void printResult(Object result) 
  { 
   for(double data : (double[])result) 
   { 
     System.out.println(data); 
   } 
  } 
  private double calcPoly(double x, double[] factor) 
  { 
   double y = 0; 
   for(int deg = 0; deg < factor.length; deg ++) 
   { 
     y += Math.pow(x, deg) * factor[deg]; 
   } 
   return y; 
  } 
  private double[] inputDataX = null; 
  private double[] inputDataY = null; 
  private WeightedObservedPoints points = null; 
  private final int arrayLength = 200000; 
  private final int degree = 5;  // 阶数 
} 
public class TimeCostCalculator 
{ 
  public TimeCostCalculator() 
  { 
  } 
  /** 
  * 计算指定对象的运行时间开销。 
  * 
  * @param testCase 指定被测对象。 
  * @return 返回sub.run的时间开销,单位为s。 
  * @throws Exception 
  */ 
  public double calcTimeCost(TestCase testCase) throws Exception 
  { 
   List params = testCase.getParams(); 
   long startTime = System.nanoTime(); 
   Object result = testCase.run(params); 
   long stopTime = System.nanoTime(); 
   testCase.printResult(result); 
   System.out.println("start: " + startTime + " / stop: " + stopTime); 
   double timeCost = (stopTime - startTime) * 1.0e-9; 
   return timeCost; 
  } 
  public static void main(String[] args) throws Exception 
  { 
   TimeCostCalculator tcc = new TimeCostCalculator(); 
   double timeCost; 
   System.out.println("--------------------------------------------------------------------------"); 
   timeCost = tcc.calcTimeCost(new CalcCurveFitting()); 
   System.out.println("time cost is: " + timeCost + "s"); 
   System.out.println("--------------------------------------------------------------------------"); 
  } 
}

关于“Apache Commons Math3探索之多项式曲线拟合的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


标题名称:ApacheCommonsMath3探索之多项式曲线拟合的示例分析
链接地址:http://cdxtjz.cn/article/jijjho.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。