import java.util.Scanner;

public class Least_square_fit {

    public static double Least_square_method(int n,int m,double X[],double Y[],double A[],double err[],double sum[],double my_sum,double bel[],double alp[]){
double S1[]=new double[m+1];//S1存放前一次多项式的值,范围为S1[0]~S1[m]
double S0[]=new double[m+1];//S0存放前两次多项式的值,范围为S0[0]~S0[m]
double SS[]=new double[m+1];//用于交换
double AU=0,AL=0,alp_L=0,alp_U=0,bel_U=0,bel_L=0;//AU为计算A的分子,AL为计算A的分母,alp_L、alp_U分别为计算alpha的分母和分子,alp_L_bel为计算belta的分母
double sum_temp[]=new double[m+1];///////////
double error=0;//误差的平方和
my_sum=0;
double my_sumtemp=0;
boolean flag=true;
/*计算A[0],alp[1]*/
for(int i=0;i<=m;i++)
{
AU+=Y[i];
AL++;
alp_L++;
alp_U+=X[i];
S0[i]=1;
}
A[0]=AU/AL;
bel_L=AL;
alp[1]=alp_U/alp_L;
my_sum+=A[0]*1;
for(int i=0;i<=m;i++){
sum[i]+=A[0]*1;//////////////////
} /*计算A[1],alp[2],bel[1]*/
AU=0;AL=0;alp_L=0;alp_U=0;bel_U=0;//变量清零
double temp=0;
for(int i=0;i<=m;i++)
{
temp=(X[i]-alp[1]);
S1[i]=temp;
AU+=Y[i]*temp;
AL+=temp*temp;
alp_U+=X[i]*temp*temp;
}
alp_L=AL;
A[1]=AU/AL;
alp[2]=alp_U/alp_L;
bel_U=AL;
bel[1]=bel_U/bel_L;
my_sum+=A[1]*(X[1]-alp[1]);
for(int i=0;i<=m;i++){
sum[i]+=A[1]*(X[i]-alp[1]);///////////
} /*递推计算A[2]~A[n-1],alp[3]~alp[n],bel[2]~bel[n-1]*/
for(int j=3;j<=n;j++){
AU=0;AL=0;alp_L=0;alp_U=0;bel_U=0;bel_L=0;//每次计算变量清零
for(int ii=0;ii<=m;ii++){
SS[ii]=S1[ii];
}
for(int i=0;i<=m;i++){
sum_temp[i]=(X[i]-alp[j-1])*S1[0]-bel[j-2]*S0[0];///////////////////
}
for(int i=0;i<=m;i++){
if(flag){
my_sumtemp=(X[1]-alp[j-1])*S1[0]-bel[j-2]*S0[0];
} bel_L=bel_L+S1[i]*S1[i];
S1[i]=(X[i]-alp[j-1])*S1[i]-bel[j-2]*S0[i];
alp_L=alp_L+S1[i]*S1[i];
alp_U=alp_U+X[i]*S1[i]*S1[i];
S0[i]=SS[i];
AU=AU+Y[i]*S1[i];
flag=false;
}
flag=true;
bel_U=alp_L;
AL=alp_L;
alp[j]=alp_U/alp_L;
bel[j-1]=bel_U/bel_L;
A[j-1]=AU/AL;
my_sum+=A[j-1]*my_sumtemp;
for(int i=0;i<=m;i++)
{
sum[i]+=A[j-1]*sum_temp[i];
} }
/*计算A[n]*/
AU=0;AL=0;alp_L=0;alp_U=0;bel_U=0;bel_L=0;//变量清零
for(int ii=0;ii<=m;ii++){
SS[ii]=S1[ii];
}
flag=true;
for(int i=0;i<=m;i++){
sum_temp[i]=(X[i]-alp[n])*S1[0]-bel[n-1]*S0[0];
}
for(int i=0;i<=m;i++){
if(flag){
my_sumtemp=(X[1]-alp[n])*S1[0]-bel[n-1]*S0[0];
} S1[i]=(X[i]-alp[n])*S1[i]-bel[n-1]*S0[i];
AL=AL+S1[i]*S1[i];
S0[i]=SS[i];
AU=AU+Y[i]*S1[i];
flag=false;
}
A[n]=AU/AL;
my_sum+=A[n]*my_sumtemp;
for(int i=0;i<=m;i++){
sum[i]+=A[n]*sum_temp[i];
} /*返回误差的平方和*/
for(int i=0;i<=m;i++)
{
err[i]=sum[i]-Y[i];
error+=err[i]*err[i];
} return error;
} public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("输入多项式次数:");
int n=scan.nextInt();
System.out.println("输入数据点个数:");
int mm=scan.nextInt();
int m=mm-1;//为方便观察使用m
double bel[]=new double[n];//系数belta从bel[1]~bel[n-1]
double alp[]=new double[n+1];//系数alpha从alpha[1]~alpha[n]
double X[]=new double[m+1];//X存放mm个数据点横坐标值,范围为X[0]~X[m]
double Y[]=new double[m+1];//Y存放mm个数据点纵坐标值,范围为Y[0]~Y[m]
double A[]=new double[n+1];//A存放多项式系数,范围A[0]~A[n]
double error;//误差平方和
double err[]=new double[m+1];//记录个点误差
double sum[]=new double[m+1];//记录个点拟合值
double my_sum=0; System.out.println("输入X:");
for(int i=0;i<=m;i++){
X[i]=scan.nextDouble();
}
System.out.println("输入Y:");
for(int i=0;i<=m;i++){
Y[i]=scan.nextDouble();
} error=Least_square_method(n, m, X, Y,A,err,sum,my_sum,bel,alp);
System.out.println("多项式系数分别为:");//输出多项式系数
for(int i=0;i<=n;i++){
System.out.print("A["+i+"]="+A[i]+" ");
}
System.out.println();
System.out.println("alpha为:");//输出系数alpha
for(int i=1;i<=n;i++){
System.out.print("alp["+i+"]="+alp[i]+" ");
}
System.out.println();
System.out.println("belta为:");//输出系数belta
for(int i=1;i<=n-1;i++){
System.out.print("bel["+i+"]="+bel[i]+" ");
}
System.out.println(); /*输出误差相关*/
System.out.println("各点拟合值为:");
for(int i=0;i<=m;i++)
{
System.out.println(sum[i]+" ");
}
System.out.println();
System.out.println("各点误差为:");
for(int i=1;i<=m;i++){
System.out.print(err[i]+" ");
}
System.out.println();
System.out.println("误差平方和为:");
System.out.println(error); System.out.println("my_Sum:"+my_sum); } }

http://www.oschina.net/code/snippet_574827_43214

用正交多项式作最小二乘拟合的java实现(转)的更多相关文章

  1. 最小二乘拟合(转)good

    在物理实验中经常要观测两个有函数关系的物理量.根据两个量的许多组观测数据来确定它们的函数曲线,这就是实验数据处理中的曲线拟合问题.这类问题通常有两种情况:一种是两个观测量x与y之间的函数形式已知,但一 ...

  2. python 最小二乘拟合,反卷积,卡方检验

    import numpy as np # from enthought.mayavi import mlab ''' ogrid[-1:5:6j,-1:5:6j] [array([[-1. ], [ ...

  3. OpenCV 最小二乘拟合方法求取直线倾角

    工业相机拍摄的图像中,由于摄像质量的限制,图像中的直线经过处理后,会表现出比较严重的锯齿.在这种情况下求取直线的倾角(其实就是直线的斜率),如果是直接选取直线的开始点和结束点来计算,或是用opencv ...

  4. halcon之最小二乘拟合直线

    如果不了解最小二乘算法 请先阅读: Least squares的算法细节原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中拟合直线会用ho ...

  5. 非线性函数的最小二乘拟合及在Jupyter notebook中输入公式 [原创]

    突然有个想法,能否通过学习一阶RC电路的阶跃响应得到RC电路的结构特征——时间常数τ(即R*C).回答无疑是肯定的,但问题是怎样通过最小二乘法.正规方程,以更多的采样点数来降低信号采集噪声对τ估计值的 ...

  6. 最小二乘拟合(scipy实现)

    Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数.如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等. 如下理解通过Scipy进行最小二乘法拟合运算 最小二乘拟合 ...

  7. 最小二乘法多项式拟合的Java实现

    背景 由项目中需要根据一些已有数据学习出一个y=ax+b的一元二项式,给定了x,y的一些样本数据,通过梯度下降或最小二乘法做多项式拟合得到a.b,解决该问题时,首先想到的是通过spark mllib去 ...

  8. 用python的numpy作线性拟合、多项式拟合、对数拟合

    转自:http://blog.itpub.net/12199764/viewspace-1743145/ 项目中有涉及趋势预测的工作,整理一下这3种拟合方法:1.线性拟合-使用mathimport m ...

  9. 数值分析实验之曲线最小二乘拟合含有噪声扰动(python实现)

    一.实验目的 掌握最小二乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线目前待实现功能: 1. 最小二乘法的基本实现. 2. 用不同数据量,不同参数,不同的多 ...

随机推荐

  1. 嗨翻C语言

    <嗨翻C语言> 基本信息 作者: (美)David Griffiths    Dawn Griffiths    译者: 程亦超 出版社:人民邮电出版社 ISBN:978711531884 ...

  2. 面对多个互斥量的加锁策略:"试加锁-回退"算法/固定加锁层次

    有时一个互斥量是不够的: 比如: 当多个线程同时访问一个队列结构时,你需要2个互斥量,一个用来保护队列头,一个用来保护队列元素内的数据. 当为多线程建立一个树结构时,你可能需要为每个节点设置一个互斥量 ...

  3. WPF自定义圆形按钮样式资源文件

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...

  4. 关于Opencv2.4.x中stitcher类的简单应用

    1.opencv2.4以上版本有stitcher类,可以简单方便的实现图像的拼接,目前只是简单的测试一下stitcher类的拼接功能,也是纠结了好长时间,最终发现是要在链接库中加上opencv_sti ...

  5. CF 553A 组合DP

    http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...

  6. SQLServer2012 分页语句执行分析

    上一篇文章提到了,SQLServer2012在使用Offset,Fetch语句分页时,获取了大量不需要的数据,导致查询效率低的问题. 现在让我们来看看,究竟是什么导致SQLServer不能按需取数呢? ...

  7. Linux 命令 快捷命令综合

    FTP开机启动 启动要让FTP每次开机自动启动,运行命令:  chkconfig --level 35 vsftpd on linux 关机 1.halt linux 注销 1.logout linu ...

  8. 二叉树的建立与遍历(山东理工OJ)

    题目描写叙述 已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(当中逗号表示空节点).请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度. 输入 输入一个长度 ...

  9. 2012天津C题

    行李箱上的密码锁大家都知道, 现在给我们长度为n(n<=1000)的两个密码串,每次可以转动连续的1->3个字符1格,问最少多少次可以使得第一个串变成第二个串 经历了搜索,贪心,的思路后, ...

  10. Javascript语言精粹之正则表达式知识整理

    Javascript语言精粹之正则表达式知识整理 1.正则表达式思维导图 2.正则表达式常用示例 2.1 移除所有标签,只留下innerText var html = "<p>& ...