24小时热门版块排行榜    

查看: 1571  |  回复: 6
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

mushixilin

铜虫 (初入文坛)

[求助] 如何使用1stOpt进行三自变量三因变量的非线性拟合 已有2人参与

正在学习使用1stOpt,见到的示例都是只有单个因变量的非线性拟合。想要使用1stopt对三元液液相平衡的NRTL热力学数据进行拟合,由于出现三个因变量,不太确定如何编程。编写的程序如下,如不使用sharedmodel,可以得到结果,但不理想;如使用sharedmodel,软件无法计算。还望前辈可以给予一定指导。

Title "NRTL simulation";
//sharedmodel;
Parameters alpha[0,1],tau12,tau13,tau21,tau23,tau31,tau32;
Variables x1,x2,x3,y1,y2,y3;

ConstStr F12=exp(-alpha*tau12);
ConstStr F13=exp(-alpha*tau13);
ConstStr F21=exp(-alpha*tau21);
ConstStr F23=exp(-alpha*tau23);
ConstStr F31=exp(-alpha*tau31);
ConstStr F32=exp(-alpha*tau32);

ConstStr lngammax1=(x1*0*1+x2*tau21*F21+x3*tau31*F31)/(x1*1+x2*F21+x3*F31)+
         (x1*1/(x1*1+x2*F21+x3*F31)*(0-(x1*0*1+x2*tau21*F21+x3*tau31*F31)/(x1*1+x2*F21+x3*F31)))+
         (x2*F12/(x1*F12+x2*1+x3*F32)*(tau12-(x1*tau12*F12+x2*0*1+x3*tau32*F32)/(x1*F12+x2*0+x3*F32)))+
         (x3*F13/(x1*F12+x2*F23+x3*1)*(tau13-(x1*tau13*F13+x2*tau23*F23+x3*0*1)/(x1*F13+x2*F23+x3*1)));
ConstStr lngammax2=(x1*tau12*F12+x2*0*1+x3*tau32*F32)/(x1*F12+x2*0+x3*F32)+
         (x1*F21/(x1*1+x2*F21+x3*F31)*(tau21-(x1*0*1+x2*tau21*F21+x3*tau31*F31)/(x1*1+x2*F21+x3*F31)))+
         (x2*1/(x1*F12+x2*1+x3*F32)*(0-(x1*tau12*F12+x2*0*1+x3*tau32*F32)/(x1*F12+x2*0+x3*F32)))+
         (x3*F23/(x1*F12+x2*F23+x3*1)*(tau23-(x1*tau13*F13+x2*tau23*F23+x3*0*1)/(x1*F13+x2*F23+x3*1)));
ConstStr lngammax3=(x1*tau13*F13+x2*tau23*F23+x3*0*1)/(x1*F13+x2*F23+x3*1)+
         (x1*F31/(x1*1+x2*F21+x3*F31)*(tau31-(x1*0*1+x2*tau21*F21+x3*tau31*F31)/(x1*1+x2*F21+x3*F31)))+
         (x2*F32/(x1*F12+x2*1+x3*F32)*(tau32-(x1*tau12*F12+x2*0*1+x3*tau32*F32)/(x1*F12+x2*0+x3*F32)))+
         (x3*1/(x1*F12+x2*F23+x3*1)*(0-(x1*tau13*F13+x2*tau23*F23+x3*0*1)/(x1*F13+x2*F23+x3*1)));
         
ConstStr gammax1=exp(lngammax1);
ConstStr gammax2=exp(lngammax2);
ConstStr gammax3=exp(lngammax3);

ConstStr lngammay1=(y1*0*1+y2*tau21*F21+y3*tau31*F31)/(y1*1+y2*F21+y3*F31)+
         (y1*1/(y1*1+y2*F21+y3*F31)*(0-(y1*0*1+y2*tau21*F21+y3*tau31*F31)/(y1*1+y2*F21+y3*F31)))+
         (y2*F12/(y1*F12+y2*1+y3*F32)*(tau12-(y1*tau12*F12+y2*0*1+y3*tau32*F32)/(y1*F12+y2*0+y3*F32)))+
         (y3*F13/(y1*F12+y2*F23+y3*1)*(tau13-(y1*tau13*F13+y2*tau23*F23+y3*0*1)/(y1*F13+y2*F23+y3*1)));
ConstStr lngammay2=(y1*tau12*F12+y2*0*1+y3*tau32*F32)/(y1*F12+y2*0+y3*F32)+
         (y1*F21/(y1*1+y2*F21+y3*F31)*(tau21-(y1*0*1+y2*tau21*F21+y3*tau31*F31)/(y1*1+y2*F21+y3*F31)))+
         (y2*1/(y1*F12+y2*1+y3*F32)*(0-(y1*tau12*F12+y2*0*1+y3*tau32*F32)/(y1*F12+y2*0+y3*F32)))+
         (y3*F23/(y1*F12+y2*F23+y3*1)*(tau23-(y1*tau13*F13+y2*tau23*F23+y3*0*1)/(y1*F13+y2*F23+y3*1)));
ConstStr lngammay3=(y1*tau13*F13+y2*tau23*F23+y3*0*1)/(y1*F13+y2*F23+y3*1)+
         (y1*F31/(y1*1+y2*F21+y3*F31)*(tau31-(y1*0*1+y2*tau21*F21+y3*tau31*F31)/(y1*1+y2*F21+y3*F31)))+
         (y2*F32/(y1*F12+y2*1+y3*F32)*(tau32-(y1*tau12*F12+y2*0*1+y3*tau32*F32)/(y1*F12+y2*0+y3*F32)))+
         (y3*1/(y1*F12+y2*F23+y3*1)*(0-(y1*tau13*F13+y2*tau23*F23+y3*0*1)/(y1*F13+y2*F23+y3*1)));
         
ConstStr gammay1=exp(lngammay1);
ConstStr gammay2=exp(lngammay2);
ConstStr gammay3=exp(lngammay3);

Function y1=x1*gammax1/gammay1;
                y2=x2*gammax2/gammay2;
                y3=x3*gammax3/gammay3;

Data;
0.9561 0.0289 0.0150 0.0010 0.0011 0.9979
0.9101 0.0739 0.0160 0.0013 0.0028 0.9959
0.7982 0.1675 0.0343 0.0010 0.0071 0.9919
0.6980 0.2558 0.0462 0.0026 0.0164 0.9810
0.6461 0.2941 0.0598 0.0018 0.0253 0.9729
0.5686 0.3488 0.0826 0.0011 0.0404 0.9585
0.5194 0.3921 0.0885 0.0037 0.0525 0.9438
0.4919 0.4101 0.0980 0.0045 0.0583 0.9372
0.4664 0.4319 0.1017 0.0079 0.0688 0.9233
0.4497 0.4410 0.1093 0.0111 0.0736 0.9153
0.4374 0.4498 0.1128 0.0125 0.0884 0.8991
0.4189 0.4515 0.1296 0.0186 0.0942 0.8872
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mushixilin

铜虫 (初入文坛)

送红花一朵
引用回帖:
5楼: Originally posted by lipenggg at 2017-02-18 18:09:04
1.5版本太低了,即使能计算共享参数拟合,你的代码有点复杂,软件功能不够。
需要正版高版本软件来计算。

谢谢前辈解答。
试了试,字符数多但拟合公式简单的sharedmodel问题可以解决,我这个公式确实有点儿复杂,算不了。
之前在用matlab,可惜对初值要求太大,专程学了1stOpt,没想到还是解不了。我再想想办法。
6楼2017-02-18 22:11:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 7 个回答

dingd

铁杆木虫 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
mushixilin: 金币+15, ★★★很有帮助 2017-02-18 09:50:46
sharedmodel;可以实现多因子参数共享拟合,1.5的估计不行。

» 本帖已获得的红花(最新10朵)

2楼2017-02-17 17:15:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mushixilin

铜虫 (初入文坛)

送红花一朵
引用回帖:
2楼: Originally posted by dingd at 2017-02-17 17:15:32
sharedmodel;可以实现多因子参数共享拟合,1.5的估计不行。

谢谢,得到大神的解答。在小木虫上看了很多类似的帖子,有提到1.5不可以使用sharedmodel,也有虫友说lib文件夹可以用,下载后使用了一下,发现1.5可以使用sharedmodel功能,可以计算较为简单的sharedmodel问题。但是对于我这个问题,可能由于代码太长,无法计算,提示如下:Fatal: Line too long (more than 1023 characters),Compile failed, check your program codes please!。
3楼2017-02-17 22:53:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mushixilin

铜虫 (初入文坛)

将代码进行了一定处理,仍然提示Fatal: Line too long (more than 1023 characters),Compile failed, check your program codes please!。是因为最后的公式过于复杂吗?

Title "NRTL simulation";
sharedmodel;
Parameters alpha[0,1],t12,t13,t21,t23,t31,t32;
Variables x1,x2,x3,y1,y2,y3;
ConstStr G12=exp(-alpha*t12),
         G13=exp(-alpha*t13),
         G21=exp(-alpha*t21),
         G23=exp(-alpha*t23),
         G31=exp(-alpha*t31),
         G32=exp(-alpha*t32),
         a=(x2*t21*G21+x3*t31*G31)/(x1+x2*G21+x3*G31),
         b=(x1*t12*G12+x3*t32*G32)/(x1*G12+x2+x3*G32),
         c=(x1*t13*G13+x2*t23*G23)/(x1*G13+x2*G23+x3),
         d=x1/(x1+x2*G21+x3*G31),
         e=x2/(x1*G12+x2+x3*G32),
         f=x3/(x1*G13+x2*G23+x3),
         j=(y2*t21*G21+y3*t31*G31)/(y1+y2*G21+y3*G31),
         k=(y1*t12*G12+y3*t32*G32)/(y1*G12+y2+y3*G32),
         l=(y1*t13*G13+y2*t23*G23)/(y1*G13+y2*G23+y3),
         m=y1/(y1+y2*G21+y3*G31),
         n=y2/(y1*G12+y2+y3*G32),
         o=y3/(y1*G13+y2*G23+y3);
Conststr lngammax1=a-d*a+e*G12*(t12-b)+f*G13*(t13-c),
         lngammax2=b+d*G12*(t21-a)-e*b+f*G23*(t23-c),
         lngammax3=c+d*G31*(t31-a)+e*G32*(t32-b)-f*c,
         lngammay1=j-m*j+n*G12*(t12-k)+o*G13*(t13-l),
         lngammay2=k+m*G12*(t21-j)-n*k+o*G23*(t23-l),
         lngammay3=l+m*G31*(t31-j)+n*G32*(t32-k)-o*l;
Conststr gammax1=exp(lngammax1),
         gammax2=exp(lngammax2),
         gammax3=exp(lngammax3),
         gammay1=exp(lngammay1),
         gammay2=exp(lngammay2),
         gammay3=exp(lngammay3);
Function y1=x1*gammax1/gammay1;
         y2=x2*gammax2/gammay2;
         y3=x3*gammax3/gammay3;
Data;
0.9561 0.0289 0.0150 0.0010 0.0011 0.9979
0.9101 0.0739 0.0160 0.0013 0.0028 0.9959
0.7982 0.1675 0.0343 0.0010 0.0071 0.9919
0.6980 0.2558 0.0462 0.0026 0.0164 0.9810
0.6461 0.2941 0.0598 0.0018 0.0253 0.9729
0.5686 0.3488 0.0826 0.0011 0.0404 0.9585
0.5194 0.3921 0.0885 0.0037 0.0525 0.9438
0.4919 0.4101 0.0980 0.0045 0.0583 0.9372
0.4664 0.4319 0.1017 0.0079 0.0688 0.9233
0.4497 0.4410 0.1093 0.0111 0.0736 0.9153
0.4374 0.4498 0.1128 0.0125 0.0884 0.8991
0.4189 0.4515 0.1296 0.0186 0.0942 0.8872
4楼2017-02-18 16:20:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见