第六章 医用薄膜渗透率的确定----曲线拟合
§6—3 用Matlab作最小二乘曲线拟合
1.用n次多项式作最小二乘拟合已知,要从中找一个,使得在节点处的总误差达到最小。
Matlab命令格式:
系数数组=polyfit(节点数组,函数值数组,次数n)
例1:对函数C=C(t)测量得下面一组数据:
t,1 2 3 4 5 6 7 8 9
C:4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50
试分别用1次、2次、3次、6次多项式作拟合,并画图显示拟合效果。
clear
hold on
x0=1:9;y0=[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50];
for i=1:9
plot(x0(i),y0(i),'+')
end
a1=polyfit(x0,y0,1),a2=polyfit(x0,y0,2)
a3=polyfit(x0,y0,3),a6=polyfit(x0,y0,6)
x=0:0.1:10;
y1=polyval(a1,x);y2=polyval(a2,x);
y3=polyval(a3,x);y6=polyval(a6,x);
plot(x,y1,x,y2,x,y3,x,y6)
hold off
执行得:
a1=0.2385 4.5497
a2 =-0.0236 0.4750 4.1162
a3 =0.0015 -0.0459 0.5686 4.0184
a6 =-0.0000 0.0004 -0.0053 0.0364 -0.1631 0.7528 3.9189
(如,其中a2的结果代表“用2次多项式作拟合”得到的多项式为 -0.0236+0.4750+4.1162 )
为了准确判断拟合效果,需计算“节点处的总误差”:
(续前面程序)
wc1=sqrt(sum((polyval(a1,x0)-y0).^2))
wc2=sqrt(sum((polyval(a2,x0)-y0).^2))
wc3=sqrt(sum((polyval(a3,x0)-y0).^2))
wc6=sqrt(sum((polyval(a6,x0)-y0).^2))
执行得:
wc1 =0.4188
wc2 =0.0565
wc3 =0.0078
wc6 =0.000705
2.用一般函数作最小二乘拟合已知,要用一个函数来近似代表,此函数中含有几个待定参数,现在的任务是:确定参数的值,使得在节点处的总误差达到最小。
用Matlab计算:
先按照建立一个函数文件,文件第一句格式为 function f=文件名(参数组,节点数组)
再用下面命令格式参数组=lsqcurvefit(‘函数文件名’,参数组初值,节点数组,函数值数组)
例2:对例1中的数据,用函数作拟合,并画图显示拟合效果,给出节点处总误差。
先建立并保存函数文件:文件名syp78hswj 内容为:
function f=syp78hswj(a,x0)
f=a(1)+a(2)*exp(-a(3)*x0);
再下面主程序:
clear
hold on
x0=1:9;y0=[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50];
for i=1:9
plot(x0(i),y0(i),'+')
end
cscz=[1,1,1];
a=lsqcurvefit('syp78hswj',cscz,x0,y0)
x=0:0.2:10;f=syp78hswj(a,x);plot(x,f)
f=syp78hswj(a,x0);
wc=sqrt(sum((f-y0).^2))
hold off
执行得:
节点处总误差 wc=0.0076
§6—3 用Matlab作最小二乘曲线拟合
1.用n次多项式作最小二乘拟合已知,要从中找一个,使得在节点处的总误差达到最小。
Matlab命令格式:
系数数组=polyfit(节点数组,函数值数组,次数n)
例1:对函数C=C(t)测量得下面一组数据:
t,1 2 3 4 5 6 7 8 9
C:4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50
试分别用1次、2次、3次、6次多项式作拟合,并画图显示拟合效果。
clear
hold on
x0=1:9;y0=[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50];
for i=1:9
plot(x0(i),y0(i),'+')
end
a1=polyfit(x0,y0,1),a2=polyfit(x0,y0,2)
a3=polyfit(x0,y0,3),a6=polyfit(x0,y0,6)
x=0:0.1:10;
y1=polyval(a1,x);y2=polyval(a2,x);
y3=polyval(a3,x);y6=polyval(a6,x);
plot(x,y1,x,y2,x,y3,x,y6)
hold off
执行得:
a1=0.2385 4.5497
a2 =-0.0236 0.4750 4.1162
a3 =0.0015 -0.0459 0.5686 4.0184
a6 =-0.0000 0.0004 -0.0053 0.0364 -0.1631 0.7528 3.9189
(如,其中a2的结果代表“用2次多项式作拟合”得到的多项式为 -0.0236+0.4750+4.1162 )
为了准确判断拟合效果,需计算“节点处的总误差”:
(续前面程序)
wc1=sqrt(sum((polyval(a1,x0)-y0).^2))
wc2=sqrt(sum((polyval(a2,x0)-y0).^2))
wc3=sqrt(sum((polyval(a3,x0)-y0).^2))
wc6=sqrt(sum((polyval(a6,x0)-y0).^2))
执行得:
wc1 =0.4188
wc2 =0.0565
wc3 =0.0078
wc6 =0.000705
2.用一般函数作最小二乘拟合已知,要用一个函数来近似代表,此函数中含有几个待定参数,现在的任务是:确定参数的值,使得在节点处的总误差达到最小。
用Matlab计算:
先按照建立一个函数文件,文件第一句格式为 function f=文件名(参数组,节点数组)
再用下面命令格式参数组=lsqcurvefit(‘函数文件名’,参数组初值,节点数组,函数值数组)
例2:对例1中的数据,用函数作拟合,并画图显示拟合效果,给出节点处总误差。
先建立并保存函数文件:文件名syp78hswj 内容为:
function f=syp78hswj(a,x0)
f=a(1)+a(2)*exp(-a(3)*x0);
再下面主程序:
clear
hold on
x0=1:9;y0=[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50];
for i=1:9
plot(x0(i),y0(i),'+')
end
cscz=[1,1,1];
a=lsqcurvefit('syp78hswj',cscz,x0,y0)
x=0:0.2:10;f=syp78hswj(a,x);plot(x,f)
f=syp78hswj(a,x0);
wc=sqrt(sum((f-y0).^2))
hold off
执行得:
节点处总误差 wc=0.0076