原文:利用最小二乘法拟合任意次函数曲线(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

剩下的就不用写了吧

利用最小二乘法拟合任意次函数曲线(C#)的更多相关文章

  1. 最小二乘法拟合java实现源程序(转)

    因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...

  2. tkinter内嵌Matplotlib系列(二)之函数曲线绘制

    目录 目录 前言 (一)对matplotlib画布的封装: (二)思路分析: 1.需求说明: 2.框架的设置: 3.文件说明: (三)各文件的源代码 1.main.py 2.widget.py 3.f ...

  3. matlab-非线性方程求根函数及函数曲线绘制

    Matlab中提供了很多求解非线性方程(y=f(x))的函数,刚開始使用,真的很困惑.全部.这里依据matlab的help文档对这些函数做一些小小的总结 fsolve函数 用来求解非线性方程组:F(x ...

  4. 简单而粗暴的方法画任意阶数Bezier曲线

    简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...

  5. 利用arguments求任意数量数字的和/最大值/最小值

    文章地址 https://www.cnblogs.com/sandraryan/ arguments是函数内的临时数据,用完销毁,有类似于数组的操作,但不是数组. 举个栗子1:利用arguments求 ...

  6. Flex中如何利用FocusManager类的setFocus函数设置TextInput的焦点的例子

    参考:https://blog.csdn.net/liruizhuang/article/details/5876455 <?xml version="1.0" encodi ...

  7. 【matlab】绘制双三次插值函数曲线

    想要的效果: 编程时要用到分段函数曲线的绘制方法:..+.*(分段条件). 需要注意的是:函数表达式中的乘除和乘方都要加“.”.因为一般的函数都是数在乘变量运算. x=-:; a=-0.5; w=ab ...

  8. Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数

    Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数: select trunc(1.23856789,2) from dual round(m,n) 可以四舍五入 trunc ...

  9. 利用jquery的淡入淡出函数(fadeIn和fadeOut)--实现轮播

    首先说下,我在网上找的例子全是用的UL 实现,其实大可不必,只要是能包含img标签的HTML标签都可以做轮播效果.利用jquery的淡入淡出函数(fadeIn和fadeOut).废话也不多说,边上代码 ...

随机推荐

  1. USB 3.0规范中译本 第10章 集线器,主机下行口以及设备上行口规范

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章描述USB 3.0 集线器的体系结构要求.本章还描述主机下行口和集线器下行口之间功能性的不同之处,以及设 ...

  2. C#人脸识别

    C#百度人脸识别 最近看到一只我家徒儿发来的链接,原来是一堆百度AI的SDK,于是一时兴起就做了一只人脸识别,喵喵喵(●'◡'●) 一.准备工作 首先,当然是下载SDK啦:http://ai.baid ...

  3. 【54.38%】【BZOJ 4300】绝世好题

    Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1120  Solved: 609 [Submit][Status][Discuss] Descript ...

  4. C#趣味程序---个位数为6,且能被3整出的五位数

    using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int ...

  5. 20171028洛谷NOIP模拟

    传送门 题目分析: A:对一个初始值全部为0的序列进行一系列的区间修改(加)和询问(某一区间中满足\(min \le a_i * i \% mod \le max\)的元素个数). 第一眼看第一题怎么 ...

  6. 每天一个JavaScript实例-检測表单数据

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. ssh远程无法连接VM中的Ubuntu问题

    Ubuntu ssh远程无法连接问题 1. 检查sudo ps -e|grep ssh  查看是否有ssh进程服务,如果没有的话,需要下载安装  sudo apt-get install openss ...

  8. 使用RpcLite构建SOA/Web服务(Full .Net Framework)

    使用RpcLite构建SOA/Web服务(Full .Net Framework) SOA框架系列 1. 使用RpcLite构建SOA/Web服务 2. 使用RpcLite构建SOA/Web服务(Fu ...

  9. java常用api2

    calendar calendar=calendar.getInstance(); StringBuilder和C#的用法一样 hashSet无序的,不可重复 LInkedHashSet有序的,不可重 ...

  10. java做微信支付notify_url异步通知服务端的写法

    最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...