当前位置: 首页 > 计算模拟 >求助代谢动力学系数模拟代码 1stOpt或者MATLAB

求助代谢动力学系数模拟代码 1stOpt或者MATLAB

作者 Evoly_z
来源: 小木虫 500 10 举报帖子
+关注

求代谢动力学系数模拟
一级代谢物的动力学方程:dC2/dt=k1*C1-k2*C2
初始条件:t=0,C2=0
且C1=exp(-A*t)。A=0.2779

我尝试了用1stOpt(破解版)和MATLAB ODE方法,都没成功,想请教一下大神。
另外t不是严格的等差数列,取值如:t=0,1,2,4,6,10,15,24

1stOpt代码:

Title Kinetic_ave
Parameters k1[0,100], k2[0,100];
Variable t, C;

StartProgram
var i:integer;

begin
for i:=0 to DataLength -1 do begin
      if i ==0
         C=0;
         else
      C:=C[i-1]+k1*(t-t[i-1])*exp(-0.2779*t) - k2*C*(t-t[i-1]);
         end;
EndProgram;
Data;
//t    C
   0    xxx
   1    xxx
   2    xxx
   4    xxx
   6    xxx
   10  xxx
   15  xxx
   24  xxx


Matlab代码:
function ODE_ave
clear all;clc
format long
aveall;
t=T_h(;
yexp=OLEave(;

k0=[1 1];  

y0=0;
lb=[0 0];
ub=[+inf +inf];   
yy=[y0 yexp'];

tspan=0:1:24;

[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc,k0,lb,ub,[],tspan,y0,yexp);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\t待拟合参数 k1 = %.6f\n',k(1))
fprintf('\t待拟合参数 k2 = %.6f\n',k(2))
fprintf(' \t残差平方和= %.6f\n\n',resnorm)
ts=0:1:24;

[ts ys]=ode45(@KineticsEqs,ts,y0,[],k);
[ttt XXsim] = ode45(@KineticsEqs,tspan,y0,[],k);
y=XXsim(2:end);
xexp=yexp;
R2=1-sum((xexp-y).^2)./sum((xexp-mean(y)).^2);
fprintf('\n\t决定系数R-Square = %.6f',R2);
figure(1)
plot(ts,ys,'b',tspan,yy,'or'),legend('计算值','实验值','Location','best');
yr=y-yexp;
figure(2)
plot(tspan(2:end),yr,'r*',[-1 15],[0 0]),axis([-1 15 -0.5 0.5]);
figure(3)
plot(yexp,y,'ro',[21 29],[21 29],'b-');
(作图这块儿是copy的,没有做修改)
%---------------------------------------------------------
function f = ObjFunc(k,tspan,y0,yexp)           
[t Xsim] = ode45(@KineticsEqs,tspan,y0,[],k) ;
ysim = Xsim(2:end);
size(ysim);
size(yexp);
f=ysim(1,1)+ysim(2,1)+ysim(4,1)+ysim(6,1)+ysim(10,1)+ysim(15,1)+ysim(24,1) - sum(yexp(:,1));
%----------------------------------------------------------

function dydt = KineticsEqs(t,y,k)
beta(1)=k(1);
beta(2)=k(2);
dydt = beta(1)*exp(-0.2779*t)-beta(2)*y;

求求啦,被这个问题卡了两个多月了,不知道怎么解出k1 k2 返回小木虫查看更多

今日热帖
  • 精华评论
  • 独孤神宇

    参数拟合C2缺少数据
    1stOpt容易实现,1.5不支持微分方程拟合,需要下载5.0版本的

  • Evoly_z

    引用回帖:
    2楼: Originally posted by 独孤神宇 at 2021-03-24 07:20:06
    参数拟合C2缺少数据
    1stOpt容易实现,1.5不支持微分方程拟合,需要下载5.0版本的

    谢谢回复。

    有C2的数据,因为C1服从指数方程,直接把方程写在程序里了。C2的数据就写在了下面的数据表里。

    能分享5.0版的1stOpt下载么?我在网上实在找不到了,我这里也没有校内bbs之类的东西。。

    谢谢了

  • dingd

    C2数据给出来看看

  • Evoly_z

    引用回帖:
    4楼: Originally posted by dingd at 2021-03-24 16:12:00
    C2数据给出来看看

    不是数据的问题,是程序不能运行的问题。点运行之后就转圈,输出那里也没反应。

  • 独孤神宇

    将C 的数据补上就可以运行了。

    Parameters k1[0,100], k2[0,100];
    Variable t, C;
    InitialODEValue t=0,c=0;
    ODEFunction c'=k1*exp(-0.2779*t)-k2*c;
    Data;
    //t    C
       0    xxx
       1    xxx
       2    xxx
       4    xxx
       6    xxx
       10  xxx
       15  xxx
       24  xxx

  • Evoly_z

    引用回帖:
    6楼: Originally posted by 独孤神宇 at 2021-03-25 09:23:53
    将C 的数据补上就可以运行了。

    Parameters k1, k2;
    Variable t, C;
    InitialODEValue t=0,c=0;
    ODEFunction c'=k1*exp(-0.2779*t)-k2*c;
    Data;
    //t    C
       0    xxx
       1    xxx
       2    xxx
       4    x ...

    好像不对头。

    大哥加个qq啊,我好请教你�
    ,

猜你喜欢
应助之星
下载小木虫APP
与700万科研达人随时交流
  • 二维码
  • IOS
  • 安卓