最小二乘法拟合曲线和高斯消元法解线性方程组及MATLAB代码

更新时间:2023-08-27 13:18:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

2013年11月23日

05:43

一、拟合曲线:

一组测试数据arrX[dimension]

arrY[dimension]

求多项式

n小于dimension

从一组给定的数据出发,在某个函数类Φ中寻求一个“最好”的函数来拟合这组数据

二、方程组求解原理

高斯消元法

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

Others Page 2

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

Others Page 3

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

三、

最小二乘法原理

publicstaticdouble[] MultiLine(double[] arrX, double[] arrY, intlength, int

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

publicstaticdouble[] MultiLine(double[] arrX, double[] arrY, intlength, intdimension)//二元多次线性方程拟合曲线

{

intn= dimension+ 1; //dimension次方程需要求dimension+1个系数

double[,] Guass= newdouble[n, n+ 1]; //高斯矩阵例如:y=a0+a1*x+a2*x*x

//这里计算出中间矩阵

//对应三.4 公式

// Guass[n,n+1]

for(inti= 0; i< n; i++)

{

//第i行

intj;

for(j= 0; j< n; j++) {

//当i=j时,对应三.4 公式左边系数方阵对角线

//第i行,第j列X的j+i次方和

//对应三.4 公式

Guass[i, j] = SumArr(arrX, j+ i, length);

}

//j == n

//Guass[i, n]= SumArr(arrX, i, arrY, 1, length);

//即计算对应三.4 公式的后面

//

//

// arrY始终是一次

Guass[i, j] = SumArr(arrX, i, arrY, 1, length); }

//调用高斯消元法

//先通过行变换把矩阵变成

//

//

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

//

最后逐个求出解

returnComputGauss(Guass, n);

}

四、附:

//MATALAB 代码:

publicclassLine{

///<summary>

///用最小二乘法拟合二元多次曲线

///</summary>

///<param name="arrX">已知点的x坐标集合</param>

///<param name="arrY">已知点的y坐标集合</param>

///<param name="length">已知点的个数</param>

///<param name="dimension">方程的最高次数</param>

publicstaticdouble[] MultiLine(double[] arrX, double[] arrY, intlength, intdimension)//二元多次线性方程拟合曲线

{

intn= dimension+ 1; //dimension次方程需要求dimension+1个系数

double[,] Guass= newdouble[n, n+ 1]; //高斯矩阵例如:y=a0+a1*x+a2*x*x for(inti= 0; i< n; i++) { intj;

for(j= 0; j< n; j++) {

Guass[i, j] = SumArr(arrX, j+ i, length); } Guass[i, j] = SumArr(arrX, i, arrY, 1, length);

}

returnComputGauss(Guass, n);

}

publicstaticdoubleSumArr(double[] arr, intn, intlength) //求数组的元素的n次方的和

{

doubles= 0;

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

doubles= 0;

for(inti= 0; i< length; i++)

{ if(arr[i] != 0 || n!= 0)

s= s+ Math.Pow(arr[i], n); else

s= s+ 1;

} returns;

} publicstaticdoubleSumArr(double[] arr1, intn1, double[] arr2, intn2, intlength)

{ doubles= 0;

for(inti= 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);

elses= s+ 1;

} returns;

}

publicstaticdouble[] ComputGauss(double[,] Guass, intn)

{ inti, j;

intk, m; doubletemp;

doublemax;

doubles; double[] x= newdouble[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)

{

// "此线性方程为奇异线性方程"

最小二乘法拟合曲线,高斯消元法解线性方程组及MATLAB代码

{

// "此线性方程为奇异线性方程"

} returnx;

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];

}

} }returnx;

本文来源:https://www.bwwdw.com/article/e1ji.html

Top