博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用最小二乘法拟合任意次函数曲线(C#)
阅读量:4302 次
发布时间:2019-05-27

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

///<summary>

   ///用最小二乘法拟合二元多次曲线
   ///</summary>
   ///<param name="arrX">已知点的x坐标集合</param>
   ///<param name="arrY">已知点的y坐标集合</param>
   ///<param name="length">已知点的个数</param>
   ///<param name="dimension">方程的最高次数</param>
   
    public static double[] MultiLine(double[] arrX, double[] arrY, int length, int dimension)//二元多次线性方程拟合曲线
    {
       int n = dimension + 1;                 //dimension次方程需要求 dimension+1个 系数
       double[,] Guass=new double[n,n+1];     //高斯矩阵 例如:y=a0+a1*x+a2*x*x
       for(int i=0;i<n;i++)
       {
           int j;
           for(j=0;j<n;j++)
           {
               Guass[i,j] = SumArr(arrX, j + i, length);
           }
           Guass[i,j] = SumArr(arrX,i,arrY,1,length);          
       }

      return ComputGauss(Guass,n);

    }

    public static double SumArr(double[] arr, int n, int length) //求数组的元素的n次方的和

    {
       double s = 0;
       for (int i = 0; i < length; i++)
       {
           if (arr[i] != 0 || n != 0)         
               s = s + Math.Pow(arr[i], n);
           else
               s = s + 1;
       }
       return s;
    }
    public static double SumArr(double[] arr1, int n1, double[] arr2, int n2, int length)
    {
       double s=0;
       for (int i = 0; i < length; i++)
       {
           if ((arr1[i] != 0 || n1 != 0) && (arr2[i] != 0 || n2 != 0))
               s = s + Math.Pow(arr1[i], n1) * Math.Pow(arr2[i], n2);
           else
               s = s + 1;
       }
       return s;
 
    }

    public static double[] ComputGauss(double[,] Guass,int n)

    {
       int i, j;
       int k,m;
       double temp;
       double max;
       double s;
       double[] x = new double[n];

       for (i = 0; i < n; i++)          x[i] = 0.0;//初始化

       

       for (j = 0; j < n; j++)

       {
           max = 0;         

           k = j;    

           for (i = j; i < n; i++)
           {
               if (Math.Abs(Guass[i, j]) > max)
               {
                   max = Guass[i, j];
                   k = i;
               }
           }

           
           if (k != j)
           {
               for (m = j; m < n + 1; m++)
               {
                   temp = Guass[j, m];
                   Guass[j, m] = Guass[k, m];
                   Guass[k, m] = temp;

               }

           }

           if (0 == max)

           {
               // "此线性方程为奇异线性方程" 

               return x;

           }

           

           for (i = j + 1; i < n; i++) 
           {

               s = Guass[i, j];

               for (m = j; m < n + 1; m++)
               {
                   Guass[i, m] = Guass[i, m] - Guass[j, m] * s / (Guass[j, j]);

               }

           }

       }//结束for (j=0;j<n;j++)

       

       for (i = n-1; i >= 0; i--)
       {           
           s = 0;
           for (j = i + 1; j < n; j++)
           {
               s = s + Guass[i,j] * x[j];
           }

           x[i] = (Guass[i,n] - s) / Guass[i,i];

       }

      return x;

   }//返回值是函数的系数

例如:y=a0+a1*x 返回值则为a0 a1

例如:y=a0+a1*x+a2*x*x 返回值则为a0 a1 a2

转载地址:http://wklws.baihongyu.com/

你可能感兴趣的文章
Nginx
查看>>
Navicat远程连接云主机数据库
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Mysql出现Table 'performance_schema.session_status' doesn't exist
查看>>
MySQL innert join、left join、right join等理解
查看>>
vivado模块封装ip/edf
查看>>
sdc时序约束
查看>>
Xilinx Jtag Access/svf文件/BSCANE2
查看>>
NoC片上网络
查看>>
开源SoC整理
查看>>
【2020-3-21】Mac安装Homebrew慢,解决办法
查看>>
influxdb 命令行输出时间为 yyyy-MM-dd HH:mm:ss(年月日时分秒)的方法
查看>>
已知子网掩码,确定ip地址范围
查看>>
判断时间或者数字是否连续
查看>>
docker-daemon.json各配置详解
查看>>
Mac 下docker路径 /var/lib/docker不存在问题
查看>>
Docker(一)使用阿里云容器镜像服务
查看>>
Docker(二) 基础命令
查看>>
Docker(三) 构建镜像
查看>>
Spring 全家桶注解一览
查看>>