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. POJ 2365 Rope(水题)

    [题意简述]:给出我们钉子个数与半径,让我们求出缠绕在钉子上的绳子有多长. [分析]:从题目中我们能够看出,绳子长度的和等于每两个钉子的距离的和加上接触在钉子上的绳子的长度,不难发现这部分长度事实上就 ...

  2. windows 2003 自动安全设置

    @echo offecho.echo.echo.echo 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓echo.echo.echo windows 2003 自动安全设置程序 echo. ec ...

  3. 传京东副总裁蒉莺春或将接管POP业务-搜狐IT

    传京东副总裁蒉莺春或将接管POP业务-搜狐IT 传京东副总裁蒉莺春或将接管POP业务

  4. poj3295 Tautology , 计算表达式的值

    给你一个表达式,其包括一些0,1变量和一些逻辑运算法,让你推断其是否为永真式. 计算表达式的经常使用两种方法:1.递归: 2.利用栈. code(递归实现) #include <cstdio&g ...

  5. leetcode 之 Permutation Sequence

    Permutation Sequence The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and ...

  6. spring原拦截器配置与新命名空间mvc:interceptors配置拦截器对照与注意事项

    原先,我们是这么配置拦截器的 <bean id="openSessionInViewInterceptor"class="org.springframework.o ...

  7. java 处理时间的各种方式——获取时间——时间格式化

    TimeUtil.java package com.snow; import java.text.DateFormat; import java.text.ParseException; import ...

  8. 2012Android开发热门资料(110个)

    下载中心完整附件下载地址:http://down.51cto.com/data/412494 附件内容部分预览: 专题推荐: Android控:平板电脑HD精品游戏软件合集(共32个) http:// ...

  9. U11认识与学习bash

    1.使用命令clear来清除界面. 2.命令别名设置alias和unalias: 例如: alias lm='ls -l | more' 查看当前的别名设置有哪些: alias unalias lm ...

  10. Android Graphics专题(1)--- Canvas基础

    作为Android Graphics专题的开篇.毫无疑问,我们将讨论Android UI技术的核心概念--Canvas. Canvas是Android UI框架的基础,在Android的控件体系中.全 ...