原文:利用最小二乘法拟合任意次函数曲线(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. 用户之间imp的问题

    今天同事说申请了一个从生产导出的dump文件,须要导入測试库进行測试. 之前做的基本都是本库导出,本库导入的操作,比如:imp test/***@test tables=tbl_fuel file=H ...

  2. 【机器学习实战】第3章 决策树(Decision Tree)

    第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...

  3. NOIP模拟 赌博游戏 - 概率dp

    题意: 最近西雅图的高中校园里流行这样一个游戏. 我们有一个骰子,这个骰子有M个面,分别写着1..M,并且是个公平的骰子,换句话说,一次投掷时每个面朝上的概率是相同的. 游戏的组织者使用这个骰子进行N ...

  4. Filter,Listener(转)

    一.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个reques ...

  5. 最新版Butterknife plugin支持butterknife7.0.1和兼容butterknife 6.1.0及下面

    JakeWharton 的butterknife帮我们有效的攻克了findViewById及各种view的监听事件泛滥的问题,极大的简化了代码,假设使用了android Studio开发的配上avas ...

  6. Java访问修饰符(转)

    类.方法.成员变量和局部变量的可用修饰符 修饰符 类 成员方法 构造方法 成员变量 局部变量 abstract(抽象的) √ √ - - - static (静态的) - √ - √ - public ...

  7. Winfrom 重新登录

    private void ReLogin_Click(object sender, EventArgs e) { ///实例化一个进程 Process process = new Process(); ...

  8. redis举例调用两种方式方式

    在以下的代码演示样例中.将给出两种最为经常使用的Redis命令操作方式,既普通调用方式和基于管线的调用方式. 注:在阅读代码时请留意凝视.   1 #include <stdio.h>   ...

  9. Yii2.0

    Yii2.0基础框架   缘起 因为一个月的短暂停留,我在给朋友搞事情,所以Yii系列的文章耽搁了很长时间,现在又重拾当时的知识,给大伙好好撸下这一系列的博客 提起Yii,虽然是国外的开发者搞的,但是 ...

  10. redis 学习笔记——持久化

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...