当前位置: 首页 > 计算模拟 >求助代谢动力学系数模拟代码 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 返回小木虫查看更多

今日热帖
  • 精华评论
  • Evoly_z

    引用回帖:
    8楼: Originally posted by 独孤神宇 at 2021-03-25 13:37:38
    1stOpt需要4.0以上版本,你将数据附上就行了
    ...

    我想买一个5.0以上版本的,结果入手了一个5.0的破解版,这个程序好像也运行不了。

    哥你能帮我算一次吗?

    Variable x, y;
    ODEFunction y'= k1*(0.701*exp(-3.211*x)+0.299*exp(-0.067*x))-k2*y;
    Data;
    //x, y
    0         0
    0.33      0.061043
    1         0.03675
    2         0.05932
    4         0.095993
    6         0.072057
    10        0.05085
    15        0.04678
    24        0.047673
    30        0.034973
    48        0.030375
    72        0

    我按教程写成这样了,应该没问题吧?就是算不出结果。

  • 独孤神宇

    引用回帖:
    9楼: Originally posted by Evoly_z at 2021-03-30 01:33:28
    我想买一个5.0以上版本的,结果入手了一个5.0的破解版,这个程序好像也运行不了。

    哥你能帮我算一次吗?

    Variable x, y;
    ODEFunction y'= k1*(0.701*exp(-3.211*x)+0.299*exp(-0.067*x))-k2*y;
    Data;
      ...

    这是免费的试用版,你这被人忽悠了啊,最新版已经到9.0了,而且只能去官网购买。


    均方差(RMSE): 0.0171691634594409
    残差平方和(SSR): 0.00324258191286701
    相关系数(R): 0.802484090026993
    相关系数之平方(R^2): 0.64398071474645
    修正R平方(Adj. R^2): 0.554975893433063
    确定系数(DC): 0.468028249120648
    F统计(F-Statistic): 23.5213130305514

    参数                  最佳估算
    --------------------        -------------
    k1        0.13256115104059
    k2        0.358504426638858

    ====== 结果输出 ======

    文件: 数据文件-1
    No        x        目标 y        计算 y
    1        0.33        0.061043        0.0298491702527491
    2        1        0.03675        0.053602315170092
    3        2        0.05932        0.0683875960100214
    4        4        0.095993        0.079360928514414
    5        6        0.072057        0.0789300799888936
    6        10        0.05085        0.0667093831255373
    7        15        0.04678        0.0492934543907035
    8        24        0.047673        0.02721397228202
    9        30        0.034973        0.0182160615899268
    10        48        0.030375        0.00545427669955797
    11        72        0        0.00109238646097193

  • wlfc

    用OpenLu求解,Lu脚本代码:
    !!!using["luopt","math"]; //使用命名空间
    f(x,y,dy, params::k1,k2)=
    {
        dy=k1*(0.701*exp(-3.211*x)+0.299*exp(-0.067*x))-k2*y,
        0 //必须返回0
    };
    目标函数(_k1,_k2 : i,s,tyz : tyArray,tA,max,k1,k2)=
    {
        k1=_k1, k2=_k2, //传递优化变量
        //最后一个参数50表示gsl_ode函数在计算时,最多循环计算50次,这样可以提高速度
        tyz=gsl_ode[@f,nil,0.0,tA,ra1(0), 1e-6, 1e-6, 2, 1e-6,50],
        i=0, s=0, while{++i<max, s=s+[tyz(i,1)-tyArray(i,1)]^2},
        s
    };
    main(::tyArray,tA,max)=
    {
        tyArray=matrix{ //存放实验数据xi,yi
            "0         0
    0.33      0.061043
    1         0.03675
    2         0.05932
    4         0.095993
    6         0.072057
    10        0.05085
    15        0.04678
    24        0.047673
    30        0.034973
    48        0.030375
    72        0"
        },
        len[tyArray,0,&max], tA=tyArray(all:0), //用len函数取矩阵的行数,tA取矩阵的列
        Opt1[@目标函数] //Opt1函数全局优化
    };

    结果:
    0.1325616120497096        0.358508535326814         3.242596823546582e-003

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