Gams与Matlab如何实现数据交互

Gams是一款通用建模软件,能够高效的解决数学规划和优化问题。Matlab是一个集数值计算、符号分析、图像显示和文字处理于一体的大型集成化软件。在实际使用过程中会涉及到两个软件通讯的操作,下面介绍如何实现Gams与Matlab的数据交互。

这两个软件之间通过gdx文件进行数据交互(xxx.gdx),具体实现过程为Matlab软件将数据写入gdx文件,gams通过读取gdx文件得到数据,反之亦然。下面从gams生成指定gdx文件、gams向gdx文件中写入数据、gams读取gdx文件中的数据、Matlab向gdx文件中写入数据、Matlab读取gdx文件中的数据、Matlab调用gams进行运算  五部分进行介绍。

1 . gams生成指定gdx文件

在gams脚本文件首行及末尾编写如下代码

$set matout "'matsol.gdx'"
*
*
*
execute_unload %matout%;

运行该文件后便会在脚本文件所在文件夹中生成"matsol.gdx"文件。

2 . gams向gdx文件中写入数据

首先确定数据变量名,之后在脚本文件首行添加变量名即可

$set matout "'matsol.gdx', Qu, Qc, yij, ycu, yhu, Tiin, Chu"
*Qu, Qc, yij, ycu, yhu, Tiin, Chu为所需输出变量名

注意!这里可以规定gams的计算结果,也可以规定gams中的输入值。理论上可以输出gams当中全部参数数据。

运行文件后"matsol.gdx"中便会存在全部变量,双击gdx文件可以在gams中查看。

下面介绍Matlab对gams调用进行计算以及与gdx文件数据交互的方法。

首先需要在Matlab中添加gams的启动路径(例如path = D:\GAMS\37),或者在Matlab工具栏操作:主页-环境-设置路径-添加并包含子文件夹-选择gams启动文件夹。

>> addpath 'C:\GAMS'; savepath;

3 . Matlab向gdx文件中写入数据

在Matlab中首先通过结构体对需要写入gdx文件中的数据进行定义,采用如下代码

s.name = 'Chu';
s.type = 'Parameter';
s.form = 'full';
s.val = 80;

v.name = 'Tiin1';
v.type = 'Parameter';
v.form = 'full';
v.val = [89.47	117.28	211.58	143.67	119.80	48.18	48.25	47.93];

如代码所示,'name'为数据名称,‘type’为数据类型,'val'为数据值。有关参数的更多属性值请参考此教程:GDXMRW (gams.com)

参数规定后通过如下代码输入到gdx文件中

wgdx('matsol',s,v);

通过上述函数可以一次性向gdx文件中输入多个参数,注意!该函数会覆盖gdx文件之前的内容。

4 . Matlab读取gdx文件中的数据

首先规定承载数据的结构体:

y.name = 'Chu';
z.name = 'Tiin1';

结构体中的属性值'name'要与gdx文件中参数的'name'保持一致。

通过如下代码读取数据:

x1 = rgdx('matsol',y);
x2 = rgdx('matsol',z);
disp(x1.val);
disp(x2.val);

注意!3和4介绍的方法默认gdx文件与Matlab脚本文件在同一文件夹中,在使用时建议gdx文件在Matlab运行文件夹中。

5 . Matlab调用gams进行运算

通过如下代码调用gams进行计算,注意!gams脚本文件需要放在Matlab运行文件夹中(Matlab脚本所在文件夹)。

[x1, x2, x3, x4, x5, x6, x7] = gams('super');

'super'为gams脚本文件文件名,x1至x7为gams运行结果返回值,与( 2 . gams向gdx文件中写入数据)  中在gams脚本文件开头规定的输出变量一致,从左到右的变量依次赋给x1至x7。通过这种方法可以方便的得到计算结果。通过下述代码得到参数值:

disp(x1.val);
disp(x1.name);

注意!如果返回数据中涉及到gams计算结果的数据全部为0,则代表gams计算失败,文件存在bug或者无法计算得到结果(Problem is infeasible!)

你可能感兴趣的:(Scientific,Research_Gams,matlab,开发语言,统一建模语言)