求助代謝動(dòng)力學(xué)系數(shù)模擬代碼 1stOpt或者M(jìn)ATLAB
求代謝動(dòng)力學(xué)系數(shù)模擬
一級(jí)代謝物的動(dòng)力學(xué)方程:dC2/dt=k1*C1-k2*C2
初始條件:t=0,C2=0
且C1=exp(-A*t)。A=0.2779
我嘗試了用1stOpt(破解版)和MATLAB ODE方法,都沒成功,想請(qǐng)教一下大神。
另外t不是嚴(yán)格的等差數(shù)列,取值如: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使用函數(shù)lsqnonlin()估計(jì)得到的參數(shù)值為:\n')
fprintf('\t待擬合參數(shù) k1 = %.6f\n',k(1))
fprintf('\t待擬合參數(shù) 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決定系數(shù)R-Square = %.6f',R2);
figure(1)
plot(ts,ys,'b',tspan,yy,'or'),legend('計(jì)算值','實(shí)驗(yàn)值','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;
求求啦,被這個(gè)問題卡了兩個(gè)多月了,不知道怎么解出k1 k2
返回小木蟲查看更多
京公網(wǎng)安備 11010802022153號(hào)
我想買一個(gè)5.0以上版本的,結(jié)果入手了一個(gè)5.0的破解版,這個(gè)程序好像也運(yùn)行不了。
哥你能幫我算一次嗎?
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
我按教程寫成這樣了,應(yīng)該沒問題吧?就是算不出結(jié)果。
這是免費(fèi)的試用版,你這被人忽悠了啊,最新版已經(jīng)到9.0了,而且只能去官網(wǎng)購買。
均方差(RMSE): 0.0171691634594409
殘差平方和(SSR): 0.00324258191286701
相關(guān)系數(shù)(R): 0.802484090026993
相關(guān)系數(shù)之平方(R^2): 0.64398071474645
修正R平方(Adj. R^2): 0.554975893433063
確定系數(shù)(DC): 0.468028249120648
F統(tǒng)計(jì)(F-Statistic): 23.5213130305514
參數(shù) 最佳估算
-------------------- -------------
k1 0.13256115104059
k2 0.358504426638858
====== 結(jié)果輸出 ======
文件: 數(shù)據(jù)文件-1
No x 目標(biāo) y 計(jì)算 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
,
用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
};
目標(biāo)函數(shù)(_k1,_k2 : i,s,tyz : tyArray,tA,max,k1,k2)=
{
k1=_k1, k2=_k2, //傳遞優(yōu)化變量
//最后一個(gè)參數(shù)50表示gsl_ode函數(shù)在計(jì)算時(shí),最多循環(huán)計(jì)算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{ //存放實(shí)驗(yàn)數(shù)據(jù)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函數(shù)取矩陣的行數(shù),tA取矩陣的列
Opt1[@目標(biāo)函數(shù)] //Opt1函數(shù)全局優(yōu)化
};
結(jié)果:
0.1325616120497096 0.358508535326814 3.242596823546582e-003