You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何迭代森林火灾模拟函数并整合代码实现密度计算?

森林火灾模拟代码整合方案

以下是修正并整合后的完整代码,解决迭代逻辑、状态转换与数据可视化问题:

完整可运行代码

import numpy as np
import matplotlib.pyplot as plt

# 初始参数设置
p, f = 0.5, 0.3
nx, ny = 100, 100
# 初始化森林:70%空地块,30%树木,随机设置1个初始火源
X = np.random.choice([0, 1], size=(ny, nx), p=[0.7, 0.3])
X[np.random.randint(ny), np.random.randint(nx)] = 2

adjacent = ((-1,0), (0,-1), (0, 1), (1,0))
E, T, F = 0, 1, 2
xvalues = [0]
yvalues = [0]

# 修正后的状态迭代函数
def iterate(X):
    Xnew = np.copy(X)
    for ix in range(1, nx-1):
        for iy in range(1, ny-1):
            current = X[iy, ix]
            if current == E:
                # 空地块随机长出树木
                if np.random.random() <= p:
                    Xnew[iy, ix] = T
            elif current == T:
                # 检查是否被相邻火源点燃
                has_fire_neighbor = False
                for dx, dy in adjacent:
                    if X[iy+dy, ix+dx] == F:
                        has_fire_neighbor = True
                        break
                if has_fire_neighbor:
                    Xnew[iy, ix] = F
                else:
                    # 随机自然着火
                    if np.random.random() <= f:
                        Xnew[iy, ix] = F
            elif current == F:
                # 燃烧后变为空地块
                Xnew[iy, ix] = E
    return Xnew

# 执行最多1000次迭代
max_iterations = 1000
for i in range(1, max_iterations + 1):
    X = iterate(X)
    # 计算各地块数量
    num_empty = (X == E).sum()
    num_tree = (X == T).sum()
    num_fire = (X == F).sum()
    # 计算密度(避免分母为0)
    denominator = num_fire + num_empty
    density = num_tree / denominator if denominator != 0 else 0
    # 存储数据
    xvalues.append(i)
    yvalues.append(density)
    # 打印当前迭代密度
    print(f"Iteration {i}: Density = {density:.4f}")

# 绘制树木密度变化图
plt.figure(figsize=(10, 6))
plt.plot(xvalues, yvalues, label='树木密度')
plt.xlabel('迭代次数')
plt.ylabel('树木密度(树木数/(空地块+燃烧地块))')
plt.title('森林火灾模拟:树木密度随迭代变化')
plt.legend()
plt.grid(True)
plt.show()

关键修正与说明

  • 修复迭代函数逻辑:
    • 原代码中else与for循环绑定的逻辑错误,改为显式检查相邻火源
    • 补充燃烧地块(F)的状态转换:燃烧后变为空地块(E),符合森林火灾模型常规逻辑
    • 使用np.copy(X)初始化新状态数组,避免原数组被提前修改导致计算错误
  • 初始条件优化:原代码全为空地块无法触发火灾,添加了随机树木与初始火源生成
  • 迭代循环实现:通过for循环执行最多1000次迭代,每次更新状态并计算密度,存储数据到列表
  • 异常处理:添加分母为0的判断,避免极端情况下的除以0错误

内容的提问来源于stack exchange,提问作者tho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:35:24