|
老师好,同学们好!我用直接交叉熵第14章例题14-7-2的Sam表进行调平,却出现的如下的错误
**** Exec Error at line 83: log: FUNC SINGULAR: x = 0
代码是:
*编制GAMS程序语言,用直接交叉熵平衡SAM表。
*第十四章例题7.2数据
set ac /sec1,sec2soe,sec2pri,sec2fdi,sec3,com1,com2,com3,lab,cap,hhr,hhu,ent,
gov,vatl,vatk,bustax,tariff,invsav,row,total/;
set a(ac) /sec1,sec2soe,sec2pri,sec2fdi,sec3/;
set c(ac) /com1,com2,com3/;
set f(ac) /lab,cap/;
set hoh(ac) /hhr,hhu/;
set vat(ac) /vatl,vatk/;
*set acnt(ac) 除了总数之外的所有账户;
set i(ac) /sec1,sec2soe,sec2pri,sec2fdi,sec3,com1,com2,com3,lab,cap,hhr,hhu,ent
,gov,vatl,vatk,bustax,tariff,invsav,row/;
*acnt(ac)=YES; acnt('total')=NO;
*i(ac)=YES; i('total')=NO;
alias (ac,acp),(a,ap),(c,cp),(f,fp),(hoh,hp),(vat,vatp);
alias (i,j);
table sam(ac,acp)
$INCLUDE C:\Users\phili\Desktop\GAMs\必读文件夹\张欣 第二版所有CGE模型的GAMS程序 解压密码 gzcbs2017\chap14QXSAM.inc
*display sam
*这里SAM表是从外面用txt文件引进
parameters
Q0(i,j) initial value SAM表各个初始流量
H0 sum of all transaction flows (初始流量总数);
*Assignment for parameters
Q0(i,j)=sam(i,j);
H0=sum((i,j),sam(i,j));
display H0,sam;
Variables
Q(i,j) 要调整的SAM表中的各个数值
H 调整SAM表的总值
Hratio 调整和原始两个总数的比例
z 目标函数的数值即预期熵值;
*nonneg 每个变量必须是非负数
Positive variable Q(i,j);
equations
totalsum 被调整的总数
directentropy 目标函数 预期交叉熵
balance 各个账户的平衡限制条件
Hratiodef Hratio 的定义和范围;
totalsum.. H =e= sum((i,j),Q(i,j));
Hratiodef.. Hratio =e= H/H0;
directentropy.. z =e= sum((i,j)$sam(i,j),(1/H)*Q(i,j)*log(Q(i,j)/sam(i,j)))
-log(Hratio);
* directentropy.. z =e= sum((i,j),(1/H)*Q(i,j)*log(Q(i,j)/sam(i,j)))-log(Hratio);
balance(i).. sum(j$sam(i,j),Q(i,j)) =e= sum(j,Q(j,i));
*对变量初始值赋值。
*这里对Hratio特别限制了范围。因为不限制的话,目标函数最小化时H会趋向无穷大
*得不到真实结果
Q.l(i,j)=Q0(i,j);
H.l=H0;
Hratio.lo=0.5;
Hratio.up=2;
model sambal /all/;
option nlp=pathnlp;
solve sambal using nlp minimizing z;
display Q.l,H.l,Hratio.l;
*end 结束
|