24小时热门版块排行榜    

查看: 696  |  回复: 1

sara_ecust

新虫 (小有名气)

[求助] matlab问题已有1人参与

Solver stopped prematurely.

lsqnonlin stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 400 (the default value).
程序运行后出现这个问题如何解决?
下面是程序:
function octene300
clear all;clc
format long;
global WF0 x PA0 PB0
F0=[15 17.5 20 22.5 25];
WF01=0.01./0.75*112/0.2./F0;
WF02=0.01./0.75*112/0.15./F0;
WF03=0.01./0.75*112/0.2./F0;
WF0=[WF01;WF02;WF03];
x1=[0.706437072 0.664245006 0.646259394 0.621726302 0.592621525];
x2=[0.718029406 0.68794238 0.671240637 0.6540687 0.611399535];
x3=[0.741205864 0.715903989 0.690602114 0.663064058 0.635526002];
x=[x1;x2;x3];
PA01=10.94593968;
PA02=8.105903925;
PA03=10.87159518;
PA0=[PA01 PA02 PA03];
PB01=0.480085074;
PB02=0;
PB03=0;
PB0=[PB01 PB02 PB03];




beta0=[1 1 1 1 1];
lb=[0 0 0 0 0];
ub=[inf inf inf inf inf];
[beta,resnorm,resid,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@OptObjFunc,beta0,lb,ub,[])
ci = nlparci(beta,resid,jacobian);
beta

%拟合效果图(实验与拟合的比较)
WF0c1=KineticsEqs(beta,x(1,,PA0(1),PB0(1));
F0c1=0.01*112./WF0c1/0.75/0.2;
WF0c2=KineticsEqs(beta,x(2,,PA0(2),PB0(2));
F0c2=0.01*112./WF0c2/0.75/0.15;
WF0c3=KineticsEqs(beta,x(3,,PA0(3),PB0(3));
F0c3=0.01*112./WF0c3/0.75/0.2;
plot(F0c1,x1,'k-',F0c2,x2,'r-',F0c3,x3,'g-',F0,x1,'ko', F0,x2,'ro', F0,x3,'go')
legend('0.2-0.15','0.15-0','0.2-0');xlabel('Flow rate of model oil  mL/h','FontSize',12);ylabel('1-octene Conversion','FontSize',12); xlim([10, 30]);
figure
plot(F0,F0,'k-',F0,F0c1,'bo',F0,F0c2,'go',F0,F0c3','ro')



% 残差关于拟合值的残差图
figure
plot(WF0c1,resid(:,1),'*',WF0c2,resid(:,2),'*',WF0c3,resid(:,3),'*')
xlabel('WF0')
ylabel('残差R')
refline(0,0)


% 参数辨识结果
fprintf('Estimated Parameters:\n')
fprintf('\tk = %.4f ± %.4f\n',beta(1),ci(1,2)-beta(1))
fprintf('\tn = %.2f ± %.2f\n',beta(2),ci(2,2)-beta(2))
fprintf('\ts = %.2f ± %.2f\n',beta(3),ci(3,2)-beta(3))
fprintf('\tq = %.2f ± %.2f\n',beta(4),ci(4,2)-beta(4))
fprintf('\tp = %.2f ± %.2f\n',beta(5),ci(5,2)-beta(5))
% ------------------------------------------------------------------
function f = OptObjFunc(beta,x,WF0)
global WF0 x PA0 PB0
WF1=KineticsEqs(beta,x(1,,PA0(1),PB0(1));
WF2=KineticsEqs(beta,x(2,,PA0(2),PB0(2));
WF3=KineticsEqs(beta,x(3,,PA0(3),PB0(3));
f1=WF0(1,-WF1;
f2=WF0(2,-WF2;
f3=WF0(3,-WF3;
f=[f1 f2 f3]


% ------------------------------------------------------------------
function WF = KineticsEqs(beta,x,PA0,PB0)
WF=(1+beta(4).*PB0)/(beta(1)+beta(2))/beta(3)./PA0.*log(1./(1-x))+x./(beta(1)+beta(2))+(beta(4)*0.22987+beta(5)-beta(5)*0.22987)/(beta(1)+beta(2))/beta(3).*(-x-log(1-x));
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

CelestialCYJ

木虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
sara_ecust: 金币+20, ★★★★★最佳答案 2015-01-03 22:36:13
添加代码options=optimoptions(@lsqnonlin,'MaxFunEvals',1000);~~~~~~~~~~修改代码lsqnonlin(@OptObjFunc,beta0,lb,ub,options)
2楼2014-12-28 15:28:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sara_ecust 的主题更新
信息提示
请填处理意见