`
xzknet
  • 浏览: 310099 次
  • 性别: Icon_minigender_1
  • 来自: 河南
文章分类
社区版块
存档分类
最新评论

最小二乘法拟合

阅读更多

 /**
 * 最小二乘法拟合
 * 
 *
 * @author Ken转发
 *
 */
public class Linest {
 /**
  * <p>
  * 函数功能:最小二乘法曲线拟合
  * </p>
  *
  * @param x
  *            实型一维数组,长度为 n 。存放给定 n 个数据点的 X 坐标
  * @param y
  *            实型一维数组,长度为 n 。存放给定 n 个数据点的 Y 坐标
  * @param n
  *            变量。给定数据点的个数
  * @param a
  *            实型一维数组,长度为 m 。返回 m-1 次拟合多项式的 m 个系数
  * @param m
  *            拟合多项式的项数,即拟合多项式的最高次数为 m-1. 要求 m<=n 且m<=20。若 m>n 或 m>20
  *            ,则本函数自动按 m=min{n,20} 处理.
  *            <p>
  *            Date:2007-12-25 16:21 PM
  *            </p>
  * @author qingbao-gao
  * @return
  */
 public static double[] PolyFit(double x[], double y[], int n, double a[],
   int m) {
  int i, j, k;
  double z, p, c, g, q = 0, d1, d2;
  double[] s = new double[20];
  double[] t = new double[20];
  double[] b = new double[20];
  double[] dt = new double[3];
  for (i = 0; i <= m - 1; i++) {
   a[i] = 0.0;
  }
  if (m > n) {
   m = n;
  }
  if (m > 20) {
   m = 20;
  }
  z = 0.0;
  for (i = 0; i <= n - 1; i++) {
   z = z + x[i] / (1.0 * n);
  }
  b[0] = 1.0;
  d1 = 1.0 * n;
  p = 0.0;
  c = 0.0;
  for (i = 0; i <= n - 1; i++) {
   p = p + (x[i] - z);
   c = c + y[i];
  }
  c = c / d1;
  p = p / d1;
  a[0] = c * b[0];
  if (m > 1) {
   t[1] = 1.0;
   t[0] = -p;
   d2 = 0.0;
   c = 0.0;
   g = 0.0;
   for (i = 0; i <= n - 1; i++) {
    q = x[i] - z - p;
    d2 = d2 + q * q;
    c = c + y[i] * q;
    g = g + (x[i] - z) * q * q;
   }
   c = c / d2;
   p = g / d2;
   q = d2 / d1;
   d1 = d2;
   a[1] = c * t[1];
   a[0] = c * t[0] + a[0];
  }
  for (j = 2; j <= m - 1; j++) {
   s[j] = t[j - 1];
   s[j - 1] = -p * t[j - 1] + t[j - 2];
   if (j >= 3)
    for (k = j - 2; k >= 1; k--) {
     s[k] = -p * t[k] + t[k - 1] - q * b[k];
    }
   s[0] = -p * t[0] - q * b[0];
   d2 = 0.0;
   c = 0.0;
   g = 0.0;
   for (i = 0; i <= n - 1; i++) {
    q = s[j];
    for (k = j - 1; k >= 0; k--) {
     q = q * (x[i] - z) + s[k];
    }
    d2 = d2 + q * q;
    c = c + y[i] * q;
    g = g + (x[i] - z) * q * q;
   }
   c = c / d2;
   p = g / d2;
   q = d2 / d1;
   d1 = d2;
   a[j] = c * s[j];
   t[j] = s[j];
   for (k = j - 1; k >= 0; k--) {
    a[k] = c * s[k] + a[k];
    b[k] = t[k];
    t[k] = s[k];
   }
  }
  dt[0] = 0.0;
  dt[1] = 0.0;
  dt[2] = 0.0;
  for (i = 0; i <= n - 1; i++) {
   q = a[m - 1];
   for (k = m - 2; k >= 0; k--) {
    q = a[k] + q * (x[i] - z);
   }
   p = q - y[i];
   if (Math.abs(p) > dt[2]) {
    dt[2] = Math.abs(p);
   }
   dt[0] = dt[0] + p * p;
   dt[1] = dt[1] + Math.abs(p);
  }
  return a;
 }

 /**
  * <p>
  * 对X轴数据节点球平均值
  * </p>
  *
  * @param x
  *            存储X轴节点的数组
  *            <p>
  *            Date:2007-12-25 20:21 PM
  *            </p>
  * @author qingbao-gao
  * @return 平均值
  */
 public static double ave(double[] x) {
  double ave = 0;
  double sum = 0;
  if (x != null) {
   for (int i = 0; i < x.length; i++) {
    sum += x[i];
   }
   System.out.println("sum-->" + sum);
   ave = sum / x.length;
   System.out.println("ave" + ave + "x.length" + x.length);
  }
  return ave;
 }

 /**
  * <p>
  * 由X值获得Y值
  * </p>
  *
  * @param x
  *            当前X轴输入值,即为预测的月份
  * @param xx
  *            当前X轴输入值的前X数据点
  * @param a
  *            存储多项式系数的数组
  * @param m
  *            存储多项式的最高次数的数组
  *            <p>
  *            Date:2007-12-25 PM 20:07
  *            </p>
  *            <P>
  *            Author:qingbao-gao
  *            </P>
  * @return 对应X轴节点值的Y轴值
  */
 public static double getY(double x, double[] xx, double[] a, int m) {
  double y = 0;
  double ave = ave(xx);

  double l = 0;
  for (int i = 0; i < m; i++) {
   l = a[0];
   if (i > 0) {
    y += a[i] * Math.pow((x - ave), i);
    System.out.println(i + "--|-->" + y + "--a[i]--" + a[i]);
   }
   System.out.println("a[0]|" + a[0]);
  }
  System.out.println("l--|" + (l));
  return (y + l);
 }

 // --------------------------------------------测试代码

 public static void main(String[] args) {

  double[] x = { 200401, 200402, 200403, 200404, 200405, 200406, 200407,
    200408, 200409, 2004010, 2004011, 2004012, 200501, 200502,
    200503, 200504 };
  double[] y = { 51, 51, 53, 53, 54, 55, 57, 60, 63, 64, 66, 66, 69, 71,
    72, 75 };
  double[] a = new double[20];
  double[] aa = PolyFit(x, y, 16, a, 3);
  double yy = 0;
  System.out.println("拟合-->" + getY(200505, x, aa, 3));
 }

}

分享到:
评论

相关推荐

    最小二乘法拟合平面最小二乘法拟合平面

    最小二乘法拟合平面

    C#最小二乘法拟合及曲线绘制

    本话题将深入探讨“C#最小二乘法拟合及曲线绘制”的相关知识点。 最小二乘法是一种优化技术,用于寻找一条曲线(通常是函数的形式)来最佳地拟合一组数据点,使得所有数据点到该曲线的垂直距离平方和最小。在C#中,...

    最小二乘法拟合直线程序

    ### 最小二乘法拟合直线程序解析 #### 一、最小二乘法概述 最小二乘法是一种数学优化技术,常用于数据拟合。它通过最小化误差平方和来寻找最佳拟合线,适用于线性回归分析。本文将重点讨论如何使用最小二乘法在一...

    机器视觉-opencv-最小二乘法拟合圆

    OpenCV 提供了 `cv::fitEllipse()` 和 `cv::minEnclosingCircle()` 函数来拟合椭圆和最小外接圆,但它们并不直接适用于最小二乘法拟合圆。因此,我们需要自己编写算法或找到现有的实现,如提供的压缩包中的代码。 ...

    采用最小二乘法拟合圆曲线(matlab程序).zip

    采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小...

    利用excel用最小二乘法拟合直线

    强烈推荐,利用excel用最小二乘法拟合直线的方法。

    C++最小二乘法拟合直线

    C++最小二乘法拟合直线,根据数据直接计算直线的斜率、截距和相似度,即拟合的好坏。

    最小二乘法拟合曲面

    ### 最小二乘法拟合曲面的知识点详解 #### 一、引言 最小二乘法是一种常用的数据拟合方法,在多个学科领域内都有广泛的应用,特别是在图像处理、计算机图形学以及数值分析等领域。本篇文章主要介绍了如何利用最小...

    基于32最小二乘法拟合曲线及求解方程程序

    综上所述,"基于32最小二乘法拟合曲线及求解方程程序"是一个结合了硬件控制、数据处理和数学建模的综合项目。它涉及到STM32的ADC操作、数据滤波、OLED显示、最小二乘法拟合以及线性方程求解等多个IT领域的知识点。...

    最小二乘法拟合_C语言_拟合_最小二乘法_

    在C语言中实现最小二乘法拟合,首先需要理解基本的数学原理。最小二乘法的目标是通过调整模型参数,使得所有数据点到模型曲线的垂直距离(即残差)的平方和最小。对于线性模型y = ax + b,我们可以通过求解以下矩阵...

    MATLAB求解非线性最小二乘法拟合问题 源程序代码.rar

    标题中的“MATLAB求解非线性最小二乘法拟合问题 源程序代码”指的是使用MATLAB编程实现非线性最小二乘法的算法。源代码通常包括函数定义、目标函数、约束条件以及优化过程的控制参数等,帮助用户理解并自定义非线性...

    最小二乘法拟合圆完整测试代码

    在提供的压缩包"VS2015_CV_Demo"中,我们可以期待找到一个Visual Studio 2015项目,包含示例代码来演示如何使用OpenCV进行最小二乘法拟合圆。项目可能包括以下部分: 1. **主程序**:入口点,可能包含用户界面,...

    最小二乘法拟合程序.

    在本场景中,我们讨论的是使用MATLAB编程语言实现的最小二乘法拟合程序。 MATLAB是一种强大的数值计算和数据可视化工具,它提供了丰富的函数库和用户界面(GUI)来处理各种数学问题,包括最小二乘法拟合。GUI(图形...

    MATLAB求解非线性最小二乘法拟合问题源程序代码.rar_forgottenbi9_最小二乘法拟合问题

    标题“MATLAB求解非线性最小二乘法拟合问题源程序代码.rar_forgottenbi9_最小二乘法拟合问题”表明这个压缩包包含的是一个MATLAB实现的非线性最小二乘法求解器源代码,可能用于拟合实验数据或模型。"forgottenbi9...

    最小二乘法拟合曲线的一个C++程序

    在给定的标题“最小二乘法拟合曲线的一个C++程序”中,我们可以理解这是一个使用C++编程语言实现的程序,它的目标是通过最小化误差平方和来拟合数据点的曲线模型。描述中提到该程序的功能可能不够完善,意味着它可能...

    python最小二乘法三维坐标拟合平面-最小二乘法拟合平面

    Python 最小二乘法三维坐标拟合平面 本资源主要讲述了使用 Python 实现最小二乘法三维坐标拟合平面的方法。该方法使用 OpenCV 库来实现平面拟合,通过对点云数据的处理和_singular value decomposition(SVD)来...

    PyQT实现的最小二乘法拟合曲线

    在Python中,我们可以使用NumPy和SciPy这两个科学计算库来执行最小二乘法拟合。首先,我们需要导入必要的库: ```python import numpy as np from scipy.optimize import curve_fit ``` 接下来,定义一个函数形式...

    C#+最小二乘法拟合二元多次曲线

    C#实现最小二乘法拟合的步骤如下: 1. **数据准备**:将数据点存储为一个二维数组或列表,每个元素包含(x1, x2, y)三部分。 2. **构建设计矩阵**:设计矩阵X是一个(n, n+m+1)的矩阵,其中每一行对应一个数据点,列...

    数字图像处理算法及原理(七):最小二乘法拟合圆.pdf

    数字图像处理算法及原理(七):最小二乘法拟合圆 在数字图像处理领域中,曲线拟合是一种常用的技术,以找到一组数据的最佳函数匹配。其中,最小二乘法是一种常用的数学优化技术,通过最小化误差的平方和找到一组...

    最小二乘法拟合原理及代码实现

    在拟合过程中,最小二乘法不要求拟合函数通过所有数据点,而是找到一个函数,使得数据点和函数之间差值的平方和最小。这种方法广泛应用于数据分析、统计建模、信号处理等领域。 根据最小二乘法定义,给定一组观测...

Global site tag (gtag.js) - Google Analytics