GAMS与MATLAB的数据交互
背景
在利用GAMS编写并求解完模型后,无法利用GAMS实现结果的可视化,因此需要进行数据交互,利用MATLAB强大的图形处理能力进行结果的展示。
本文将介绍GAMS与MATLAB的数据交互方法。仍旧用上篇博文中模型为例,博文链接link。
1 学习材料准备
官网给出的相关说明(英文),参考链接link;
教学视频(英文),链接link。
总结:两个软件间的交互主要是利用“.gdx”文件作为中转站实现的。
2 添加路径
在安装完GAMS和MATLAB两款软件后,需要将GAMS的安装路径添加到MATLAB的path中去:
第一步,“File——Options——Execute”,可以获得GAMS的安装路径
第二步,打开MATLAB,“HOME——set path——Add Folder——Save”。
第三步,为了验证是否成功,可以在MATLAB命令行窗口中写入“help wgdx”,若可以看到函数解释则说明添加成功。
3 数据交互
3.1 GAMS数据写入与读取
3.1.1 将GAMS数据写到gdx文件中
想要利用gams函数进行模型结果的传出,首先需要在用GAMS编写模型时,写上存储结果的语句,如下所示(第一句写在模型开头,第二句写在模型结尾)。
第一句表示的意思是“将变量X和UU存储到GtoM.gdx文件中去”,第二句的意思是“执行数据存储语句”。
$set matout "'GtoM.gdx', X, UU ";
execute_unload %matout%;
3.1.2 GAMS读取gdx文件中的数据
模型中参数px是需要从“MtoG.gdx”文件中读取的数据(关于MtoG.gdx会在3.2.1中讲),语句如下所示。
第一句表示的意思是“从MtoG.gdx文件中读取数据”,第三句表示的意思是“加载参数px”。
Parameter px(i);
$if not set gdxin $set gdxin MtoG
$GDXIN %gdxin%
$LOAD px
$GDXIN
3.1.3 本文模型GAMS代码
$set matout "'GtoM.gdx', X, UU ";
* Definition of the Index Sets
Sets
i goods /BRD bread, MLK milk/
h factors /CAP capital, LAB labor/
;
* Definition of Parameters
Parameters
alpha(i) /BRD 0.2, MLK 0.8/
pz(h) /CAP 2, LAB 1/
z(h) /CAP 10, LAB 20/
;
Parameter px(i);
$if not set gdxin $set gdxin MtoG
$GDXIN %gdxin%
$LOAD px
$GDXIN
* Definition of variables
Positive Variable
X(i)
Variable
UU
EquationS
eqt ffggf
obj fgjg
;
*Specification of equations
eqt.. sum(i, px(i)*X(i)) =e= sum(h, pz(h)*z(h));
obj.. UU =e= prod(i, X(i)**alpha(i));
*Defining the model
Model HHmax /all/;
*Sloving the model
Solve HHmax maximazing UU using NLP;
execute_unload %matout%;
3.2 Matlab数据写入和读取
写入函数wgdx;读取函数rgdx。
3.2.1 Matlab将数据写入gdx文件中
在matlab中将想要传入的参数写到相应的文件中去:name表示要写入参数的名称,type表示要写入参数的名称,uels表示要写入参数的下标属性,val表示要写入参数的数值,form表示要写入参数的类型(full和sparse类型)。
a.name='px';
a.type='parameter';
a.uels={'BRD','MLK'};
a.val=[1 2];
a.form='full';
wgdx('MtoG',a)
3.2.2 Matlab读取gdx文件中的数据
通过rgdx函数读取gdx文件中的数据。
x.name='X';
x=rgdx('MtoG',x);
数据展示如下,将x的数值赋给另一个向量:
b=x.val;
3.2.3 本文模型MATLAB代码
clc,clear
a.name='px';
a.type='parameter';
a.uels={'BRD','MLK'};
a.val=[1 2];
a.form='full';
wgdx('MtoG',a);
system 'gams HHmax'
x.name='X';
x=rgdx('GtoM',x);
x.val
4 总结
至此,GAMS与MATLAB的数据交互就已经能够实现。
【整理不易,转载请注明出处和相关链接,否则必究!】