7- 导出数据与复杂曲线绘制
- netlogo 适合做仿真,还是要配合 matlab 处理 产生的仿真数据
数据导出
默认导出到与模型文件同级的 文件夹下

先创建一个 ag.txt 文件

创建一个save的按钮

代码实现
to save-file
file-open "ag.txt"
let wealths""
ask turtles[
set wealths (word wealths money "\r\n")
]
file-print wealths
file-close
end运行模型,产生数据之后,就可以导出

接着就可以利用 matlab 进一步做数据分析。
绘制洛伦兹曲线
首先需要知道:什么是洛伦兹曲线?
假设一个王国里有6个人,他们的图形高度代表了财富量。

先由高到低进行排序,最左边的人的序号是1,最右边的序号是6.

改变纵轴的值为: 左边所有人的财富值和自己的财富值的累加。

然后进行归一化:
- 横轴除以 人口的总人数。
- 纵轴除以 所有人的财富总量。
这样,横纵坐标就变成了比例。
红色虚线代表最平均的财富分配,蓝色实线就代表了最不平均的财富分配。

然后就可以开始绘制
X、Y的最大值为1
绘图更新命令写中间的就行,下面三个不用写。
然后去完善对应的代码。(在文末)


要用到的一个函数或者命令:
Plot:绘图
- set-current-plot “图的名称” ----- 选定画哪个图
Pen:画笔
- set-current-pen “线段名称” ---- 选择你要画哪条线
- plot-pen-down ------ 下笔
- plot-pen-up ----- 提笔
plot :等水平间隔地绘制点(线)
plot 0
plot 1
plot 3

- set-plot-pen-interval 设置画笔 等水平间隔地绘制点
- plotxy :任意绘制点(线)
plot-pen-down
plotxy 0 0
plotxy 1 1
plotxy 3 3
plot-pen-up
item 的用法
item:从列表中根据下标取出任意一个元素出来
item idx lst
idx: 一个整数,即第几个下标
lst:一个由多个元素构成的列表
Netlogo中的下标是从0开始的
绘制洛伦兹曲线的代码:
to lorenz-plot
clear-plot
set-current-plot-pen "equal"
plot 0
plot 1
set-current-plot-pen "dominant"
plot-pen-down
plotxy 0 0
plotxy 1 0
plotxy 1 1
plot-pen-up
set-current-plot-pen "lorenz"
set-plot-pen-interval 1 / agent_num
plot 0
let sorted-wealths sort [money] of turtles
let total-weath sum sorted-wealths
let weath-sum-so-far 0
let index 0
repeat agent_num [
set weath-sum-so-far (weath-sum-so-far + item index sorted-wealths)
plot (weath-sum-so-far / total-weath)
set index (index + 1)
]
end