浅谈Lingo软件求解非线性曲线拟合
2020-03-11黄渊
黄渊
【摘 要】 本文以给药方案制定问题为例,阐述了应用Lingo软件求解非线性曲线拟合,无需初始值,弥补了Matlab软件的不足,是求解非线性曲线拟合的一种比较好的方法。
【关键词】 Lingo软件;非線性曲线拟合;Matlab软件
一、非线性曲线拟合的概念
假设已知经验公式(这里b和x均可为向量),要求根据一批有误差的数据0,1,2,…,n,确定参数b。这样的问题称为曲线拟合,其基本原理是最小二乘法,即求b使得均方误差
达到最小。如果关于b是非线性函数,那么称这样的曲线拟合为非线性曲线拟合。
二、非线性曲线拟合的软件实现
对于非线性曲线拟合,数学软件Matlab提供了nlinfit函数,它的调用格式为:
a=nlinfit(x,y,fun,b0)
其中,b0为待定参数b的初始值,其他的含义参见文献[1]第71页。关于初始值,一般要根据函数模型的数学意义和实际意义来猜测b0,这往往是比较困难的事,而且大部分数学建模教材通常直接给出初始值,不会解释初始值是怎么来的。所以笔者在给大专生讲授此内容时也直接给出初始值,但学生不易接受。
由于非线性曲线拟合实际上是一个无约束优化问题,即
决策变量是拟合函数含有的待定参数b,因此可以用Lingo软件来解决。下面举一个例子。
例:给药方案制定问题,详细介绍参见文献[2]第145页。
模型假设:
[1]机体看作一个房室。
[2]药物进入机体到分布均匀所需的时间不计。
[3]药物排出速率与血药浓度成正比,比例系数。
[4]血药容积为v,t=0时注射剂量为d,则t=0,血药浓度为。
由假设[3]得:,由假设[4]得。解微分方程:得(其中d=300mg)。
下面通过非线性拟合求出参数。
在Lingo软件中输入以下程序:
model:
sets:
gh/1.9/:t,c;
endsets
data:
t=0.25,0.5,1,1.5,2,3,4,6,8;
c=19.21,18.15,15.36,14.10,12.89,9.32,7.45,5.24,3.01;
enddata
min=@sum(gh:(((300/a1)*@exp(-a2*t))-c)^2);
end
运行程序得最优值为1.065887,即误差为1.06589,a1=14.82116,。由此得到拟合函数。
在Matlab软件中输入以下程序:
>>t=[0.25,0.5,1,1.5,2,3,4,6,8];
c=[19.21,18.15,15.36,14.10,12.89,9.32,7.45,5.24,3.01];
f=@(t)(300/14.82116).*exp(-0.24197.*t);
plot(t(1:9),c(1:9),'r*',[0.25:0.1:8],f([0.25:0.1:8]),'k')
运行程序,得到散点图和拟合曲线图如下:
三、制定给药方案
假设:
每次注射剂量D,间隔时间。
血药浓度应。
初次剂量应加大。
给药方案记为:,则:
将代入计算得:
。
故可制定给药方案:
D0=370.5mg,D=222.3mg,t=3.8h,
即首次注射mg,其余每次注射mg,注射的间隔时间为h。
用Lingo软件求解非线性曲线拟合,不需要给定初始值,弥补了Matlab软件的不足,同时,程序简单,结果可靠,是求解非线性曲线拟合的一种比较好的方法,但是Lingo软件不会作图,无法展示散点图和拟合曲线图,此时可借助Matlab软件来解决。综上所述,对于求解非线性曲线拟合,最好将Lingo软件与Matlab软件两者结合起来使用,各取所长。
【参考文献】
[1]章绍辉.数学建模[M].北京:科学出版社,2009.
[2]刘保东,宿洁,陈建良.数学建模基础教程[M].北京:高等教育出版社,2015.
[3]袁新生,邵大宏,郁时炼.LINGO和Excel在数学建模中的应用[M].北京:科学出版社,2007.