原文:利用最小二乘法拟合任意次函数曲线(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. Navigation Pane不能设置显示标题

    https://msdn.microsoft.com/VBA/Word-VBA/articles/view-showheading-method-word https://social.msdn.mi ...

  2. eclipse jdt

    http://www.cnblogs.com/hoojo/p/use_eclipse_ant_javac_JDT_compiler_class.html

  3. 关于MD5值加密算法

    public static string getMD5(string str)//该方法获取字符串的md5加密 通经常使用来验证数据     {         System.Security.Cry ...

  4. Oracle导入脚本文件乱码问题

    用脚本直接导入,Oracle出现乱码 绝大多数情况是Oracle客户端环境变量NLS_LANG的值和数据库字符集不一致导致. (注nls_lang修改的是Oracle客户端字符集的编码,locale命 ...

  5. [Clojure] A Room-Escape game, playing with telnet and pure-text commands - Part 3

    Code Path: https://github.com/bluesilence/Lisp/blob/master/clojure/projects/room-escape/src/room_esc ...

  6. C#连接Sqlserver代码

    刚开始把数据库的密码搞错了,硬是连不上... //数据库连接类 SqlConnection conn = new SqlConnection("server=.;database=test; ...

  7. Linux之定时任务Crond介绍

    Linux之定时任务 定时任务Crond介绍 Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6 linux操作系统之后,默认便 ...

  8. redux相关学习资源

    很多学习资料,直接在SF.掘金搜索关键词redux源码等可以获得. redux参考版本3.6或3.7.2   redux-thunk看1.0.1 1.redux源码分析之四:compose函数    ...

  9. 【record】11.7..11.13

    好少

  10. node服务器如何部署https证书

    var http = require('http'); var https = require('https'); var path = require('path'); var fs = requi ...