因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用。

/**

*

函数功能:最小二乘法曲线拟合

* @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} 处理.

*

Date:2007-12-25 16:21 PM

* @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;

}

/**

*

对X轴数据节点球平均值

* @param x 存储X轴节点的数组

*

Date:2007-12-25 20:21 PM

* @author qingbao-gao

* @return  平均值

*/

public static double ave(double []x)

{

double ave=0;

double sum=0;

if(x!=null)

{

for(int i=0;i

{

sum+=x[i];

}

System.out.println("sum-->"+sum);

ave=sum/x.length;

System.out.println("ave"+ave+"x.length"+x.length);

}

return ave;

}

/**

*

由X值获得Y值

* @param x  当前X轴输入值,即为预测的月份

* @param xx 当前X轴输入值的前X数据点

* @param a  存储多项式系数的数组

* @param m  存储多项式的最高次数的数组

*

Date:2007-12-25 PM 20:07

*

Author:qingbao-gao

* @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

{

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)throws DBException

{

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));

}

测试结果为:拟合-->72.38898870320554

效果还可以。

http://www.blogjava.net/1504/archive/2009/04/15/265869.html

最小二乘法曲线拟合 java_最小二乘法拟合java实现源程序(转)相关推荐

  1. 计算机最小二乘法拟合,数值计算_第6章 曲线拟合的最小二乘法.doc

    数值计算_第6章 曲线拟合的最小二乘法.doc 还剩 29页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 第 ...

  2. 曲线拟合最小二乘法对数c语言实现,数值计算_第6章曲线拟合的最小二乘法

    <数值计算_第6章曲线拟合的最小二乘法>由会员分享,可在线阅读,更多相关<数值计算_第6章曲线拟合的最小二乘法(23页珍藏版)>请在人人文库网上搜索. 1.第6章 曲线拟合的最 ...

  3. 《数值分析》李庆扬 03 曲线拟合的最小二乘法

    # 写于2021.01.05 # 教材<数值分析> 第五版 李庆扬 王能超 易大义 # 只总结了考试需要的内容:无加权的最小二乘的计算 # 总结不易 望赞鼓励 0 内容串联 1. 误差分析 ...

  4. 多项式曲线拟合之最小二乘法推导

    1.多项式曲线拟合之最小二乘法 1.1 问题来源 1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星.经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置.随后 ...

  5. matlab polyfit c语言,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 [复制链接] 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注 ...

  6. 4.6 曲线拟合的最小二乘法

    4.6.1 最小二乘问题的提法 学习目标: 要学习曲线拟合的最小二乘法,我会按照以下步骤进行: 理解最小二乘法的基本思想和原理,即在已知数据的情况下,通过拟合一条曲线,使得曲线与数据之间的误差最小化. ...

  7. matlab最小二乘法拟合参数,matlab最小二乘法的非线性参数拟合

    matlab最小二乘法的非线性参数拟合 首先说一下匿名函数:在创建匿名函数时,Matlab记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab不再进行搜索,而是立即执行该函数,极大提高了效率 ...

  8. 数值计算方法第五章—曲线拟合的最小二乘法

    曲线拟合的最小二乘法 本文参考书为马东升著<数值计算方法> 最小二乘法 与插值法的区别:只需"逼近" f(x)f(x)f(x) ,而不用满足插值原则(即经过插值节点) ...

  9. c语言平曲线,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注释,数学推导等 ...

最新文章

  1. 10行Python代码实现Web自动化管控
  2. CentOS下SVN服务的启动与关闭
  3. r语言和python-Python和R语言的区别_Python与R的区别和联系
  4. 如何看待 Apache Log4j 2 远程代码执行漏洞?
  5. spark sql定义RDD、DataFrame与DataSet
  6. You can't specify target table 'tablename' for update in FROM clause的解决方法
  7. CF 1635E Cars 二分图 + 拓扑
  8. 常见博客网站的robots.txt
  9. 凯恩帝k1000ti参数设置_KND1000TI系统参数
  10. 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?
  11. Prometheus 监控linux服务器
  12. 延庆区计算机学校,【基层链接】发展中的校园欢迎你——延庆五中现代化的教学专室与设备系列...
  13. 十六进制字符串转中文
  14. MacOS 下 TeXstudio 深色背景主题设置
  15. Unicode 和多字节字符集 (MBCS) 支持
  16. JavaScript----marquee滚动标签 图片无缝滚动 插入百度地图
  17. 安卓逆向学习笔记:native层开发、分析和调试基础
  18. 精选的8个小程序源码
  19. 新零售风口下品牌方如何玩转线下媒体,这四个维度或许告诉你答案
  20. mwb 还原 mysql,文件转换-.mwb到.sql文件

热门文章

  1. 泛微E-Cology SQL注入漏洞复现(QVD-2023-15672)
  2. Linux系统下载echarts,echarts图形展示
  3. Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——2.4 滤镜以及配套代码的制作方法
  4. 仿小皮手游网帝国CMS模板源码 大型手游门户网站系统源码+手机版+火车头采集
  5. BZOJ 1178 APIO 2009 会议中心
  6. H264 数据提取sps 和 pps 信息
  7. 10036.简评多媒体协议H.323和SIP
  8. python日记Day18——Pandas之Excel绘图
  9. 传媒公司官方网站设计
  10. Jmeter接口测试实战(一):Jmeter将测试结果写入到Excel中