原文:利用最小二乘法拟合任意次函数曲线(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. GeoTiff如何存储颜色表的研究

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在一次偶然的机会中得知tiff图像时可以存诸颜色表的,心想以后用GeoTiff来保存图像分类图像就十分方便了.于是研究 ...

  2. SSH连接Linux的Server超时

    SSH连接Linux的Server超时 http://blog.csdn.net/cheng830306/article/details/21796865

  3. Annotation研究的一些学习资料

    转自chanyinhelv原文Annotation研究的一些学习资料 下面是我最近对Annotation研究的一些学习资料,收集于此,供大家学习之用. 一.Annotation要素类介绍 在GeoDa ...

  4. 创建、删除swap分区

    创建 dd if=/dev/zero of=/data/swap bs=1M count=4000 mkswap  /data/swap  swapon   /data/swap  chmod 060 ...

  5. POJ 3252 Round Numbers(数位dp&amp;记忆化搜索)

    题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...

  6. 常用JS验证函数总结

    JS验证Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/- ...

  7. [React] Pass Data To Event Handlers with Partial Function Application

    In this lesson we’ll see how to pass an item’s id value in an event handler and get the state to ref ...

  8. 小强的HTML5移动开发之路(40)——jqMobi中实践header定义的几种方式

    一.定义全局的header 这个header是所有panel默认的header,需要在<div id="afui">内部,也就是和<div id="co ...

  9. 【9005】最短网络agrinet

    Time Limit: 1 second Memory Limit: 256 MB 问题描述 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的 ...

  10. js获取input file路径改变图像地址

    版权声明:好歹是我写的或者总结的或者抄的,总待给我个名份吧~ https://blog.csdn.net/sangjinchao/article/details/52250318 html代码 < ...