200 8 年 2 月
电 脑 学 习
第 1 期
MATLAB 在非线性曲线拟合中的应用研究
唐家德*
摘 要 : 归 纳 总 结 了 非 线 性 曲 线 拟 合 的 方 法 、求 解 步 骤 和 上 机 操 作 过 程 。
关
中图分类号: TP311.131
键 词 : 曲线拟合 非线性
MATLAB
文献标识码: B 文章编号: 1002- 2422( 2008) 01- 0057- 03
Resear ch on Application of MATLAB in Nonlinear Cur ve Fitting
Tang J iade
Abstr act: The paper summarizes the method、solution steps and operations in nonlinear curve fitting.
Keywor d:
Curve Fitting
Nonlinear
MATLAB
1 曲线拟合的基本原理
已知一组测定的数据(例如 N 个点(xi,yi)去求得自变
量 x 和因变量 y 的一个近似解析表达式 y=φ(x)。若记误
差 δi=φ(xi)- yi,i=1,2,…N,则要使误差的平方和最小,
即要求:
N
Q=
i = 1!δ2
i
(1)
为最小,这就是常用的最小二乘法原理。
2 MATLAB 曲线拟合的相关方法
2.1 函数形式:
(1)多项式拟合函数 polyfit,调用格式为:
p=polyfit(x,y,n)
其中 x,y 为参与曲线拟合的实验数据,n 为拟合多项
式的次数,函数返回值为拟合多项式的系数 (按降幂排
列)。n=1 时,就为线性拟合。
例 1: 给出表 1 数据,试用最小二乘法求一次和二次
拟合多项式。
表 1
x
- 1.00
y - 0.2209
- 0.75
0.3295
- 0.50
0.8826
- 0.25
1.4392
0
2.0003
0.25
2.5645
0.50
3.1334
0.75
3.7061
1.00
4.2836
在 MATLAB 命令窗口中输入:
clear;close=
x=- 1:0.25:1=
y =[- 0.2209,0.3295,0.8826,1.4392,2.0003,2.5645,3.1334,3.7061,4.
2836]=
p1=polyfit(x,y,1)
p1 =
p2=polyfit(x,y,2)
p2 =
y1=polyval(p1,x)=
y2=polyval(p2,x)=
plot(x,y,' +' ,x,y1,'r:' ,x,y2,'k- .' )
0.0313
2.0001
2.2516
2.0131
2.2516
拟合多项式为:yP=2.0516+2.0131 和 yP=0.0313x2+2.2516x+
2.20001。
(2)非线性数据拟合函数 lsqcurvefit 调用格式为:
c=lsqcurvefit('fun' ,x0,xdata,ydata)
其中 'fun' 为拟合函数的 M- 函数文件名,x0 为初始向
量,xdata,ydata 为参与曲线拟合的实验数据。函数返回值 c
为非线性函数 fun 的拟合系数。
例 2:2004 年全国大学生数学建模竞赛 C 题(酒后驾
车)中给出某人在短时间内喝下两瓶啤酒后,间隔一定的
时间 测量他的血液中酒精含量 y(毫克/百毫升),得到数
据如表 2。
表 2 酒精含量与饮酒时间的实验数据
时间( 小时)
0.25
酒精含量
时间( 小时)
酒精含量
30
6
38
0.5
68
7
35
0.75
75
8
28
1
82
9
25
1.5
82
10
18
2
77
11
15
2.5
68
12
12
3
68
13
10
3.5
58
14
7
4
51
15
7
4.5
50
16
4
5
41
通过建立微分方程模型得到短时间内喝酒后血液中
酒精浓度与时间的关系为:
y=c1(e- c
(2)
根据实验数据,利用非线性拟合函数 lsqcurvefit,确定
)
2
3
t
t- e- c
模型(2)式中的参数 c1,c2,c3。求解过程为:
先编写一个 M- 函数文件 Example2_1
function f=Example2_1(c,tdata)
f=c(1)P(exp(- c(2)Ptdata)- exp(- c(3)Ptdata))=
保存后,在命令窗口中输入:
tdata=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10
11 12 13 14 15 16]=
ydata=[30 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25
18 15 12 10 7 7 4]=
c0=[1 1 1]=
for i=1:50
c=lsqcurvefit('Example2_1' ,c0,tdata,ydata)=
收稿日期:2007- 05- 04
* 唐家德 楚雄师范学院数学系讲师(云南,楚雄 675000),从事应用数学的教学和研究工作。
· 57 ·
c0=c$
end
得到最优解为:c = 114.2587
0.1852
2.0124
从而得出拟合曲线:
cftool 的用法。
例 3 某生化系学生为研究嘌呤霉素在某项酶促反应
中对反应速度与底物浓度之间关系的影响,设计了一个实
验,所得的实验数据见表 3。根据问题的背景和数据建立一
y4=114.2587(e- 0.1852t- e- 2.0124t)
(3)
个合适的数学模型,来反映这项酶促反应的速度与底物浓
2.2 图形窗口形式
(1)利用多项式拟合的交互图命令(GUI)polytool,调
用格式为:polytool(x,y)
其中 x,y 分别为实验数据构成的向量,例如利用 poly-
tool 求解例 1 的 MATLAB 命令如下:
x=- 1:0.25:1J
y =[- 0.2209,0.3295,0.8826,1.4392,2.0003,2.5645,3.1334,3.7061,4.
2836]$
polytool(x,y)
打开多项式拟合的交互式界面,由于要拟合的函数为
线性函数,因此在多项式拟合交互式界面中的 Degree 中
输入 1,点击导出数据 Export, 出现保存对话框 Export
to
Workspace,选中 Parameters(参数),Residuals(残差)后点
击 OK,在 MATLAB 的 Workspace 窗口中可以看到参数为:
2.2516 和 2.0131,即拟合函数为 y4=2.2516x+2.0131。同样
如果拟合的函数为二次函数,则只要在 Degree 中输入 2,
其它步骤相同,可得拟合函数为:
y4=0.0313x2+2.2516x+2.0001
通过查看 Residuals(残差)值,可以发现二次函数拟
合的残差值比线性函数的要小一些,从拟合的效果看,可
以选择二次函数作为拟合函数,但由于线性函数较简单,
残差值也很小,从简单出发,也可选择线性函数作为拟合
函数。
(2)基本拟合界面
MATLAB 提供了一个方便简洁的拟合界面。具有拟合
快速和操作简便的优势,只能拟合多项式。例如用基本拟
合界面求解例 1 的过程如下:
clearJcloseJ
x=- 1:0.25:1J
y =[- 0.2209,0.3295,0.8826,1.4392,2.0003,2.5645,3.1334,3.7061,4.
2836]J
plot(x,y,' +' )J
在 散 点 图 的 图 形 窗 口 上 分 别 点 击 菜 单 档 中 的 Tools
Basic Fitting, 在 Plots Fits 中 分 别 选 中 linear、quadratic、
Show equations、plot residuals、show norm of residuals,所得
拟 合 直 线 方 程 为 :y4 =2.3x+2; 拟 合 二 次 多 项 式 为 :y4 =0.
031x2+2.3x+2。
(3)曲线拟合工具界面 cftool
曲线拟合工具界面 cftool 是一个可视化的图形界面,
具有强大的图形拟合功能,下面通过一个具体例子来介绍
· 58 ·
度之间的关系。
表 3 嘌呤霉素实验中的反应速度与底物浓度数据
底物浓度
(ppm)x
反应速度 y
0.02
0.06
0.11
0.22
0.56
1.10
76
47
97 107 123 139 159 152 191 201 207
200
酶促反应的速度 y 与底物浓度 x 之间的关系可用下面
两个简单模型描述:
Michaelis- Menten 模型:y=f(x,β)= β1x+β2
β3+x
(4)
指数增长模型:y=f(x,β)=β1(1- eβ2
(5)
使用曲线拟合工具界面 cftool 来确定模型(4)和(5)
x
)
中的参数,并比较模型(4)、(5)的拟合效果。
在 MATLAB 命令窗口中输入以下语句:
clearJcloseJ
x=[0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.
10]J
y=[76 47 97 107 123 139 159 152 191 201 207 200]J
cftool(x,y)J
在″Curve Fitting Tool″对话框中单击″Fitting″,打开″Fit-
ting″对话框,点击″New fit″,在″Fit Name:″中输入″有理函
数″,在″Type of fit″中选中″Rational″,在″Numerator″中选中″
linear polynomial″,在″Denominator″中选中″linear polynomi-
al″,然后点击″Apply″,完成有理函数拟合。然后,再次点击″
New fit″,在″Fit Name:″中输入″指数函数″,在″Type of fit″
中选中″Custom Equation″,点击″New equation″,打开用户自
定义方程对话框,点击″General Equation″,在″Equation″中
输入″y=a4(1- exp(- b4x))″,点击″Ok″后回到拟合窗口,点击″
Apply″,完成指数函数拟合,参数计算结果见表 4。
表 4 模型( 4) 、( 5) 计算结果
拟合函数
系数
RMSE(剩余标准差) R- square
y=(p1sx+p2)
/(x+q1)
y=as(1- exp
(- bsx))
p1=221.7 p2=3.318
q1=0.1047
a=192.1,b=11.38
9.419
17.44
0.9741
0.9014
通过表 4 可以看出,有理函数 (Michaelis- Menten 模
x+0.1047 拟合剩余标准差较小,R- square 较大
型)ys= 221.7x+3.318
(越接近 1 越好),故用有理函数 ys= 221.7x+3.318
据比用指数函数 ys=192.1(1- e- 11.38x)拟合的效果好。
3 结束语
x+0.1047 拟合数
200 8 年 2 月
电 脑 学 习
第 1 期
用汇编语言实现多种数制的通用输入方法
杨继鹏*
摘 要 : 把 从 键 盘 输 入 的 二 进 制 、八 进 制 、十 进 制 、十 六 进 制 字 符 数 据 转 换 成 计 算 机 能 够 识 别 的 二 进 制 数 据, 给 出 了
各种进制通用的输入、转换方法及汇编语言程序段, 通过字符串本身可以判断数制。
键 词 :
关
汇编语言
中图分类号: TP313
转换
数制
通用输入方法
文献标识码: B 文章编号: 1002- 2422( 2008) 01- 0059- 02
Realization of Gener al Input Method of Differ ences with the Assembly Language
Yang J ipeng
Abstr act: The paper describes how to change character data of binary system,octal system,decimal system and hexad-
ecimal system from keyboard into data of binary system which computers can recognize.It tells the differe-
nt general input and conversion methods,and gives out assembly language program segment.It also tells how
to judge numbering system through character string itself.
Assembly Language
General Input Method
Numbering System
Keywor d:
Shift
1 编 程 思 路
1.1 输入数值字符串
利用 DOS 系统功能的 10 号调用,
把需要的数值从键盘输入,此时输入
的是字符串。在利用 10 号调用时,要
注意缓冲区 BUF 的设定,其格式为:
BUF DB 18
DB B
DB 18 DUP(0)
1.2 判断数制
字符串输入后,先判断输入数据
的进制。通过缓冲区中回车符前面的
字符来判断。这个字符只能是字符串″
0123456789BbOoQqHh″中 的 一 个 ,否
则输入的数据错误,程序结束。此字符
若为″B″或″b″则是二进制数;若为″O″、″
o″、″Q″、″q″中的任一字符,则是八进
制;若为″D″、″d″或″0″~″9″之间的任一
字符,则是十进制数;若为″H″或″h″则
是十六进制数。
1.3 字符数据转换为数值数据
需要把字符串中的每个字符数据
转换为其对应的数值数据。对于二、
八、十进制数,只要将其减去 30H 即
可;对于十六进制,因″A″~″F″或″a″~″
f″表示数值 10~15,若字符在″0″~″9″之
间,则减去 30H;若在″A″~″F″之间,则
减去 37H;若在″a″~″f″之间,则减去
57H。
1.4 数值数字转换成二进制数
把 得 到 的 数 值 数 字 d1d2 …… dn
通 过 每 种 数 制 的 基 数 转 换 成 二 进 制
数。d1d2……dn 可用如下公式计算得
到二进制形式:
(…(d1R 基数+d2)R 基数+…)R 基数+dn
二、八、十、十六进制的基数分别为 2、
8、10、16。 例 如 十 进 制 数 3472 =
((3R10+4)R10+7)R10+2。
二、八、十进制的数字符号均在
0~9 之间,可用同一转换子程序 con-
vert 实现,只要改变一些传递的参数即
可。十六进制有″A″~″F″、″a″~″f″数字字
符,情况特殊,单独用一个子程序 con-
vert16 转换。
segment
db 18
buf+1
num,num1
cl,low
ch,high
2 汇编语言源程序实例
;num1:不同数制的基数
;low:基数的最小数字符号
;high:基数的最大数字符号
init
macro num1,low,high
dec
mov
mov
mov
endm
data
buf
db B
db 18 dup(0)
str
equ $- str
count
num
dw B
loopnum db B
ends
data
stack
segment stack
db 100 dup(0)
stack
code
assume cs:code,ds:data,ss:stack
start: mov
ends
segment
ax,data
db ' 0123456789BbOoQqDdHh'
利用 MATLAB 的绘图功能和曲线拟合功能,可以很方
[1] 徐萃薇,孙绳武. 计算方法引论[M]. 北京:高等教育出
便地进行多项式拟合和其它非线性曲线拟合,并可以通过
比较剩余标准差和可决系数 R2 的大小,来对比不同曲线
版社,2002- 01:62- 85.
[2] 苏金明,张莲花,等. MATLAB 工具箱应用[M]. 北京:电
的拟合效果。从而在不知数学模型情况下,也能根据数据
子工业出版社,2004- 01:489- 512.
的散点图找出较优的曲线来拟合数据。
[3] 姜启源,谢金星,叶俊. 数学模型[M]. 北京:高等教育出
参 考 文 献
版社,2003- 08:308- 316.
收稿日期:2007- 05- 18
* 杨继鹏 山东服装职业学院信息工程系副教授(山东,泰安 271000)。
· 59 ·