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

简介: import java.util.Scanner; public class Least_square_fit { public static double Least_square_method(int n,int m,double X[],doub...
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
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
556 0
|
分布式计算 Java Hadoop
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
301 0
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
922 0
JAVA 实现上传图片添加水印(详细版)(上)
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
373 0
Java实现图书管理系统
|
Java Windows Spring
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
474 0
|
数据可视化 Java
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
456 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
数据可视化 Java 容器
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
263 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
|
Java
Java实现拼图小游戏(7)—— 作弊码和判断胜利
当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
238 0
Java实现拼图小游戏(7)—— 作弊码和判断胜利
|
Java
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
174 0