最小二乘法曲线拟合 java_最小二乘法拟合java实现源程序(转)
因为我所在的项目要用到最小二乘法拟合,所有我抽时间将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实现源程序(转)相关推荐
- 计算机最小二乘法拟合,数值计算_第6章 曲线拟合的最小二乘法.doc
数值计算_第6章 曲线拟合的最小二乘法.doc 还剩 29页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 第 ...
- 曲线拟合最小二乘法对数c语言实现,数值计算_第6章曲线拟合的最小二乘法
<数值计算_第6章曲线拟合的最小二乘法>由会员分享,可在线阅读,更多相关<数值计算_第6章曲线拟合的最小二乘法(23页珍藏版)>请在人人文库网上搜索. 1.第6章 曲线拟合的最 ...
- 《数值分析》李庆扬 03 曲线拟合的最小二乘法
# 写于2021.01.05 # 教材<数值分析> 第五版 李庆扬 王能超 易大义 # 只总结了考试需要的内容:无加权的最小二乘的计算 # 总结不易 望赞鼓励 0 内容串联 1. 误差分析 ...
- 多项式曲线拟合之最小二乘法推导
1.多项式曲线拟合之最小二乘法 1.1 问题来源 1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星.经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置.随后 ...
- matlab polyfit c语言,算法——纯C语言最小二乘法曲线拟合
算法--纯C语言最小二乘法曲线拟合 [复制链接] 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注 ...
- 4.6 曲线拟合的最小二乘法
4.6.1 最小二乘问题的提法 学习目标: 要学习曲线拟合的最小二乘法,我会按照以下步骤进行: 理解最小二乘法的基本思想和原理,即在已知数据的情况下,通过拟合一条曲线,使得曲线与数据之间的误差最小化. ...
- matlab最小二乘法拟合参数,matlab最小二乘法的非线性参数拟合
matlab最小二乘法的非线性参数拟合 首先说一下匿名函数:在创建匿名函数时,Matlab记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab不再进行搜索,而是立即执行该函数,极大提高了效率 ...
- 数值计算方法第五章—曲线拟合的最小二乘法
曲线拟合的最小二乘法 本文参考书为马东升著<数值计算方法> 最小二乘法 与插值法的区别:只需"逼近" f(x)f(x)f(x) ,而不用满足插值原则(即经过插值节点) ...
- c语言平曲线,算法——纯C语言最小二乘法曲线拟合
算法--纯C语言最小二乘法曲线拟合 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注释,数学推导等 ...
最新文章
- 10行Python代码实现Web自动化管控
- CentOS下SVN服务的启动与关闭
- r语言和python-Python和R语言的区别_Python与R的区别和联系
- 如何看待 Apache Log4j 2 远程代码执行漏洞?
- spark sql定义RDD、DataFrame与DataSet
- You can't specify target table 'tablename' for update in FROM clause的解决方法
- CF 1635E Cars 二分图 + 拓扑
- 常见博客网站的robots.txt
- 凯恩帝k1000ti参数设置_KND1000TI系统参数
- 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?
- Prometheus 监控linux服务器
- 延庆区计算机学校,【基层链接】发展中的校园欢迎你——延庆五中现代化的教学专室与设备系列...
- 十六进制字符串转中文
- MacOS 下 TeXstudio 深色背景主题设置
- Unicode 和多字节字符集 (MBCS) 支持
- JavaScript----marquee滚动标签 图片无缝滚动 插入百度地图
- 安卓逆向学习笔记:native层开发、分析和调试基础
- 精选的8个小程序源码
- 新零售风口下品牌方如何玩转线下媒体,这四个维度或许告诉你答案
- mwb 还原 mysql,文件转换-.mwb到.sql文件
热门文章
- 泛微E-Cology SQL注入漏洞复现(QVD-2023-15672)
- Linux系统下载echarts,echarts图形展示
- Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——2.4 滤镜以及配套代码的制作方法
- 仿小皮手游网帝国CMS模板源码 大型手游门户网站系统源码+手机版+火车头采集
- BZOJ 1178 APIO 2009 会议中心
- H264 数据提取sps 和 pps 信息
- 10036.简评多媒体协议H.323和SIP
- python日记Day18——Pandas之Excel绘图
- 传媒公司官方网站设计
- Jmeter接口测试实战(一):Jmeter将测试结果写入到Excel中