![c38eec0f4c902aa16b132c253fe19f26.png](https://i-blog.csdnimg.cn/blog_migrate/59037839a45dea39b6e5bd0e67dd552f.jpeg)
封面是水波的干涉效果。建议阅读本章内容前先去看看一个视频《如何解决交通堵塞》,油管或是B站翻译版
车流量问题
你想想,你带着朋友,坐着汽车,吃着火锅唱着歌,突然就堵车了。为何堵车如此难以解决呢?
首先,把公路简化成一条单行道,并且划分成许多区域,假设车辆会从左边的区域驶往右边的区域。
![9c1d94a4ce5d9e563929a3e4322e5b78.png](https://i-blog.csdnimg.cn/blog_migrate/2c519aa1d3564e35d1772521caacc9d4.png)
假设每个网格中汽车的速度的u_i范围是0~1,汽车的密度rho_i范围是0~128。那么u_i*rho_i就是在下个时刻从网格i进入网格i+1的数量。并且假设速度恒定,写成离散公式就是如下,其实就是一维对流方程:
import numpy as np
length = 8
iterations = 10
h = np.zeros((iterations,length))
h[0,2] = h[0,3] = 64
for k in range(0,iterations-1):
for i in range(1,length):
h[k+1,i] = h[k,i] + (h[k,i-1] - h[k,i]) * 0.5
用Spyder这个超级漂亮的IDE查看车辆密度变换如下:
![1a6753860ef8bd1356f42d9d79f77393.png](https://i-blog.csdnimg.cn/blog_migrate/0349e19024f8daebf97034d5d8cf9462.png)
可以看到车流在缓缓向右移动,并且单个网格的车辆密度没原来那么高了。
但是路要一步步走,汽车要是开得太快了,会撞到别人。周围车辆少的时候,可以开快一点,周围车辆多的时候,就要慢一点。这时候速度不再是恒定的,而是与密度有关系,比如下式:
写成代码就是
import numpy as np
length = 8
iterations = 10
h = np.zeros((iterations,length))
u = np.zeros((iterations,length))
h[0,2] = h[0,3] = 64
umax = 0.5
hmax = 128.0
for k in range(0,iterations-1):
for i in range(0,length-1):
u[k,i] = (1 - h[k,i] / hmax)* umax
for i in range(1,length):
h[k+1,i] = h[k,i] + h[k,i-1] * u[k,i-1] - h[k,i] * u[k,i]
最终结果如下:
![20fac31af945a4eabd428f5fe7f4f78b.png](https://i-blog.csdnimg.cn/blog_migrate/2ff184608c17420005e891837a98b858.png)