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. HDU4344(大数分解)

    题目:Mark the Rope 题意就是给一个数,然后求这个数的所有因子中组成的最大的一个子集,其中1和本身除外,使得在这个子集中元素两两互素,求最大子集的元素个 数,并且求出和最大的值. 找规律就 ...

  2. AMDU恢复ASM磁盘组数据(測)

    --umount ASMCMD> umoung -a asmdg commands:         md_backup, md_restor         lsattr, setattr   ...

  3. plist文件读写

    - (void)viewDidLoad { [super viewDidLoad]; NSDictionary *dictionary1 = [NSDictionary dictionaryWithO ...

  4. Oracle自增列创建方法

    最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同. Oracle没有自增字段这样的功能,但是通过触发器( ...

  5. java 类 及其 执行过程

    java 类 命名 java类文件中  只能有一个公开类  且 公开类类名与当前类文件的文件名一致 方法如果使用了static修饰,那么此方法是类方法,可以 类名.方法名 使用. 你的main方法在同 ...

  6. asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件

    原文:asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功.请重试. Login控件 现象1.asp.net使用自定义sql server身份验证数据库,在A机器新增用户A,可以登录成 ...

  7. Wooden Sticks(杭州电1051)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  8. Hive综合HBase——经Hive阅读/书写 HBase桌子

    社论: 本文将Hive与HBase整合在一起,使Hive能够读取HBase中的数据,让Hadoop生态系统中最为经常使用的两大框架互相结合.相得益彰. watermark/2/text/aHR0cDo ...

  9. 两种Data Table参数化设置的区别

    首先介绍Data Table的语法: 1.DataTable.value(ParameterID, SheetID) 2.DataTable(ParameterID, SheetID) 以上2种方法的 ...

  10. 使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响?

    使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响? 1.问题:各操作间或者性能上会不会有影响? 如果有该如何解决? 多用户操作的影响主要是回锁定记录,oracl ...