博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用正交多项式作最小二乘拟合的java实现(转)
阅读量:6879 次
发布时间:2019-06-27

本文共 5656 字,大约阅读时间需要 18 分钟。

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

转载于:https://www.cnblogs.com/softidea/p/5225175.html

你可能感兴趣的文章
oracle数据库存储过程中NO_DATA_FOUND不起作用解决
查看>>
软件缺陷分析-软件测试之犯罪心理学
查看>>
Python实战之自己主动化评论
查看>>
spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
查看>>
iOS面试题合集(77道)
查看>>
hadoop安装及配置入门篇
查看>>
[原] KVM 虚拟化原理探究(2)— QEMU启动过程
查看>>
使用Java程序调用MatLab
查看>>
什么是C++虚函数、虚函数的作用和使用方法
查看>>
Atitit.cto 与技术总监的区别
查看>>
关于【自证清白】
查看>>
手把手教你crontab排障
查看>>
订单编号
查看>>
纪念我曾经的 JAVA 姿势--转
查看>>
js 如何清除setinterval
查看>>
我为NET狂官方面试题-数据库篇答案
查看>>
玩转iOS开发:iOS开发中的装逼技术 - RunTime(一)
查看>>
CSS实现水平垂直居中的1010种方式(史上最全)
查看>>
BCH曼谷矿工会议的积极方面:社区彼此更加了解
查看>>
Android之观察者模式
查看>>