Skip to content

Latest commit

 

History

History
119 lines (102 loc) · 4.25 KB

2023-5-1.md

File metadata and controls

119 lines (102 loc) · 4.25 KB

Note

  • 大致回忆并练习了下latex写法,发现chatgpt的文本直接复制就是latex,所以决定用latex保存书写有关于chatgpt回答的文本部分(代码部分主要用markdown语法保存)
  • 完成了第一二问的代码。
  • 问题如下:草坪灌溉通常有两种模式——固定喷头和移动喷头。固定喷头一般用于管理水 平较高的运动场上,它的主要特点是可以自由旋转、操作简单、数量较少;而移动 喷头通常用于普通绿地,它的主要特点是投入成本低,但在操作上费时费工。 对固定喷头,如果其分布不合理,会导致喷水不均匀的情况,也会因喷水到草 坪之外,产生水资源的浪费。请建立数学模型,讨论固定喷头的合理布局问题。
  • 问题 1. 对一块矩形草坪,建立固定喷头布局的数学模型,使得喷水尽可能均 匀,且浪费的水尽量少。
  • 问题 2. 对问题 1 给出的固定喷头的分布情况,确定喷水频率,使得草坪保持 在合理的湿润程度。
  • 问题 3. 对不同形状的草坪,问题 1 和问题 2 的模型应如何进行调整?
  • 第一问用了动态规划,第二问按照公式写了一个循环。
  • 回忆并使用了plotly.express包来输出折线图
  • 用drawio修饰了一下

Code

import numpy as np


def calc_centers(L, W, R):
    a = R * (2**0.5)
    s = a * a

    dp = np.full((int(L * 10) + 1, int(W * 10) + 1), np.inf)
    dp[0][0] = 0
    for i in range(int(a * 10), int(L * 10) + 1):
        for j in range(int(a * 10), int(W * 10) + 1):
            for k in range(int(a * 10)):
                for l in range(int(a * 10)):
                    dp[i][j] = min(dp[i][j], dp[i - k - 1][j - l - 1] + s)
    res = dp[int(L * 10)][int(W * 10)]

    centers = []
    for i in np.arange(a / 2, L + a / 2, a):
        for j in np.arange(a / 2, W + a / 2, a):
            centers.append((i, j))

    return centers


def print_centers(centers):
    print("喷头个数:", len(centers))
    # 输出中心坐标
    print("每个喷头的中心坐标:")
    for center in centers:
        print(center)

    # 绘制示意图
    fig, ax = plt.subplots(figsize=(L, W))
    for center in centers:
        ax.scatter(center[0], center[1], s=10, color="red", zorder=1)
        circle = plt.Circle(center, a / (2**0.5), color="blue", fill=False, zorder=2)
        ax.add_artist(circle)
    plt.xlim(0, L)
    plt.ylim(0, W)
    plt.show()


# 设置草坪参数
L = 20  # 草坪长度
W = 10  # 草坪宽度
A = L * W  # 草坪面积
R = 2.5
l = R * (2**0.5)  # 喷头间距
x = 10  # 喷头速率
xt = 1 / 24  # 每轮喷洒时长
k = 0.1  # 草坪渗透率
e = 0.05  # 蒸散发系数
Wp = 0.3  # 草坪临界含水量
W0 = 0.6  # 初始草坪含水量


# 定义时间参数
dt = 0.005  # 时间步长
t0 = 0  # 初始时间
t_end = 40  # 结束时间

# 初始化草坪水分含量和时间
t = np.arange(0, t_end, dt)  # 时间向量
W = np.zeros_like(t)  # 初始化草坪水分含量为0
W[0] = W0  # 设置初始草坪水分含量
xtt = 0  # 动态喷洒时长
water = []

# 模拟草坪水分的变化过程
for i in range(1, len(t)):
    # 计算草坪水分平衡方程的各个分量
    I = 0  # 喷头供水
    if W[i - 1] <= Wp and xtt <= 0:
        xtt = xt
        water.append(i * dt)
    if xtt > 0:
        I = x * dt * A
        xtt -= dt
    E = e * A * dt  # 蒸散发引起的水分流失
    if i >= 2 and W[i - 1] <= W[i - 2]:
        L = k * A * (W[i - 2] - W[i - 1])  # 草坪含水量下降引起的表面水分流失
    else:
        L = 0
    T = k * A * (W[i - 1] - Wp) * dt  # 草坪含水量下降引起的土壤水分流失
    # 更新草坪水分含量
    W[i] = W[i - 1] + (I - E - L - T) / A

print("每轮喷洒开始时刻:", water, "days")
sum_t = 0
temp = 0
for tt in water:
    if temp:
        sum_t += tt - temp
    temp = tt
average_t = sum_t / (len(water) - 1)
print("平均周期:", average_t, "days")

import plotly.express as px

fig = px.line(x=t, y=W, line_shape="spline", render_mode="svg")
fig.update_layout(xaxis_title="时间(日)", yaxis_title="草坪实时水分状况(湿润程度)")
for xx in water:
    fig.add_annotation(
        x=xx, y=Wp, text="开始喷水", showarrow=True, arrowhead=1, ax=30, ay=-30
    )
fig.show()