24小时热门版块排行榜    

查看: 774  |  回复: 4

你的CEO

铁虫 (小有名气)

[求助] 动力学参数拟合matlab程序有问题 已有1人参与

求大神帮看下程序问题在哪?
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

未来为你而来!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

你的CEO

铁虫 (小有名气)

程序如下 :

function PX4800602


clear all
clc
global x0
% k0 = [1.8887    0.0036    0.0070    0.7557    0.1455];
% k0 = [4.4163008451    0.0033686022     0.0065669052   1.6201160059   16.2647816];
k0= [ 5.2766233638  0.0030934069    0.0060459974    1.8656945060   20.6241874];

% 参数初值
lb = [0  0  0  0 0];                   % 参数下限
ub = [+inf  +inf  +inf  +inf  +inf ];    % 参数上限
x0 = [0 0 0 0 0 0];
tspn=[0   43.2  72];


% yexp =[0 0 0 0 0;0.2282 0.2067 0.0057 0.0025 0.0132;0.2394 0.2170 0.0063 0.0037 0.0123; 0.2515 0.2278 0.0069 0.0040        0.0128;0.2638 0.2378 0.0081        0.0043        0.0135;0.2738109        0.2461347        0.0049171        0.011883        0.01087607];                   % yexp: 实验数据

% yexp =[0 0 0 0 0;22.81824        20.67075        0.571198 0.253676                1.322614; 23.94047        21.7016        0.633422 0.372055                1.233396;25.14798        22.77878        0.692198 0.39614        1.280859;26.37669        23.78016        0.811828 0.432807                1.351893;27.38109        24.61347        0.8883        0.49171        1.387607]*0.01;                   % yexp: 实验数据

yexp=[0         0       0       0       0     0;
     22.253         20.067         0.340         0.633         1.213 53.06753634;
     23.532         21.175         0.385         0.662         1.310 50.31636493];
   
% yexp=[0 0 0 0 0 0;23.679         21.655         0.421         0.715         0.888 50.9; 24.415         22.131         0.463         0.724         1.096 48.978;25.148         22.580         0.481         0.751         1.336 47.073;26.377         23.580         0.564         0.869         1.364 44.518;27.110         23.948         0.594         1.177         1.392 43;
%     15.51 14.1        0.2476        0.545        0.614 67.75;15.78 14.24        0.265        0.6352        0.632 67.18;16.4 14.51        0.292        0.672        0.937 65.32;]*0.01;  % yexp: 两个配比
% yexp=[0 0 0 0 0 0;23.679         21.655         0.421         0.715         0.888 50.9; 24.415         22.131         0.463         0.724         1.096 48.978;25.148         22.580         0.481         0.751         1.336 47.073;26.377         23.580         0.564         0.869         1.364 44.518;27.110         23.948         0.594         1.177         1.392 43;] % yexp: 一个配比
% 使用函数lsqnonlin()进行参数估计
[k,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(@ObjFunc4LNL,k0,lb,ub,optimset('TolFun',1.0000e-12),x0,yexp);   
ci = nlparci(k,residual,jacobian)
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\tk1 = %.10f ± %.7f\n',k(1),ci(1,2)-k(1))
fprintf('\tk2 = %.10f ± %.7f\n',k(2),ci(2,2)-k(2))
fprintf('\tk3 = %.10f ± %.7f\n',k(3),ci(3,2)-k(3))
fprintf('\tk4 = %.10f ± %.7f\n',k(4),ci(4,2)-k(4))
fprintf('\tk5 = %.7f ± %.7f\n',k(5),ci(5,2)-k(5))
% fprintf('\tk6 = %.7f ± %.7f\n',k(4),ci(6,2)-k(6))
fprintf('  The sum of the squares is: %.1e\n\n',resnorm)



% ------------------------------------------------------------------
function f = ObjFunc4LNL(k,x0,yexp)
tspn=[0 43.2 72];
[t x] = ode45(@KineticEqs1,tspn,x0,[],k);
y = x
f1 = y(2:3,1) - yexp(2:3,1);
f2 = y(2:3,2) - yexp(2:3,2);
f3 = y(2:3,3) - yexp(2:3,3);
f4 = y(2:3,4) - yexp(2:3,4);
f5 = y(2:3,5) - yexp(2:3,5);
f6 = y(2:3,6) - yexp(2:3,6);
z1=x

% -------------------------------------------不同配比的方程组
function dxdt = KineticEqs1(t,x,k)
p0=1.3*1;
dxdt =  ...
[(k(1)*(2*p0*(1-x(1))/(19+0.5*x(6)))*(1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6)))
(k(1)*(2*p0*(1-x(1))/(19+0.5*x(6)))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6)))-2*(k(2)+k(3))*p0*x(2)/(19+0.5*x(6))-2*k(4)*p0*x(2)/(19+0.5*x(6))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
  (2*k(2)*p0*x(2)/(19+0.5*x(6))-2*k(4)*p0*x(3)/(19+0.5*x(6))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
   (2*k(3)*p0*x(2)/(19+0.5*x(6))-2*k(4)*p0*x(4)/(19+0.5*x(6))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
   (k(4)*(2*(x(2)+x(3)+x(4))*p0/(19+0.5*x(6)))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
   (2*k(5)*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6)))^2)
   ];
未来为你而来!
2楼2015-10-10 13:49:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

你的CEO

铁虫 (小有名气)

??? Error using ==> feval
Output argument "f" (and maybe others) not assigned during call to
"C:\Users\cai\Desktop\Matlab模拟\PX程序\PX新动力学\拟合程序\PX480602.m>ObjFunc4LNL".

**********错误提示*****************

Error in ==> lsqnonlin at 203
            initVals.F = feval(funfcn{3},xCurrent,varargin{:});

Error in ==> PX480602 at 30
[k,resnorm,residual,exitflag,output,lambda,jacobian] =
lsqnonlin(@ObjFunc4LNL,k0,lb,ub,optimset('TolFun',1.0000e-12),x0,yexp);

Caused by:
    Failure in initial user-supplied objective function evaluation. LSQNONLIN cannot continue.
未来为你而来!
3楼2015-10-10 13:50:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
你的CEO: 金币+10, 有帮助, 感谢 2015-10-18 16:59:24
引用回帖:
3楼: Originally posted by 你的CEO at 2015-10-10 13:50:13
??? Error using ==> feval
Output argument "f" (and maybe others) not assigned during call to
"C:\Users\cai\Desktop\Matlab模拟\PX程序\PX新动力学\拟合程序\PX480602.m>ObjFunc4LNL& ...

第55行加一句:
f=[f1;f2;f3;f4;f5;f6];

修改后代码如下,已经可以运行:
CODE:
function PX4800602


clear all
clc
global x0
% k0 = [1.8887    0.0036    0.0070    0.7557    0.1455];
% k0 = [4.4163008451    0.0033686022     0.0065669052   1.6201160059   16.2647816];
k0= [ 5.2766233638  0.0030934069    0.0060459974    1.8656945060   20.6241874];

% 参数初值
lb = [0  0  0  0 0];                   % 参数下限
ub = [+inf  +inf  +inf  +inf  +inf ];    % 参数上限
x0 = [0 0 0 0 0 0];
tspn=[0   43.2  72];


% yexp =[0 0 0 0 0;0.2282 0.2067 0.0057 0.0025 0.0132;0.2394 0.2170 0.0063 0.0037 0.0123; 0.2515 0.2278 0.0069 0.0040        0.0128;0.2638 0.2378 0.0081        0.0043        0.0135;0.2738109        0.2461347        0.0049171        0.011883        0.01087607];                   % yexp: 实验数据

% yexp =[0 0 0 0 0;22.81824        20.67075        0.571198 0.253676                1.322614; 23.94047        21.7016        0.633422 0.372055                1.233396;25.14798        22.77878        0.692198 0.39614        1.280859;26.37669        23.78016        0.811828 0.432807                1.351893;27.38109        24.61347        0.8883        0.49171        1.387607]*0.01;                   % yexp: 实验数据

yexp=[0         0       0       0       0     0;
     22.253         20.067         0.340         0.633         1.213 53.06753634;
     23.532         21.175         0.385         0.662         1.310 50.31636493];
   
% yexp=[0 0 0 0 0 0;23.679         21.655         0.421         0.715         0.888 50.9; 24.415         22.131         0.463         0.724         1.096 48.978;25.148         22.580         0.481         0.751         1.336 47.073;26.377         23.580         0.564         0.869         1.364 44.518;27.110         23.948         0.594         1.177         1.392 43;
%     15.51 14.1        0.2476        0.545        0.614 67.75;15.78 14.24        0.265        0.6352        0.632 67.18;16.4 14.51        0.292        0.672        0.937 65.32;]*0.01;  % yexp: 两个配比
% yexp=[0 0 0 0 0 0;23.679         21.655         0.421         0.715         0.888 50.9; 24.415         22.131         0.463         0.724         1.096 48.978;25.148         22.580         0.481         0.751         1.336 47.073;26.377         23.580         0.564         0.869         1.364 44.518;27.110         23.948         0.594         1.177         1.392 43;] % yexp: 一个配比
% 使用函数lsqnonlin()进行参数估计
[k,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(@ObjFunc4LNL,k0,lb,ub,optimset('TolFun',1.0000e-12),x0,yexp);   
ci = nlparci(k,residual,jacobian);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\tk1 = %.10f ± %.7f\n',k(1),ci(1,2)-k(1))
fprintf('\tk2 = %.10f ± %.7f\n',k(2),ci(2,2)-k(2))
fprintf('\tk3 = %.10f ± %.7f\n',k(3),ci(3,2)-k(3))
fprintf('\tk4 = %.10f ± %.7f\n',k(4),ci(4,2)-k(4))
fprintf('\tk5 = %.7f ± %.7f\n',k(5),ci(5,2)-k(5))
% fprintf('\tk6 = %.7f ± %.7f\n',k(4),ci(6,2)-k(6))
fprintf('  The sum of the squares is: %.1e\n\n',resnorm)



% ------------------------------------------------------------------
function f = ObjFunc4LNL(k,x0,yexp)
tspn=[0 43.2 72];
[t x] = ode45(@KineticEqs1,tspn,x0,[],k);
y = x;
f1 = y(2:3,1) - yexp(2:3,1);
f2 = y(2:3,2) - yexp(2:3,2);
f3 = y(2:3,3) - yexp(2:3,3);
f4 = y(2:3,4) - yexp(2:3,4);
f5 = y(2:3,5) - yexp(2:3,5);
f6 = y(2:3,6) - yexp(2:3,6);
z1=x;
f=[f1;f2;f3;f4;f5;f6];
% -------------------------------------------不同配比的方程组
function dxdt = KineticEqs1(t,x,k)
p0=1.3*1;
dxdt =  ...
[(k(1)*(2*p0*(1-x(1))/(19+0.5*x(6)))*(1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6)))
(k(1)*(2*p0*(1-x(1))/(19+0.5*x(6)))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6)))-2*(k(2)+k(3))*p0*x(2)/(19+0.5*x(6))-2*k(4)*p0*x(2)/(19+0.5*x(6))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
  (2*k(2)*p0*x(2)/(19+0.5*x(6))-2*k(4)*p0*x(3)/(19+0.5*x(6))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
   (2*k(3)*p0*x(2)/(19+0.5*x(6))-2*k(4)*p0*x(4)/(19+0.5*x(6))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
   (k(4)*(2*(x(2)+x(3)+x(4))*p0/(19+0.5*x(6)))*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6))))
   (2*k(5)*((1-2*x(1)-2*x(5)-x(6))*p0/(19+0.5*x(6)))^2)
   ];

MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
4楼2015-10-10 14:35:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

你的CEO

铁虫 (小有名气)

引用回帖:
4楼: Originally posted by 月只蓝 at 2015-10-10 14:35:18
第55行加一句:
f=;

修改后代码如下,已经可以运行:
function PX4800602


clear all
clc
global x0
% k0 = ;
% k0 = ;
k0= ;

% 参数初值
lb = ;                   % 参数下限
ub = ;    % ...

谢谢你,最近才登陆小木虫,可结果有问题呀,这是怎么回事,版主能看出来么

使用函数lsqnonlin()估计得到的参数值为:
        k1 = 0.0000000000 ± NaN
        k2 = 0.0001911071 ± NaN
        k3 = 0.0002896392 ± NaN
        k4 = 1.2592825422 ± NaN
        k5 = 19013.6021392 ± 30461010122.0232390
  The sum of the squares is: 7.0e+003
未来为你而来!
5楼2015-10-18 16:59:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 你的CEO 的主题更新
信息提示
请填处理意见