用最小二乘法拟合任意次函数曲线(C#)

el/2024/7/13 12:03:04

///<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://www.ngui.cc/el/5545750.html

相关文章

C#操作快捷方式(获取快捷方式属性、创建快捷方式)

第一步 创建一个项目 无需废话&#xff0c;跳过。 第二步 引用COM组件 右键“引用”&#xff0c;“添加引用”&#xff0c;选择“COM组件”&#xff0c;找到“Windows Script Host Object Model”&#xff0c;然后确定。 第三步 编写创建快捷方式的代码 1 // 声明操作对…

让使用SQLite的.NET应用自适应32位/64位系统

Windows 7 64 bit(刚扩到4G内存,果断换64位的,那速度杠杠的) Microsoft Visual Studio 2010 Ultimate 32bit(在64位系统里运行正常) sqlite-netFx40-setup-bundle-x64-2010-1.0.90.0 首先要先下载SQLite的开发环境安装包(我是这么理解的,貌似只搞到System.Data.SQLite.dll这个文…

C#使用DataContractJsonSerializer来进行JSON解析

在使用DataContractJsonSerializer进行解析之前&#xff0c;我们首先需要将两个包引入进来&#xff1a; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; 接下来需要新建一个class&#xff0c;DataContractJsonSerializer可以将JSON字符串转化…

QT操作sqlite概念

SQLite数据库 增、删、改、查 1. 数据库简介 数据库指的是以一定方式存储在一起&#xff0c;能为多个用户共享&#xff0c;具有尽可能小的冗余度的特点&#xff0c;是与应用程序彼此独立的数据集合。 // 一定方式&#xff1a;可以理解为策略、算法 // 网盘相同的文件是以 MD…

QT中全局变量的定义和使用

多的就不说了&#xff0c;本来就是一个简单地内容&#xff0c;只是不会的话会很头疼 我们首先新建两个文件&#xff0c;文件名可以自定义&#xff0c;我们在这里定义为variate.h 和 variate.cpp 当然了&#xff0c;后缀是不能变的。 和函数一样&#xff0c;我们在variate.h中…

C语言中指针动态内存的申请和释放

什么是动态内存的申请和释放&#xff1f; 当程序运行到需要一个动态变量时&#xff0c;需要向系统的堆中申请一块内存&#xff0c;用来存储这块变量&#xff0c;这就是内存的申请。当程序不需要这个变量时&#xff0c;就需要把申请的这块内存释放掉&#xff0c;这就是内存的释放…

Qt中QPainter基本绘图

QWidget 派系的只能在paintEvent中进行重绘&#xff1b;如果你想要很好的交互功能的话推荐QGraphicsView框架&#xff0c;自定义Item的绘制在paint函数&#xff1b;如果你想利用线程绘制的话&#xff0c;你可以创建个QPixmap或者QImage&#xff0c;然后在把图片当画布在线程中绘…

QSqlQuery类操作SQLite(创建、查询、删除、修改)详解

Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作。这里我们所说的“平台 独立”&#xff0c;既包括操作系统平台&#xff0c;也包括各个数据库平台,Qt支持以下几种数据库: QT自带SQLITE数据库,不需要再安装QTDS在Qt4.7起已经被移除 1.QtSql 要使用QtSql 模块的话…

三极管工作原理图解,快速了解三极管结构和工作原理

了解三极管工作原理前&#xff0c;先看一张三极管内部结构原理图&#xff1b;从图中可以清晰的看出NPN和PNP内部结构的区别。 三极管NPN型和PNP型的工作原理&#xff1a; NPN三极管&#xff1a; Vb<Ve &#xff08;截止状态&#xff09; Vc>Vb>Ve&#xff08;放大…

C#图片保存与读取,以及图片另存操作

照片的保存与读取 /// <summary>/// 图片转二进制/// </summary>/// <param name"imgPhoto">图片对象</param>/// <returns>二进制</returns>public static byte[] PhotoImageInsert(System.Drawing.Image imgPhoto){//将Image转…