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

简介: 原文:利用最小二乘法拟合任意次函数曲线(C#) ///     ///用最小二乘法拟合二元多次曲线     ///     ///已知点的x坐标集合     ///已知点的y坐标集合     ///已知点的个数     ///方程的最高次数     ...
原文: 利用最小二乘法拟合任意次函数曲线(C#)

///<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

 

剩下的就不用写了吧

目录
相关文章
|
12月前
|
JavaScript 前端开发 Java
javascript实现像java、c#之类的sleep暂停的函数功能
javascript实现像java、c#之类的sleep暂停的函数功能
64 0
|
4天前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
5月前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
32 0
|
6月前
|
存储 C#
C#基础语法(数组和函数)
C#基础语法(数组和函数)
62 1
|
6月前
|
运维 编译器 C#
C# 9.0中的本地函数属性:深化函数级别的控制
【1月更文挑战第17天】C# 9.0引入了本地函数属性的概念,允许开发者在本地函数上应用属性,从而进一步细化对函数行为的控制。这一新特性不仅增强了代码的可读性和可维护性,还为函数级别的编程提供了更多的灵活性。本文将探讨C# 9.0中本地函数属性的用法、优势以及可能的应用场景,帮助读者更好地理解并应用这一新功能。
C#基础之Main函数
C#基础之Main函数
85 0
|
传感器 编解码 监控
Baumer工业相机堡盟工业相机如何通过BGAPISDK里的工具函数来计算工业相机的实时帧率(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK里的工具函数来计算工业相机的实时帧率(C#)
69 0
|
C#
C#中方法函数的声明和调用
C#中方法函数的声明和调用
164 0
C#基础⑧——方法(函数、重载、out、ref)
比喻成职能。比喻成一个生产自行车老板,一个地方专门放螺丝,一个地方专门放轮,一个地方专门放车链子,需要组装什么就从那个仓库里面拿就行了。各司其职。