Java实现的n阶曲线拟合功能示例

本文实例讲述了Java实现的n阶曲线拟合功能。分享给大家供大家参考,具体如下:

前面一篇文章Java实现求解一元n次多项式的方法,能解多项式以后,还需要利用那个类,根据若干采样点数据来对未来数据进行预测,拟合的矩阵在上一篇文章中已经贴出来了,这里就不说了,本篇主要是如何根据采样点来计算系数矩阵,并计算预测点的值。

原理很简单,公式在上一篇文章中也有了,此处直接贴代码。

其中用到了上一篇文章中写的类commonAlgorithm.PolynomiaSoluter

package commonAlgorithm;
import commonAlgorithm.PolynomialSoluter;
import java.lang.Math;
public class LeastSquare {
  private double[][] matrixA;
  private double[] arrayB;
  private double[] factors;
  private int order;
  public LeastSquare() {
  }
  /*
   * 实例化后,计算前,先要输入参数并生成公式 arrayX为采样点的x轴坐标,按照采样顺序排列
   * arrayY为采样点的y轴坐标,按照采样顺序与x一一对应排列 order
   * 为进行拟合的阶数。用低阶来拟合高阶曲线时可能会不准确,但阶数过高会导致计算缓慢
   */
  public boolean generateFormula(double[] arrayX, double[] arrayY, int order) {
    if (arrayX.length != arrayY.length)
      return false;
    this.order = order;
    int len = arrayX.length;
    // 拟合运算中的x矩阵和y矩阵
    matrixA = new double[order + 1][order + 1];
    arrayB = new double[order + 1];
    // 生成y矩阵以及x矩阵中幂<=order的部分
    for (int i = 0; i < order + 1; i++) {
      double sumX = 0;
      for (int j = 0; j < len; j++) {
        double tmp = Math.pow(arrayX[j], i);
        sumX += tmp;
        arrayB[i] += tmp * arrayY[j];
      }
      for (int j = 0; j <= i; j++)
        matrixA[j][i - j] = sumX;
    }
    // 生成x矩阵中幂>order的部分
    for (int i = order + 1; i <= order * 2; i++) {
      double sumX = 0;
      for (int j = 0; j < len; j++)
        sumX += Math.pow(arrayX[j], i);
      for (int j = i - order; j < order + 1; j++) {
        matrixA[i - j][j] = sumX;
      }
    }
    // 实例化PolynomiaSoluter并解方程组,得到各阶的系数序列factors
    PolynomialSoluter soluter = new PolynomialSoluter();
    factors = soluter.getResult(matrixA, arrayB);
    if (factors == null)
      return false;
    else
      return true;
  }
  // 根据输入坐标,以及系数序列factors计算指定坐标的结果
  public double calculate(double x) {
    double result = factors[0];
    for (int i = 1; i <= order; i++)
      result += factors[i] * Math.pow(x, i);
    return result;
  }
}

PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

在线多项式曲线及曲线函数拟合工具:
http://tools.jb51.net/jisuanqi/create_fun/

在线绘制多项式/函数曲线图形工具:
http://tools.jb51.net/jisuanqi/fun_draw

在线一元函数(方程)求解计算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

您可能感兴趣的文章:

  • java打印正弦曲线示例
  • java分形绘制科赫雪花曲线(科赫曲线)代码分享
  • Java实现求解一元n次多项式的方法示例
  • java使用回溯法求解数独示例
  • java求解汉诺塔问题示例
  • Java采用循环链表结构求解约瑟夫问题
  • java 求解二维数组列最小值
  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)
  • Java语言求解完美数代码分析
  • java语言求解兔子问题代码分析
(0)

相关推荐

  • java语言求解兔子问题代码分析

    1.思考 兔子问题,是费氏数列的形象化说法,它是由一位名为Fibonacci的数学家在它的著作中提出的一个问题. 2.描述 它体术的问题是:若有一只免子每个月生一只小免子,一个月后小免子也开始生产.起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)...... 我们使用数学的方式表达出来,便是下面的一组数列: 1.1.2.3.5.8.13.21.34.55.89...... 注意:新生的小免子需一个月成长期才会投入生产!而且这些兔子是不死的哦!!!

  • Java实现求解一元n次多项式的方法示例

    本文实例讲述了Java实现求解一元n次多项式的方法.分享给大家供大家参考,具体如下: 项目需要做趋势预测,采用线性拟合.2阶曲线拟合和指数拟合的算法,各种线性拟合算法写成矩阵大概是这么个形式: 其中x是横坐标采样值,y是纵坐标采样值,i是采样点序列号,a是系数,N是采样点个数,n是阶数,所以线性拟合最后就转成了一个解高阶方程组的问题. 不知道有没有什么好用的java矩阵运算的包,我很不擅长搜集这种资料,所以只好捡起了已经放下多年的线性代数,自己写了个java程序用增广矩阵的算法来解高阶方程组.直

  • java打印正弦曲线示例

    复制代码 代码如下: /* * 绘制0°到360°的正弦曲线 * 分两种情形,y>0和y<=0进行绘制 * 每种情形中要考虑每行打印两个"*"字符 * 并在打印第二个"*"字符后换行 */package hundred;import java.lang.Math;public class SinTest {    public static void main(String[] args){     //y为列方向,值从1到-1,步长为0.1     f

  • java分形绘制科赫雪花曲线(科赫曲线)代码分享

    首先我们举个例子:我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形.换句话说,较小的分支通过放大适当的比例后可以得到一个与整体几乎完全一致的花簇.因此我们可以说西兰花簇是一个分形的实例.分形一般有以下特质:在任意小的尺度上都能有精细的结构: 太不规则,以至难以用传统欧氏几何的语言描述: (至少是大略或任意地)自相似豪斯多夫维数会大於拓扑维数: 有著简单的递归定义.(i)分形集都具有任意小尺度下的比例细节,或者说它具有精细的结构.(ii)分形集不能用传统的几何语言来

  • Java语言求解完美数代码分析

    1.概念 首先我们理解一下,什么叫做完美数? 问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数.简称"完数" 例如, 6=1+2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+248 8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064 按照完数的定义,其实用程序求解完数并不是太难,先求解出这个数的所有真因子,然后相加,判断是否等于它本身即可.但是,在这个数

  • Java采用循环链表结构求解约瑟夫问题

    本文实例讲述了Java采用循环链表结构求解约瑟夫问题的方法.分享给大家供大家参考.具体分析如下: 这是第一次java考试的试题,对于没看过链表的同学来说就不会做,现在回头看看,还真不难. 约瑟夫问题: 有n个人,其编号分别为1,2,3,-,n.这n个人按顺序排成一个圈.现在给定s和d,从第s个人开始从1依次报数,数到d的人出列,然后又从下一个人开始又从1开始依次报数,数到d的人又出列,如此循环,直到最后所有人出列为止.要求定义一个节点类,采用循环链表结构求解约瑟夫问题. 以下java版的答案:

  • java 求解二维数组列最小值

    java 求解二维数组列最小值 比较二维数组列最小值,组成一个新数组返回. 实现核心算法,不需要使用IO 输入:{{5,6,1,16},{7,3,9}} 输出:{1,3} import java.util.Arrays; public class Col { public static int[] getColMin(int a[][]) { int[] res = new int[a.length]; for (int i = 0; i < a.length; i++) { int[] s =

  • java使用回溯法求解数独示例

    复制代码 代码如下: import java.util.Calendar;import java.util.Date; public class Matrix { private int matrix[][]; private long timeAfter=0;  private long timeBefore =0; public Matrix(int m[][]) {  matrix = new int[9][9];  for (int i=0; i<9 ; i++)   for(int j

  • java求解汉诺塔问题示例

    思路如下: 要实现3阶汉诺塔的求解步骤,也就是说初始状态时,A上从上到下有三个盘子,分别为1号盘.2号盘和3号盘,其中1号盘最小,3号盘最大:判断剩余盘子个数,如果只有一个盘子就退出迭代,如果有大于一个盘子就继续迭代.代码如下: 复制代码 代码如下: public class HanoiTower {    public static void moveDish(int level, char from, char inter, char to) {        if (level == 1)

  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    [题目] 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动过程和最优移动总步数. [解答] 上一篇用的是递归的方法解决这个问题,这里我们用栈来模拟汉诺塔的三个塔,也就是不用递归的方法 原理是这样的:修改后的汉诺塔问题不能让任何塔从左直接移动到右,也不能从右直接移动到左,而是要经过中间,也就是说,实际上能做的动作,只有四个:左->中,中->左,中->右,右->中 用栈

随机推荐