||
非线性数据拟合在药物分析中经常使用,比如:
药物动力学数据;
制剂溶出数据;
酶动力学参数的计算;
Elisa数据的处理等。
matlab中有多种方式进行非线性拟合:nlinfit,cftool等,因为octave中只有nlinfit,所以基于兼容性的考虑,我们只采用nlinfit函授,该函数用法如下:
beta = nlinfit(X,Y,modelfun,beta0)
beta = nlinfit(X,Y,modelfun,beta0,options)
beta = nlinfit(___,Name,Value)
[beta,R,J,CovB,MSE,ErrorModelInfo]
= nlinfit(___)
下面是几个例子:
例子1 药物动力学中的数据拟合, 数据来自于《数理医药学杂志》,典型的药物动力学数据:
时间 | 2 | 5 | 10 | 20 | 30 | 60 | 90 | 120 | 150 | 180 | 210 |
浓度 | 766 | 659 | 470 | 300 | 239 | 180 | 160 | 145 | 132 | 123 | 112 |
下面是matlab计算过程:
%载入包文件
pkg load optim
%数据输入
t=[2 5 10 20 30 60 90 120 150 180 210];
c=[766 659 470 300 239 180 160 145 132 123 112];
% 设定拟合曲线方程
f=@(x,t) (x(1)*exp(-x(2)*t)+x(3)*exp(-x(4)*t));
% 设定初始值
b=[0 0 0 0];
% 修改迭代次数,默认次数太小
opts=statset('MaxIter',1000);
% 进行拟合
[b,r,j]=nlinfit(t,c,f,x0,opts)
就可以得到结果。
需要加以注意的是octave中MaxIter的默认值太小为400,需要修改默认参数。
例子2为药物溶出的数据,同样的方法进行weibull计算:
t=[20 25 30 35 40 50 60 90 120 180]
p=[0.046 0.11 0.19 0.22 0.27 0.31 0.42 0.59 0.72 0.86];
f=@(x,t)(1-exp(t-x(1)).^x(2)/x(3)))
nlinfit(t,p,f,x0)
就可以了。
其中主要的问题是该函数对于初始值敏感,还有就是函数定义要正确。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-27 02:02
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社