回 帖 发 新 帖 刷新版面

主题:新手紧急求助!matlab拟合三元非线性曲线!

Lnr1X1=-H/R*(1/T-1/Tm)
已知;
R,T,Tm,H,X
Wilson模型:
Lnr1=-ln{X1+X2*exp[-(g12-g11)/(RT)]+X3*exp[-(g13-g11)/(RT)]}+1-X1/{X1+X2*exp[-(g12-g11)/(RT)]+X3*exp[-(g13-g11)/(RT)]}-{X2*exp[-(g21-g22)/(RT)]}/{X1*exp[-(g21-g22)/(RT)]+X2+X3*exp[-(g23-g22)/(RT)]}-{X3*exp[-(g31-g33)/(RT)]}/{X1*exp[-(g31-g33)/(RT)]+X2*exp[-(g32-33)/(RT)]+X3}
Lnr1=dHm/R*(1/Tm-1/T)-lnX1
求:
G12-g11    G21-g22    G23-g22    G32-g33    G13-g11    G31-g33
                    

NRTL:
Lnr1={(g21-g11)/(RT)*exp[-0.3(g21-g11)/(RT)]*X2+(g31-g11)/(RT)*exp[-0.3(g31-g11)/(RT)]*X3}/{X1+exp[-0.3(g21-g11)/(RT)]*X2+exp[-0.3(g31-g11)/(RT)]*X3}
+X1/{X1+exp[-0.3(g21-g11)/(RT)]*X2+exp[-0.3(g31-g11)/(RT)]*X3}*{-{X2*(g21-g11)/(RT)*exp[-0.3(g21-g11)/(RT)]+X3(g31-g11)/(RT)*exp[-0.3(g31-g11)/(RT)]}/{X1+exp[-0.3(g21-g11)/(RT)*X2+exp[-0.3(g31-g11)/(RT)]*X3}}
+{X2*exp[-0.3(g12-g22)/(RT)]}/{exp[-0.3(g12-g22)/(RT)]*X1+X2+exp[-0.3(g32-g22)/(RT)]*X3}*{(g12-g22)/(RT)-{X1(g12-g22)/(RT)*exp[-0.3(g12-g22)/(RT)]+X3(g32-g22)/(RT)*exp[-0.3(g32-g22)/(RT)]}/{exp[-0.3(g12-g22)/(RT)*X1+X2+exp[-0.3(g32-g22)/(RT)]*X3}}
+{X3*exp[-0.3(g13-g33)/(RT)]}/{exp[-0.3(g13-g33)/(RT)]*X1+exp[-0.3(g23-g33)/(RT)]*X2+X3}*{(g13-g33)/(RT)-{X1(g13-g33)/(RT)*exp[-0.3(g13-g33)/(RT)]+X2(g23-g33)/(RT)*exp[-0.3(g23-g33)/(RT)]}/{exp[-0.3(g13-g33)/(RT)*X1+exp[-0.3(g23-g33)/(RT)]*X2+X3}}
求:
G12-g22    G21-g11    G23-g33    G32-g22    G13-g33    G31-g11
                    

拜托大家啦!快来帮帮忙吧!

回复列表 (共6个回复)

沙发

这是我编的程序,为什么运行不了呢?哪位帮我改改错吧,拜托啦!
function wilson
x1=[0.147049039,0.131086539,0.157613152,0.180129431,0.207201277,0.22746969,0.255415251,0.099481423,0.117878776,0.137541922,0.154620434,0.177639128,0.191054291,0.214879884,0.077743014,0.092163476,0.103572331,0.116350176,0.129210867,0.140870207,0.155272458,0.068726596,0.078135143,0.091191526,0.101048452,0.109127287,0.119329425,0.131480142]';
x2=[0.852950961,0.868913461,0.842386848,0.819870569,0.792798723,0.77253031,0.744584749,0.766017544,0.750368011,0.733641742,0.719114069,0.699533437,0.688121956,0.667854943,0.580501157,0.571424409,0.564243272,0.556200445,0.548105471,0.54076667,0.531701384,0.507774972,0.502644981,0.495526014,0.490151545,0.485746576,0.48018388,0.473558726]';
x3=[0,0,0,0,0,0,0,0.134501034,0.131753214,0.128816335,0.126265497,0.122827435,0.120823753,0.117265173,0.341755828,0.336412115,0.332184397,0.327449379,0.322683662,0.318363123,0.313026158,0.423498432,0.419219876,0.41328246,0.408800004,0.405126137,0.400486695,0.394961132]';
y=[1.916941284,2.031857439,1.847578254,1.714052235,1.574042537,1.480721213,1.36485203,2.307736492,2.138058372,1.983793119,1.866754586,1.727979087,1.655180579,1.537663491,2.554298714,2.38415123,2.267451659,2.151123488,2.046287511,1.959899261,1.862561318,2.677571155,2.549275221,2.394759903,2.292127768,2.215218238,2.125850267,2.028886858]';
x=[x1,x2,x3]
beta0=[1 1 1 1 1 1]
A=nlinfit(x,y,@myfunc,beta0)
function yhat=myfunc(a,x)
yhat=-log(x(:,1)+x(:,2)*exp(a(1))+x(:,3)*exp(a(2)))+1-x(:,1)/(x(:,1)+x(:,2)*exp(a(1))+x(:,3)*exp(a(2)))-x(:,2)*exp(a(3))/(x(:,1)*exp(a(3))+x(:,2)+x(:,3)*exp(a(4)))-x(:,3)*exp(a(5))/(x(:,1)*exp(a(5))+x(:,2)*exp(a(6))+x(:,3));

function nrtl
clear all;clc
x1=[0.147049039,0.131086539,0.157613152,0.180129431,0.207201277,0.22746969,0.255415251,0.099481423,0.117878776,0.137541922,0.154620434,0.177639128,0.191054291,0.214879884,0.077743014,0.092163476,0.103572331,0.116350176,0.129210867,0.140870207,0.155272458,0.068726596,0.078135143,0.091191526,0.101048452,0.109127287,0.119329425,0.131480142]';
x2=[0.852950961,0.868913461,0.842386848,0.819870569,0.792798723,0.77253031,0.744584749,0.766017544,0.750368011,0.733641742,0.719114069,0.699533437,0.688121956,0.667854943,0.580501157,0.571424409,0.564243272,0.556200445,0.548105471,0.54076667,0.531701384,0.507774972,0.502644981,0.495526014,0.490151545,0.485746576,0.48018388,0.473558726]';
x3=[0,0,0,0,0,0,0,0.134501034,0.131753214,0.128816335,0.126265497,0.122827435,0.120823753,0.117265173,0.341755828,0.336412115,0.332184397,0.327449379,0.322683662,0.318363123,0.313026158,0.423498432,0.419219876,0.41328246,0.408800004,0.405126137,0.400486695,0.394961132 ]';
y=[1.916941284,2.031857439,1.847578254,1.714052235,1.574042537,1.480721213,1.36485203,2.307736492,2.138058372,1.983793119,1.866754586,1.727979087,1.655180579,1.537663491,2.554298714,2.38415123,2.267451659,2.151123488,2.046287511,1.959899261,1.862561318,2.677571155,2.549275221,2.394759903,2.292127768,2.215218238,2.125850267,2.028886858]';
x=[x1,x2,x3]
beta0=[1,1,1,1,1,1]
A=nlinfit(x,y,@myfun,beta0)
function yhat=myfun(a,x)
yhat=(a(1)*exp(-0.3*a(1))*x(:,2)+a(2)*exp(-0.3*a(2))*x(:,3))/((x:,1)+exp(-0.3*a(1))*x(:,2)+exp(-0.3*a(2))*x(:,3))
+x(:,1)./(x(:,1)+exp(-0.3*a(1))*x(:,2)+exp(-0.3a(2))*x(:,3))*(-(x(:,2).*a(1)*exp(-0.3*a(1))+x(:,3).*a(2)*exp(-0.3*a(2)))/(x(:,1)+exp(-0.3*a(1))*x(:,2)+exp(-0.3*a(2))*x(:,3)))
+x(:,2).*exp(-0.3*a(3))/(exp(-0.3*a(3))*x(:,1)+x(:,2)+exp(-0.3*a(4))*x(:,3))*(a(3)-(x(:,1).*a(3)*exp(-0.3*a(3))+x(:,3).*a(4)*exp(-0.3*a(4)))/(exp(-0.3*a(4))*x(:,1)+x(:,2)+exp(-0.3*a(4))*x(:,3)))
+x(:,3).*exp(-0.3*a(5))/(exp(-0.3*a(5))*x(:,1)+exp(-0.3*a(6))*x(:,2)+x(:,3))*(a(5)-(x(:,1).*a(5)*exp(-0.3*a(5))+x(:,2).*a(6)*exp(-0.3*a(6)))/(exp(-0.3*a(5))*x(:,1)+exp(-0.3*a(6))*x(:,2)+x(:,3))); 




板凳

那个nrtl模型我已经搞定了,大家帮我看看这个wilson的究竟哪有问题吧,谢啦!
function wilson 
clear all;clc 
x1=[0.147049039,0.131086539,0.157613152,0.180129431,0.207201277,0.22746969,0.255415251,0.099481423,0.117878776,0.137541922,0.154620434,0.177639128,0.191054291,0.214879884,0.077743014,0.092163476,0.103572331,0.116350176,0.129210867,0.140870207,0.155272458,0.068726596,0.078135143,0.091191526,0.101048452,0.109127287,0.119329425,0.131480142]'; 
x2=[0.852950961,0.868913461,0.842386848,0.819870569,0.792798723,0.77253031,0.744584749,0.766017544,0.750368011,0.733641742,0.719114069,0.699533437,0.688121956,0.667854943,0.580501157,0.571424409,0.564243272,0.556200445,0.548105471,0.54076667,0.531701384,0.507774972,0.502644981,0.495526014,0.490151545,0.485746576,0.48018388,0.473558726]'; 
x3=[0,0,0,0,0,0,0,0.134501034,0.131753214,0.128816335,0.126265497,0.122827435,0.120823753,0.117265173,0.341755828,0.336412115,0.332184397,0.327449379,0.322683662,0.318363123,0.313026158,0.423498432,0.419219876,0.41328246,0.408800004,0.405126137,0.400486695,0.394961132]'; 
y=[1.916941284,2.031857439,1.847578254,1.714052235,1.574042537,1.480721213,1.36485203,2.307736492,2.138058372,1.983793119,1.866754586,1.727979087,1.655180579,1.537663491,2.554298714,2.38415123,2.267451659,2.151123488,2.046287511,1.959899261,1.862561318,2.677571155,2.549275221,2.394759903,2.292127768,2.215218238,2.125850267,2.028886858]'; 
x=[x1,x2,x3]; 
beta0=[1,1,1,1,1,1]; 
a=nlinfit(x,y,@myfun,beta0) 
function yhat=myfun(a,x) 
yhat=1-log(x(:,1)+x(:,2)*exp(a(1))+x(:,3)*exp(a(2)))... 
-x(:,1)./(x(:,1)+x(:,2)*exp(a(1))+x(:,3)*exp(a(2)))... 
-(x(:,2)*exp(a(3)))./(x(:,1)*exp(a(3))+x(:,2)+x(:,3)*exp(a(4)))... 
-(x(:,3)*exp(a(5)))./(x(:,1)*exp(a(5))+x(:,2)*exp(a(6))+x(:,3));

运行后显示:
??? Error using ==> nlinfit>checkFunVals
MODELFUN has returned Inf or NaN values.

Error in ==> nlinfit at 201
    if funValCheck && ~isfinite(sse), checkFunVals(r); end

Error in ==> wilson at 9
a=nlinfit(x,y,@myfun,beta0) 

3 楼

a=[-6.6802487, -10.920982, -11.453630,  2.1981577, -12.058205, -2.1985611]
但该模型有些问题:
一是其中出现x(:,1)./x(:,1),毫无意义;
二是很多参数是在指数内,纯属多余。

4 楼

我已经发现是我的初值有问题了,请问初值应该取多少,有什么好的取初值的办法吗?

5 楼

我不知你对nrtl模型是如何搞定的?因你提供的模型有很多错误。
我把该模型作了修正(不知正确与否?):
function yhat=myfun(a,x1,x2,x3)
yhat=(a(1)*exp(-0.3*a(1))*x2+a(2)*exp(-0.3*a(2))*x3)./((x1+exp(-0.3*a(1))*x2+exp(-0.3*a(2))*x3)...
+x1./(x1+exp(-0.3*a(1))*x2+exp(-0.3*a(2))*x3).*(-(a(1)*x2.*exp(-0.3*a(1))+x3.*a(2)*exp(-0.3*a(2)))./(x1+exp(-0.3*a(1))*x2+exp(-0.3*a(2))*x3))...
+x2.*exp(-0.3*a(3))./(exp(-0.3*a(3))*x1+x2+exp(-0.3*a(4))*x3).*(a(3)-(a(3)*x1.*exp(-0.3*a(3))+a(4)*x3.*exp(-0.3*a(4)))./(exp(-0.3*a(4))*x1+x2+exp(-0.3*a(4))*x3))...
+x3.*exp(-0.3*a(5))./(exp(-0.3*a(5))*x1+exp(-0.3*a(6))*x2+x3).*(a(5)-(x1.*a(5)*exp(-0.3*a(5))+a(6)*x2.*exp(-0.3*a(6)))./(exp(-0.3*a(5))*x1+exp(-0.3*a(6))*x2+x3)));
据上述模型,该组数据的参数解 a 似为: 
a=[.85152110,  .75550926, -.48099580, -.83134165, -.53049248,  .90568456]
RSS=.2434808109e-2
R^2=0.9992

6 楼

若模型如下:
function yhat=myfun(a,x1,x2,x3)
yhat=(a(1)*exp(-0.3*a(1))*x2+a(2)*exp(-0.3*a(2))*x3)./(x1+exp(-0.3*a(1))*x2+exp(-0.3*a(2))*x3)...
+x1./(x1+exp(-0.3*a(1))*x2+exp(-0.3*a(2))*x3).*(-(a(1)*x2.*exp(-0.3*a(1))+x3.*a(2)*exp(-0.3*a(2)))./(x1+exp(-0.3*a(1))*x2+exp(-0.3*a(2))*x3))...
+x2.*exp(-0.3*a(3))./(exp(-0.3*a(3))*x1+x2+exp(-0.3*a(4))*x3).*(a(3)-(a(3)*x1.*exp(-0.3*a(3))+a(4)*x3.*exp(-0.3*a(4)))./(exp(-0.3*a(4))*x1+x2+exp(-0.3*a(4))*x3))...
+x3.*exp(-0.3*a(5))./(exp(-0.3*a(5))*x1+exp(-0.3*a(6))*x2+x3).*(a(5)-(x1.*a(5)*exp(-0.3*a(5))+a(6)*x2.*exp(-0.3*a(6)))./(exp(-0.3*a(5))*x1+exp(-0.3*a(6))*x2+x3));
则:a=[2.7957329,  21711024.,  9.9574062,  2.9068183, -4.0177678, -7.4215685]
RSS =.1121288192e-2
R^2 = 0.9996

我来回复

您尚未登录,请登录后再回复。点此登录或注册