最小二乘法 多项式拟合 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
连续系统仿真实验报告实验数据拟合建模
姓名:
专业:
学号:
时间:2013年5月1日
实验单元二 实验数据拟合建模
一、实验目的
1、用C 语言实现最小二乘的多项式拟合和LU 分解法;
2、熟练掌握最小二乘拟合和LU 分解法的基本原理。
3、体会用计算机编程解决计算问题的方法。
二、需求说明
(一)、需求阐述
本次实验是要求根据已知的自变量和函数值,通过多项式拟合来分别计算2、3、4阶拟合多项式,并根据拟合结果分别计算出待求点的函数值。其中解拟合系数方程组时采用LU 分解的方法计算拟合多项式的系数。 (二)、实验公式
m 次拟合函数公式为:
01x =++m m a a x a x ϕ()⋯
计算系数
i a 的方程组为:
{
0011
++...+=m m s a s a s a t
1021+11
++...+=m m s a s a s a t ⋮0+11
2++...+=m m m m s a s a s a t
○1
其中 ++=0
=n
k j
j k i
i s x ∑, =0
=n
j i i i t y x ∑
所以,在编程计算时,先计算出方程组○1,再用LU 分解法计算求出i a 的值,即可得到拟合多项式。LU 分解法的公式为:
[ 1l 21l 31 ⋮l n101l 32⋮l n2001⋮⋯⋯⋯⋱⋱⋯0 0⋮01] [
u 110000 u 12 u 22000 u 13 u 23
u 33⋱⋯⋯⋯⋱⋱0 u 1n
u 2n ⋮ u n−1n u nn ] =[ a 11a 21a 31⋮a n1a 12a 22a 32⋮a n2a 13a 23a 33⋮a n3⋯⋯⋯⋱⋯a 1n a 2n a 3n ⋮a nn ]
其中L 矩阵和U 矩阵的计算公式如下: 第一步,当k=1,有:
{
11= (=2,3,
,n)
j j u a j 1111111
== (=2,3,
,n)
i i i a a
l i u a
第二步,当k=2,3,⋯,n-1时,有:
{
-1
=1
=- (j=+1,+2
,)
k kj
kj kr rj r u a l u k k n ∑-1
(k)=1(k)-=
(j=,+1,)
k ik
ir rk
r ik kk
a l u l k k n u
∑
最后求 u nn :-1
=1
=-n nn nn nr rn r u a l u ∑
三、设计说明
(一)、数据结构
程序采用一维数组的形式来读取文件中给出的已知点处的值和要计算的未知点处的自变量值,最终的拟合计算结果也是采用一维数组的形式输出到文件中。 拟合多项式的系数a 和拟合系数方程组的参数t 都是采用一维数组来存储的,而拟合系数方程组中的参数s 和L 、U 矩阵都是用二维数组来表示的。由于要分别计算2、3、4阶拟合结果,所以数组的规模取为5,矩阵的规模取为5*5. (二)、算法设计及效率分析 在进行LU 分解函数中,在计算L 矩阵和U 矩阵时,因为当k=2,3,⋯,n-1时,计算-1
=1
k ir rk r l u ∑和-1
=1
k kr rj r l u ∑的循环条件不允许k=1时进入,而正好k=1时,计算1i l 和1j u 不
需要
-1
=1
k ir
rk r l
u ∑和-1
=1
k kr rj r l u ∑,因而对k=1和k=2,3,⋯,n-1,就可以和在一起计算,这样就减少了
程序的长度。
而在分别计算2、3、4阶拟合系数方程组的参数时,没有很好的利用前一阶计算的,而每次都要重新计算;而且矩阵是一个堆成矩阵,没有好好利用对称矩阵的特性,导致了重复计算,增加了计算量,降低了程序的效率。而造成这一结果的原因是自己为了编程的简单而忽视了计算量,在以后的编程时要注意改变这一习惯。
(三)、程序结构
程序主要步骤的流程图如下:
以上流程图对应的源程序中的函数分别如下:
//计算拟合系数方程组中的参数s
void computers(double s[p][p],double x1[],int m) //计算拟合系数方程组中的参数t
void computert(double t[],double x1[],double y1[],int m) //对拟合系数方程组中的参数s 组成的矩阵进行LU 分解 void LV(double L[p][p],double V[p][p],double s[p][p],int m) //计算拟合多项式的系数
void computera(double L[p][p],double V[p][p],double t[],double x[],int m) //由得到的的拟合多项式计算待求点处的函数值 void computerty2(double a[],double x2[],double y2[],int m) //保存得到的拟合多项式和计算处的参数
void save(double a[],int m,double y2[])
四、编码实现
#include
#define p 5 //拟合方程的阶次+1
#define q 5 //已知点的数目,也是带计算点的数目 using namespace std;
ofstream outDatay("G:\\连续系统仿真\\拟合实验\\outy.txt"); //用于保存计算结果 int main() {
void computers(double s[p][p],double x1[],int m); //计算拟合方程组的系数s
void computert(double t[],double x1[],double y1[],int m); //计算拟
计算出拟合系数方程组中的参数S 计算出拟合系数方程组中的参数t 对列出的拟合方程组阵进行LU 分解
根据分解的结果计算拟合多项式的系数,即拟合方程组
的解
根据得到的拟合多项式计算待求点出
函数值
保存得到的拟合多项式系数和计算出
的函数值