数值计算 ( 分析 ) 实验报告 2
南昌航空大学数学与信息科学学院
实验报告
课程名称:《数值计算方法》
实验名称:曲线拟合
实验类型:验证性■综合性□设计性□
实验室名称:数学实验室
班级学号:09072113
学生姓名:邢宪平
任课教师(教师签名):
成绩:
一、实验目的
实验目的:实验目的:了解函数逼近与曲线拟合的基本原理,并且运用 MATLAB 软件进行实践操作。
二、实验原理、程序框图、程序代码等
实验题目:
题目 1:试分别用抛物线y a bx cx2和指数曲线 y ae bx拟合下列数据
x i1 1.52 2.53 3.54 4.5
y i33.479.50122.65159.05189.15214.15238.65252.50
x i5 5.56 6.577.58
y i267.55280.50296.65301.40310.40318.15325.15
并比较两个拟合函数的优劣。
题目 2:已知实验数据如下:
x i 1.02.5 3.5 4.0
y i 3.81.5026.0 33.0
试用形如 y a bx 2的抛物线进行最小二乘拟合。
实验原理:
1、逼近方式
2n,
V( f , P n ) || F P n ||
max | f ( x) P n ( x) | 为 f (x) 与 P n ( x) | 在 [a, b] 上的偏差。
a x b
若存在 P n * (x) H n ,使得 V( f , P n * ) || f P n * || inf
max | f ( x) P n ( x) | 则称 P n
* ( x)
P n H n
a x b
是 f (x) 在 [ a, b] 上的最佳一致逼近多项式。
假设 f (x) C[ a, b] 及 C[ a, b] 的一个子集
span{ 0 (x),
存在 S *
(x)
,使 || f (x) S *
(x) ||2
2
S( x) ||22
b
min || f (x)
min
S( x )
S (x ) a
1( x),,... n (x)}
,若
( x)[ f (x) S( x)] 2 dx
则称 S * (x) 是 f (x) 在子集
C[ a, b]
中的最佳平方逼近数。
2、曲线拟合
上述函数的最佳平方逼近法中, 若 f (x) 是以一组离散点集的形式给出的, 即给出了函数 f (x) 在一些离
散点上的值 {( x i , y i ), i
0,1,..., m }
,则该方法就是所说的曲线
拟合。
取
( f , S n ) || f S n ||2 m
yi ]
而 S( x) a 0
0 ( x) a 1 1( x)
... a n n ( x)
,这就
V
2
2
i 0
是最小二乘逼近。
由上可知,最小二乘逼近即求多元函数
I (a 0 ,a 1,...a n ) || f
S n ||22
的最小值问题。
由取最小值的必要条
(
) ( ) ... ( ) a 0 ( y, )
件,可得法方程
(
) (
) ... ( n
)
a 1 ( y, )
..................
(
n ) ( n ) ... ( n
n )
a n
( y,
n )
实际计算时,为了方便,通常取
span{
0 ( x), 1 (x),,... n (x)}
为简单多项式, 如 span{1, x, x 2 ,..., x n } ,得
到 n 次拟合多项式,但当
n 较大时,方程组往往是
病态的,这时我们可以选择正交多项式。
程序代码:
题目一
(1)用抛物线 y=a+bx+cx^2 拟合的程序代码
x=1:0.5:8;
y=[33.4 79.50 122.65 159.05 189.15 214.15 238.65 252.50 267.55 280.50 296.65 301.40 310.40 318.15 325.15];
A=polyfit(x,y,2);
z=polyval(A,x);
plot(x,y,'k+',x,z,'r')
(2)用指数曲线 y=a*exp{bx} 拟合的程序代码
M- 文件代码: function f=curvefun1(x,tdata)
f=x(1)*exp{x(2)*tdata}%x(1)=a;x( 2)=b;
输入命令:
xdata=1:0.5:8
ydata=1e-03*[33.4,79.50,122.65,159.05,189.15,214.15,238 ,65,252.50,267.55,280.50,296.65,301.40,310.40,318.15,325 .15];
t0=[0.2,0.05,0.05];
t=1sqcurvefit('curvefun1',t0,xdata,ydata)
f=curvefun1(t,xdata)
题目二程序代码:
function f=curvefun1(x,tdata)
f=x(1)+x(2)*tdata.^2% 其中 x(1)=a; x(2)=b;x(3)=k; tdata=[1.0 2.5 3.5 4.0];
cdata=[3.8 1.50 26.0 33.0];
x0=[0,0];
x=lsqcurvefit('curvefun1',x0,tdata,cdata);
f=curvefun1(x,tdata)
三、实验过程中需要记录的实验数据表格
题目一(1)
(2)
从图像上看,曲线一明显更贴近。
题目二
四、实验中存在的问题及解决方案
在做题目一的第二条曲线时,如果参照例题来修改程序,会发现运行错误。
对比之后和同学讨论发现例题中t 是自变量,而x 是引入的参数,起存储变元的作用,所以做实验一的时候要将变量和引入的参数对调,再调试程序。
五、心得体会
这次的实验暴露出对图像的不熟悉,而且在写程序的过程中经常会有一些错误出现,比如说模仿时例题中0 和 o,1 和 l 不分,导致运行出现未定义的函数名等错误出现,这就要求我们在编写前先将例题搞透,不然不明白其含义就老是出现错误。
通过这次实验使我对。