2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析

news2024/11/19 13:36:38

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
让我们来看看美赛的D题!
完整内容可以在文章末尾领取!
在这里插入图片描述

问题重述

问题 D 背景:
美国和加拿大的五大湖是世界上最大的淡水湖群。这些湖泊和相连的水道构成了一个庞大的排水区,涵盖了这两个国家的许多大城市,具有多样的气候和局部天气条件。

湖泊的水被用于许多目的(捕鱼、娱乐、发电、饮用水、航运、动植物栖息地、建筑、灌溉等)。因此,许多利益相关者对湖泊的水流管理有兴趣。主要问题是调节水位,以使所有利益相关者受益。

湖泊中的水位取决于进出湖泊的水量。这些水位是温度、风、潮汐、降水、蒸发、湖底形状、河流流量和径流、水库政策、季节性循环以及长期气候变化之间复杂相互作用的结果。在整个大湖系统中有两个主要的控制机制——苏圣玛丽的补偿工程(三个水电厂、五个航道船闸和急流头部的闸门坝)和康沃尔的摩西-桑德斯大坝,如在附件中所示。

虽然两个控制大坝、许多水道和运河以及排水区水库可能受人类控制,但雨水、蒸发、侵蚀、冰封等水流现象的速率是超出人类操纵的。地方法规的政策可能产生意想不到的效果,季节性和水盆环境的变化也可能影响水盆的生态系统,从而影响湖泊和周围地区的植物和动物的健康。尽管大湖地区似乎有规律的年度模式,但水位的两到三英尺的偏差可能会极大地影响一些利益相关者。

这是一个“邪恶”的动态网络流问题——由于相互依赖关系、复杂的要求和固有的不确定性,解决起来非常具有挑战性。对于湖泊问题,我们面临着不断变化的动态和利益相关者的冲突。

问题 D 要求:
国际联合委员会(IJC)请求贵公司国际网络控制建模者(ICM)协助管理和模拟直接影响五大湖流网络水位的控制机制(如补偿工程和摩西-桑德斯大坝,在附件中有说明)。您的ICM主管已经委托您的团队在开发模型和实施模型的管理计划方面发挥领导作用。您的主管表示,有几个考虑因素可能有助于实现这个目标,首先是建立五大湖及其连接河流的网络模型,从苏必尔湖到大西洋。您的主管提到的一些建议性的考虑或问题还包括:

  1. 建立五大湖及其连接河流的网络模型,以确定最佳水位,并考虑各利益相关者的需求。
  2. 制定算法,根据湖泊的流入和流出数据来维持最佳水位。
  3. 分析控制算法对大坝流出的敏感性,并评估新的控制方法是否会带来更好的结果。
  4. 评估算法对环境条件变化的敏感性,如降水、冬季积雪、冰封等。
  5. 集中关注安大略湖的利益相关者和因素,提出针对该湖水位管理的解决方案。
  6. 基于历史数据制定模型和管理策略,并与先前模型进行比较。

最终的解决方案需要包括网络模型、算法设计、对历史数据的分析、针对安大略湖的管理方案以及对AI工具的使用报告。

问题一

为解决问题一,建立五大湖及其连接河流的网络模型,我们需要考虑水位的变化、流量的调整,以及各利益相关者的需求。以下是一个简化的建模思路,其中包含一些可能的函数表达式:

1. 水位建模:

每个湖泊的水位变化可以使用简化的微分方程表示,考虑流入、流出和自然波动:

d h i d t = Inflow i − Outflow i + NaturalFluctuations i \frac{dh_i}{dt} = \text{Inflow}_i - \text{Outflow}_i + \text{NaturalFluctuations}_i dtdhi=InflowiOutflowi+NaturalFluctuationsi

其中:

  • h i h_i hi 表示湖泊 i i i 的水位。
  • Inflow i \text{Inflow}_i Inflowi 表示流入湖泊 i i i 的总流量。
  • Outflow i \text{Outflow}_i Outflowi 表示流出湖泊 i i i 的总流量。
  • NaturalFluctuations i \text{NaturalFluctuations}_i NaturalFluctuationsi 表示自然波动的影响。

2. 利益相关者需求建模:

每个湖泊的利益相关者需求可以使用需求函数表示,考虑到水位对各利益相关者的影响。例如,对于湖泊 i i i 的需求函数可能如下:

Demand i = a i ⋅ ( h i − b i ) 2 + c i \text{Demand}_i = a_i \cdot (h_i - b_i)^2 + c_i Demandi=ai(hibi)2+ci

其中:

  • Demand i \text{Demand}_i Demandi 表示湖泊 i i i 的总需求。
  • a i a_i ai b i b_i bi c i c_i ci 是与湖泊 i i i 特定的参数,用于调整需求函数的形状。

3. 流量调整算法:

为了维持最佳水位,需要设计一个流量调整算法。一个简单的算法可以基于水位与最佳水位的差异进行调整:

Adjustment i = k ⋅ ( h target i − h i ) \text{Adjustment}_i = k \cdot (h_{\text{target}_i} - h_i) Adjustmenti=k(htargetihi)

其中:

  • h target i h_{\text{target}_i} htargeti 表示湖泊 i i i 的目标水位。
  • k k k 是调整系数,用于控制调整的速度。

4. 目标函数:

考虑到最小化总成本或最大化总效益,可以设计一个目标函数:

Objective = ∑ i ( Cost i ⋅ Inflow i + Benefit i ⋅ Demand i ) \text{Objective} = \sum_{i} \left( \text{Cost}_i \cdot \text{Inflow}_i + \text{Benefit}_i \cdot \text{Demand}_i \right) Objective=i(CostiInflowi+BenefitiDemandi)

其中:

  • Cost i \text{Cost}_i Costi 表示湖泊 i i i 流入的成本系数。
  • Benefit i \text{Benefit}_i Benefiti 表示湖泊 i i i 的需求满足带来的效益系数。

5. 参数设定和模拟:

设定初始条件,包括各湖泊的初始水位、流量等。使用数值模拟方法(如欧拉法或四阶龙格-库塔法)模拟系统的演化。

6. 模型评估:

通过与历史数据对比,验证模型的准确性。评估利益相关者的满意度和模型对环境条件变化的敏感性。

import numpy as np
import matplotlib.pyplot as plt

class LakeModel:
    def __init__(self, num_lakes, simulation_time, delta_t, inflows, outflows):
        self.num_lakes = num_lakes
        self.simulation_time = simulation_time
        self.delta_t = delta_t
        self.inflows = inflows
        self.outflows = outflows
        self.water_levels = np.zeros((num_lakes, simulation_time))

    def initialize_water_levels(self, initial_levels):
        self.water_levels[:, 0] = initial_levels

    def demand_function(self, water_level, demand_params):
        # 一个简单的需求函数示例
        a, b, c = demand_params
        return a * (water_level - b)**2 + c

    def adjust_flow(self, target_level, current_level, adjustment_coeff):
        # 一个简单的流量调整算法示例
        return adjustment_coeff * (target_level - current_level)

    def simulate(self):
        for t in range(1, self.simulation_time):
            for i in range(self.num_lakes):
                # 水位变化模型
                demand = self.demand_function(self.water_levels[i, t-1], [1, 5, 0])
                adjustment = self.adjust_flow(demand, self.water_levels[i, t-1], 0.1)

                # 更新水位
                self.water_levels[i, t] = self.water_levels[i, t-1] + (self.inflows[i, t] - self.outflows[i, t] + adjustment) * self.delta_t

    def visualize(self):
        for i in range(self.num_lakes):
            plt.plot(range(self.simulation_time), self.water_levels[i, :], label=f'Lake {i+1}')

        plt.xlabel('Time')
        plt.ylabel('Water Level')
        plt.legend()
        plt.show()

# 模拟参数
num_lakes = 5
simulation_time = 100
delta_t = 1
inflows = np.random.rand(num_lakes, simulation_time)
outflows = np.random.rand(num_lakes, simulation_time)

# 创建模型实例
lake_model = LakeModel(num_lakes, simulation_time, delta_t, inflows, outflows)

# 初始条件见完整代码

问题二

建模思路:

问题二 - 最优水位控制及灵敏性分析

1. 最佳水位建模:

1.1. 利益相关者需求函数:

为每个湖泊 i i i 引入二次函数作为需求函数:

Demand i = a i ⋅ ( h i − b i ) 2 + c i \text{Demand}_i = a_i \cdot (h_i - b_i)^2 + c_i Demandi=ai(hibi)2+ci

其中 h i h_i hi 表示湖泊 i i i 的水位, a i a_i ai b i b_i bi c i c_i ci 是需求函数参数。

1.2. 目标函数:

定义总体目标函数,以最大化总体效益或最小化总成本:

Objective = ∑ i ( Benefit i ⋅ Demand i − Cost i ⋅ Inflow i ) \text{Objective} = \sum_{i} \left( \text{Benefit}_i \cdot \text{Demand}_i - \text{Cost}_i \cdot \text{Inflow}_i \right) Objective=i(BenefitiDemandiCostiInflowi)

2. 优化算法选择 - 遗传算法:

利用遗传算法进行水位优化:

  1. 初始化种群: 随机生成一组初始解作为种群。
  2. 适应度评估: 计算每个个体的适应度,即目标函数值。
  3. 选择: 根据适应度选择个体,更适应的个体被选择的概率更高。
  4. 交叉: 对选定的个体进行基因交叉,生成新的个体。
  5. 变异: 对新生成的个体进行变异,引入一些随机性。
  6. 替换: 根据一定规则替换原有种群中的个体。
  7. 重复: 重复进行选择、交叉、变异、替换的过程,直至达到停止条件。

3. 调整算法设计:

设计一个调整算法,根据当前水位和目标水位,调整湖泊的流量以接近目标水位:

Adjustment i = k ⋅ ( h target i − h i ) \text{Adjustment}_i = k \cdot (h_{\text{target}_i} - h_i) Adjustmenti=k(htargetihi)

4. 模型实施:

  1. 模拟优化过程: 在每个迭代中,通过调整水位,使用遗传算法找到最佳水位配置。
  2. 整合调整算法: 在每个时间步骤中,根据优化算法确定的水位,使用调整算法调整湖泊的流量。

5. 结果评估:

  1. 模拟结果验证: 使用模型进行模拟,验证最终水位配置是否满足各利益相关者的需求,与历史数据进行比较。
  2. 效益和成本评估: 评估优化算法找到的最佳水位配置对各湖泊的效益和成本的影响。

6. 灵敏性分析:

  1. 单因素灵敏性分析: 逐一变化模型中的每个参数,观察模型输出的变化。
  2. 敏感性指标计算: 计算参数变化对最终目标函数值的影响程度。
  3. 参数范围分析: 确定每个参数的合理范围,观察在这个范围内模型的输出如何变化。
  4. 随机性分析: 考虑模型中的随机性因素,通过多次运行模型并观察结果的统计分布,评估模型的鲁棒性。

7. 优化和迭代:

  1. 模型优化: 根据评估结果对模型进行优化,可能需要调整模型中的参数、算法或需求函数。
  2. 利益相关者反馈: 与利益相关者合作,获取他们的反馈,并根据需要调整模型。可能需要一个迭代的过程,直到获得满意的模型。
import numpy as np
from scipy.optimize import minimize

# 模拟湖泊数量
num_lakes = 5

# 需求函数参数 (a, b, c)
demand_params = np.random.rand(num_lakes, 3)

# 效益和成本系数
benefit_coefficients = np.random.rand(num_lakes)
cost_coefficients = np.random.rand(num_lakes)

# 初始水位配置
initial_water_levels = np.zeros(num_lakes)

# 遗传算法参数
population_size = 20
generations = 50

# 目标函数
def objective_function(h):
    total_objective = 0
    for i in range(num_lakes):
        demand_i = demand_params[i, 0] * (h[i] - demand_params[i, 1])**2 + demand_params[i, 2]
        total_objective += benefit_coefficients[i] * demand_i - cost_coefficients[i] * h[i]
    return -total_objective  # 因为我们是在最小化目标函数

# 遗传算法
def genetic_algorithm(objective_func, initial_population, bounds, generations):
    population = initial_population

    for gen in range(generations):
        # 适应度评估
        fitness = [objective_func(ind) for ind in population]

        # 选择
        selected_indices = np.argsort(fitness)[:population_size]
        selected_population = [population[i] for i in selected_indices]

        # 交叉和变异
        new_population = crossover_and_mutate(selected_population, bounds)

        population = new_population

    # 返回最终结果
    return min(population, key=objective_func)

# 交叉和变异操作
def crossover_and_mutate(selected_population, bounds):
    new_population = []

    for parent1 in selected_population:
        parent2 = selected_population[np.random.choice(len(selected_population))]
        crossover_point = np.random.randint(num_lakes)

        child = np.concatenate((parent1[:crossover_point], parent2[crossover_point:]))
        child += np.random.normal(0, 1, size=num_lakes)  # 添加一些变异

        # 限制水位在合理范围内
        child = np.clip(child, bounds[:, 0], bounds[:, 1])

        new_population.append(child)

    return new_population

# 设置水位范围
bounds = np.array([(0, 100)] * num_lakes)

# 遗传算法优化
initial_population = np.random.uniform(bounds[:, 0], bounds[:, 1], size=(population_size, num_lakes))
optimal_water_levels_genetic = genetic_algorithm(objective_function, initial_population, bounds, generations)

# 输出遗传算法优化结果
print("Optimal Water Levels (Genetic Algorithm):", optimal_water_levels_genetic)
print("Optimal Objective Value (Genetic Algorithm):", -objective_function(optimal_water_levels_genetic))

# 简单灵敏性分析
sensitivity_results = []
for i in range(num_lakes):
    perturbed_water_levels = optimal_water_levels_genetic.copy()
    perturbed_water_levels[i] += 1.0  # 在第i个湖泊的水位上添加微小扰动

    perturbed_objective = -objective_function(perturbed_water_levels)
    sensitivity = perturbed_objective + objective_function(optimal_water_levels_genetic)#见完整版

问题三

建模思路:

1. 建立状态空间模型:

湖泊水位的状态空间模型表示为:

x k + 1 = A x k + B u k + w k x_{k+1} = Ax_k + Bu_k + w_k xk+1=Axk+Buk+wk

其中:

  • $ x_k$ 是系统状态向量,包括湖泊水位及其它相关状态。
  • $ u_k$ 是控制输入向量,表示水流的调整。
  • $ A$ 和 $ B$ 是状态转移矩阵。
  • $ w_k$ 是过程噪声。

2. 设定控制目标:

设定湖泊水位的目标向量为 $ x_{\text{target}}$。

3. 设计控制目标函数:

目标函数最小化系统状态与目标状态之间的差异:

J = ∑ k = 0 N ∥ x k − x target ∥ 2 J = \sum_{k=0}^{N} \|x_k - x_{\text{target}}\|^2 J=k=0Nxkxtarget2

4. 确定系统约束:

系统约束表示为:

C x k ≤ D Cx_k \leq D CxkD

其中 $ C$ 和 $ D$ 是相应的约束矩阵。

5. 预测未来系统状态:

使用模型,预测未来 $ N$ 个时间步骤内的系统状态:

x ^ k + j ∣ k = A j x k + ∑ i = 0 j − 1 A i B u k + j − i − 1 \hat{x}_{k+j|k} = A^j x_k + \sum_{i=0}^{j-1} A^{i}Bu_{k+j-i-1} x^k+jk=Ajxk+i=0j1AiBuk+ji1

6. 优化控制输入:

通过求解以下优化问题选择最优控制输入:

min ⁡ u k J = ∑ j = 0 N − 1 ∥ x ^ k + j ∣ k − x target ∥ 2 \min_{u_k} J = \sum_{j=0}^{N-1} \| \hat{x}_{k+j|k} - x_{\text{target}} \|^2 minukJ=j=0N1x^k+jkxtarget2

subject to  C x k ≤ D \text{subject to } Cx_k \leq D subject to CxkD

7. 实施控制:

将优化得到的控制输入 $ u_k^*$ 应用于湖泊系统:

u k = u k ∗ u_k = u_k^* uk=uk

8. 重复过程:

重复上述步骤,每个时间步骤都重新优化控制输入,考虑新的系统状态。

9. 灵敏性分析:

9.1 参数灵敏性:

Sensitivity k = ∂ J ∂ k \text{Sensitivity}_{k} = \frac{\partial J}{\partial k} Sensitivityk=kJ

9.2 初始水位灵敏性:

Sensitivity Initial = ∂ J ∂ x 0 \text{Sensitivity}_{\text{Initial}} = \frac{\partial J}{\partial x_0} SensitivityInitial=x0J

10. 优化和迭代:

基于灵敏性分析结果,优化 MPC 控制算法的参数,可能需要多次迭代以达到最优性能。

模型预测控制(MPC)算法简介:

1. 概述:
模型预测控制(Model Predictive Control, MPC)是一种先进的控制策略,它使用系统的动态模型进行预测,以优化未来一系列时间步骤内的控制输入,从而实现对系统的有效控制。

2. 基本思想:
MPC 的基本思想是在每个时间步骤上优化控制输入,然后实施系统的第一个控制输入。在下一个时间步骤,重新优化,考虑新的系统状态,并重复这个过程。这种迭代的方法使得MPC适用于多变量、多约束的系统。

3. 主要步骤:

  • 系统建模: 建立描述系统动态行为的数学模型,通常为状态空间模型。

  • 设定控制目标: 定义系统的目标,例如期望的状态或输出。

  • 设计目标函数: 构建优化问题的目标函数,通常为最小化系统状态与目标之间的差异。

  • 确定约束条件: 考虑系统约束,例如输入限制、状态约束等。

  • 预测未来系统状态: 使用建模过程,预测未来一段时间内的系统状态。

  • 优化控制输入: 在每个时间步骤上,通过求解优化问题来选择最优的控制输入,以最小化目标函数并满足约束条件。

  • 实施控制: 应用优化得到的控制输入到实际系统。

  • 迭代过程: 重复上述步骤,每个时间步骤都重新优化控制输入,考虑新的系统状态。

4. 优点:

  • MPC 能够处理多变量系统,并考虑多个控制目标和约束。
  • 通过使用系统模型进行预测,可以在考虑约束的同时优化控制输入。
  • 适用于非线性、时变和受约束的系统。

5. 在水位控制中的应用:

在水位控制问题中,MPC可以通过优化水流的调整来维持湖泊水位在期望范围内。通过建模湖泊的水量平衡等动态特性,MPC可以在考虑约束的情况下,实现水位的精确调控,以满足各利益相关者的需求。

import numpy as np
from scipy.optimize import minimize

# 湖泊水位控制的简化模型参数
A = np.array([[0.8]])
B = np.array([[0.2]])
C = np.array([[1]])
D = np.array([[0]])

# 控制参数
k = 0.1

# 初始水位
initial_water_level = 5.0

# 目标水位
target_water_level = 7.0

# 控制算法
def control_algorithm(current_water_level):
    adjustment = k * (target_water_level - current_water_level)
    return adjustment

# 优化目标函数
def objective_function(control_inputs):
    # 模拟湖泊水位的变化
    water_levels = [initial_water_level]
    for control_input in control_inputs:
        water_level = A.dot(water_levels[-1]) + B.dot(control_input)
        water_levels.append(water_level)
    
    # 计算目标函数,最小化水位与目标水位的差异
    objective = sum((C.dot(np.array(water_levels)) - target_water_level)**2)
    return objective

# 约束条件
def constraint_function(control_inputs):
    # 可以加入额外的约束条件,例如输入的范围等
    return np.array([])

# 优化问题求解
initial_guess = np.zeros(10)  # 初始猜测的控制输入
result = minimize(objective_function, initial_guess, constraints={'type': 'eq', 'fun': constraint_function})

# 输出优化结果
optimized_control_inputs = result.x
print("Optimized Control Inputs:", optimized_control_inputs)

# 应用优化得到的控制输入见完整版

问题四

1. 敏感性分析模型建立:

1.1 敏感性指标:

我们选择水位控制性能的均方根误差(RMSE)作为敏感性指标,这是一种常用于衡量模型预测精度的指标。其计算公式为:

RMSE = 1 N ∑ i = 1 N ( x i − x ^ i ) 2 \text{RMSE} = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i - \hat{x}_i)^2} RMSE=N1i=1N(xix^i)2

1.2 环境条件变量:

我们考虑三个可能影响水位控制的环境条件变量:

  • 降雨量(Rainfall)
  • 融雪量(Snowmelt)
  • 外部温度(Temperature)
1.3 关系模型:

我们建立系统性能(RMSE)与环境条件变量之间的关系。假设模型为线性关系:

RMSE = a ⋅ Rainfall + b ⋅ Snowmelt + c ⋅ Temperature + ϵ \text{RMSE} = a \cdot \text{Rainfall} + b \cdot \text{Snowmelt} + c \cdot \text{Temperature} + \epsilon RMSE=aRainfall+bSnowmelt+cTemperature+ϵ

其中, a , b , c a, b, c a,b,c 是待估计的系数, ϵ \epsilon ϵ 是随机误差。

2. 敏感性分析算法:

2.1 参数敏感性:

通过有限差分法,我们估计系数 a , b , c a, b, c a,b,c 对 RMSE 的敏感性。假设我们以 δ = 0.01 \delta = 0.01 δ=0.01 为例:

Sensitivity a = RMSE ( a + δ , b , c ) − RMSE ( a − δ , b , c ) 2 δ \text{Sensitivity}_{a} = \frac{\text{RMSE}(a + \delta, b, c) - \text{RMSE}(a - \delta, b, c)}{2 \delta} Sensitivitya=2δRMSE(a+δ,b,c)RMSE(aδ,b,c)

类似地,计算 Sensitivity b \text{Sensitivity}_{b} Sensitivityb Sensitivity c \text{Sensitivity}_{c} Sensitivityc

2.2 初始条件敏感性:

尝试不同的初始水位条件,观察 RMSE 的变化。例如,比较新的初始水位条件和原始初始水位条件下的 RMSE。

Sensitivity Initial = RMSE ( New Initial Condition ) − RMSE ( Original Initial Condition ) Original Initial Condition \text{Sensitivity}_{\text{Initial}} = \frac{\text{RMSE}(\text{New Initial Condition}) - \text{RMSE}(\text{Original Initial Condition})}{\text{Original Initial Condition}} SensitivityInitial=Original Initial ConditionRMSE(New Initial Condition)RMSE(Original Initial Condition)

2.3 外部环境敏感性:

变化降雨量、融雪量、外部温度,观察 RMSE 的变化。以降雨量为例:

Sensitivity Rainfall = RMSE ( Rainfall + δ , S n o w m e l t , T e m p e r a t u r e ) − RMSE ( Rainfall , S n o w m e l t , T e m p e r a t u r e ) δ \text{Sensitivity}_{\text{Rainfall}} = \frac{\text{RMSE}(\text{Rainfall} + \delta, Snowmelt, Temperature) - \text{RMSE}(\text{Rainfall}, Snowmelt, Temperature)}{\delta} SensitivityRainfall=δRMSE(Rainfall+δ,Snowmelt,Temperature)RMSE(Rainfall,Snowmelt,Temperature)

类似地,计算 Sensitivity Snowmelt \text{Sensitivity}_{\text{Snowmelt}} SensitivitySnowmelt Sensitivity Temperature \text{Sensitivity}_{\text{Temperature}} SensitivityTemperature

3. 综合分析:

综合以上敏感性分析的结果,可以得出关于控制算法对于不同环境条件的鲁棒性评估。例如,可以比较不同敏感性指标的相对重要性,以全面评估算法在不同情境下的性能表现。

4. 示例公式:

以参数敏感性为例,有:

Sensitivity a = RMSE ( a + δ , b , c ) − RMSE ( a − δ , b , c ) 2 δ \text{Sensitivity}_{a} = \frac{\text{RMSE}(a + \delta, b, c) - \text{RMSE}(a - \delta, b, c)}{2 \delta} Sensitivitya=2δRMSE(a+δ,b,c)RMSE(aδ,b,c)

同样的方法可以应用于 b b b c c c 的敏感性计算。

import numpy as np
from scipy.optimize import minimize

# 模型参数
a, b, c = 1.0, 0.5, 0.2  # 示例参数,实际应用中需要根据模型进行调整
delta = 0.01

# 模拟水位数据
N = 100
rainfall = np.random.rand(N)
snowmelt = np.random.rand(N)
temperature = np.random.rand(N)

# 模拟实际水位数据(示例,实际应用中应替换为真实数据)
actual_water_level = a * rainfall + b * snowmelt + c * temperature + np.random.normal(0, 0.1, N)

# 模型预测水位
def predict_water_level(a, b, c, rainfall, snowmelt, temperature):
    return a * rainfall + b * snowmelt + c * temperature

# 计算RMSE
def calculate_rmse(actual, predicted):
    return np.sqrt(np.mean((actual - predicted)**2))

# 优化目标函数(用于有限差分法的最小化)
def objective_function(params, a, b, c, delta, rainfall, snowmelt, temperature, actual):
    new_a, new_b, new_c = params
    predicted_water_level = predict_water_level(new_a, new_b, new_c, rainfall, snowmelt, temperature)
    return calculate_rmse(actual, predicted_water_level)

# 有限差分法估计参数敏感性
def calculate_parameter_sensitivity(param_index, a, b, c, delta, rainfall, snowmelt, temperature, actual):
    params = [a, b, c]
    params[param_index] += delta
    rmse_plus_delta = objective_function(params, a, b, c, delta, rainfall, snowmelt, temperature, actual)
    
    params[param_index] -= 2 * delta
    rmse_minus_delta = objective_function(params, a, b, c, delta, rainfall, snowmelt, temperature, actual)
    
    params[param_index] += delta  # 恢复原始参数值
    
    sensitivity = (rmse_plus_delta - rmse_minus_delta) / (2 * delta)
    return sensitivity#见完整

问题五

问题五建模思路:

1. Lake Ontario 水位管理模型:

1.1 水位控制因素:
  • 湖泊补给源: 入湖流量 I ( t ) I(t) I(t)
  • 湖泊排水源: 排水流量 O ( t ) O(t) O(t)
  • 湖泊蒸发: 蒸发量 E ( t ) E(t) E(t)
  • 湖泊降雨: 降雨量 R ( t ) R(t) R(t)
  • 湖泊人工控制: 人工控制量 U ( t ) U(t) U(t)
1.2 水位模型:

湖泊水位模型可以采用动态水库模型:
d h d t = I ( t ) − O ( t ) − E ( t ) + R ( t ) + U ( t ) \frac{dh}{dt} = I(t) - O(t) - E(t) + R(t) + U(t) dtdh=I(t)O(t)E(t)+R(t)+U(t)

2. 利益相关方和目标分析:

2.1 利益相关方:
  • 当地居民: 洪水风险降低、水质保护。
  • 渔业: 水生态系统保护。
  • 航运公司: 航运通畅度。
  • 政府机构: 水资源管理和环境保护。
2.2 目标:
  • 洪水风险控制: $ \min \int (h - h_{\text{target}})^2 , dt $
  • 生态保护: $ \max \int E(t) , dt $
  • 航运通畅: $ \max \int U(t) , dt $

3. 模型优化与算法选择:

3.1 优化目标:

多目标优化问题:
minimize   J ( h , E , U ) = α ∫ ( h − h target ) 2   d t − β ∫ E ( t )   d t − γ ∫ U ( t )   d t \text{minimize} \, J(h, E, U) = \alpha \int (h - h_{\text{target}})^2 \, dt - \beta \int E(t) \, dt - \gamma \int U(t) \, dt minimizeJ(h,E,U)=α(hhtarget)2dtβE(t)dtγU(t)dt
其中, α , β , γ \alpha, \beta, \gamma α,β,γ 是权重系数。

3.2 算法选择:

采用多目标遗传算法(MOGA)进行优化。

4. 环境条件敏感性分析:

Sensitivity Rainfall = ∂ h ∂ R ( t ) \text{Sensitivity}_{\text{Rainfall}} = \frac{\partial h}{\partial R(t)} SensitivityRainfall=R(t)h
Sensitivity Temperature = ∂ h ∂ T ( t ) \text{Sensitivity}_{\text{Temperature}} = \frac{\partial h}{\partial T(t)} SensitivityTemperature=T(t)h
Sensitivity Area = ∂ h ∂ A ( t ) \text{Sensitivity}_{\text{Area}} = \frac{\partial h}{\partial A(t)} SensitivityArea=A(t)h

5. 历史数据分析:

使用历史数据进行参数估计和模型验证:
J hist ( h , E , U ) = α ∫ ( h − h observed ) 2   d t − β ∫ E ( t )   d t − γ ∫ U ( t )   d t J_{\text{hist}}(h, E, U) = \alpha \int (h - h_{\text{observed}})^2 \, dt - \beta \int E(t) \, dt - \gamma \int U(t) \, dt Jhist(h,E,U)=α(hhobserved)2dtβE(t)dtγU(t)dt

6. 实时监测与调整:

实时监测系统通过观测数据更新模型参数:
J real-time ( h , E , U ) = α ∫ ( h − h target ) 2   d t − β ∫ E ( t )   d t − γ ∫ U ( t )   d t J_{\text{real-time}}(h, E, U) = \alpha \int (h - h_{\text{target}})^2 \, dt - \beta \int E(t) \, dt - \gamma \int U(t) \, dt Jreal-time(h,E,U)=α(hhtarget)2dtβE(t)dtγU(t)dt

7. 决策支持系统:

提供决策支持系统可视化多目标优化结果和实时水位信息。

import numpy as np
from scipy.integrate import quad
from scipy.optimize import differential_evolution

# 示例数据,需要替换为实际数据
h_target = 10.0
h_observed = np.random.rand(100) * 5 + 5  # 模拟观测到的水位
E = np.random.rand(100)  # 模拟蒸发量
U = np.random.rand(100)  # 模拟人工控制量
R = np.random.rand(100)  # 模拟降雨量

# 权重系数
alpha, beta, gamma = 1.0, 0.1, 0.1

# 目标函数
def objective_function(params):
    h, E, U = params
    J1 = alpha * np.sum((h - h_target)**2)
    J2 = -beta * np.sum(E)
    J3 = -gamma * np.sum(U)
    return J1 + J2 + J3

# 约束条件函数(水位模型)
def water_level_model(params):
    h, E, U = params
    dh_dt = quad(lambda t: R[t] - E[t] + U[t], 0, len(R) - 1)[0]
    return h - h_observed + dh_dt

# 优化参数范围
bounds = [(0, 20), (0, 1), (0, 1)]#见完整

问题六

1. 历史数据分析:
1.1 数据预处理:
  • 数据清理: 使用插值或平均值填充缺失值,检测并修正异常值。
# 举例:使用线性插值填充缺失值
df['column'].interpolate(method='linear', inplace=True)
  • 数据重采样: 将数据按月或季度进行重采样,确保数据具有一致的时间尺度。
# 举例:按月重采样
df_resampled = df.resample('M').mean()
1.2 水位模型校准:
  • 参数校准: 使用历史数据进行参数估计,最小化模型模拟结果与观测值的误差。
# 举例:使用最小二乘法进行参数估计
from scipy.optimize import curve_fit

def water_level_model(t, a, b, c):
    return a * np.sin(b * t) + c

params, covariance = curve_fit(water_level_model, time_points, observed_data)
2. 效果评估与管理策略:
2.1 优化后的模型评估:
  • 模型误差计算: 比较校准后模型模拟结果与实际观测值,计算误差指标。
# 举例:计算均方根误差(RMSE)
from sklearn.metrics import mean_squared_error

rmse = np.sqrt(mean_squared_error(observed_data, simulated_data))
2.2 管理策略评估:
  • 管理策略效果指标: 比较历史数据中采用的管理策略和模型仿真结果,评估管理策略的效果。
# 举例:比较实际观测值和模拟值
strategy_effectiveness = calculate_effectiveness(observed_data, simulated_data)
3. 灵敏性分析:
3.1 参数灵敏性:
  • 参数灵敏性分析: 通过改变水位模型中的关键参数,分析模型对参数变化的灵敏性。
# 举例:计算参数灵敏性
sensitivity_to_parameter = calculate_sensitivity_to_parameter(model, parameters, observed_data)
3.2 控制策略灵敏性:
  • 策略灵敏性分析: 评估控制策略对不同环境条件和需求变化的适应性。
# 举例:计算控制策略灵敏性
sensitivity_to_strategy = calculate_sensitivity_to_strategy(model, strategy, observed_data)
4. 决策支持系统的改进:
  • 模型改进和实时监测系统更新: 根据历史数据分析的结果,更新水位模型和实时监测系统。
# 举例:更新水位模型
updated_model = improve_model(model, observed_data, simulated_data)
5. 结果总结与建议:
  • 报告生成和决策建议: 汇总历史数据分析的结果,生成报告,并提出关于模型校准、管理策略效果和系统改进的建议。
# 举例:生成报告
generate_report(model_evaluation, strategy_evaluation, sensitivity_analysis)
6. 实时监测与调整:
  • 实时监测系统维护: 结合历史数据分析的结果,不断调整水位模型和管理策略,保持实时监测系统的准确性。
# 举例:实时调整策略
real_time_adjustment = adjust_strategy(real_time_data, model_parameters)
7. 决策支持系统的改进:
  • 决策支持系统更新: 根据历史数据分析的结果,改进决策支持系统,提供更准确的实时水位管理建议。
# 举例:更新决策支持系统
updated_decision_support_system = improve_decision_support_system(old_system, new_data)

更多内容具体可以看看我的下方名片!里面包含有美赛一手资料与分析!
另外在赛中,我们也会持续陪大家一起解析美赛的一些方向
关注 CS数模 团队,数模不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络原理-TCP/IP(4)

TCP原理 滑动窗口 之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段. 确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大…

hivesql的基础知识点

目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…

字符串的简单处理

第1题 ISBN号码 查看测评数据信息 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最…

图像超分辨率方法与在线工具

图像超分辨率(Super Resolution, SR)是一种增强图像分辨率的技术,目的是从低分辨率(Low Resolution, LR)图像重建出高分辨率(High Resolution, HR)图像。这项技术在视频增强、卫星图像处理、医学成像等领域有广泛应用。图像超分辨率方法可以分为三大类:插…

Python算法题集_矩阵置零

Python算法题集_矩阵置零 题73:矩阵置零1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【三层循环】2) 改进版一【纵横计数器】3) 改进版二【原地算法】 4. 最优算法 本文为Python算法题集之一的代码示例 题73:矩阵置零…

linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(二):软链接

0、序 上一篇:linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(一):硬链接 描述了硬链接相关内容,本篇主要描述软链接。 1、软链接 符号链接也称软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。…

【JS】Express.js环境配置与示例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Express.js环境配置与示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不…

【云手机】快速获取一台属于你的云手机,在云上调试你的应用!

0x00 前言 随着科技的飞速发展,云手机已然成为一种云端虚拟商品,它打破地域限制,让你随时随地畅享移动体验。红手指、小鱼云手机等平台虽便捷易用,却在可扩展性和隐私性方面有所欠缺。冗长的《隐私政策》是否让你望而却步&#x…

C++通用编程(2)

函数模板高级用法 1.分文件编写的优点2.普通函数的分文件编写3.函数模板的分文件编写4.细节提示5.函数模板应用高级decltype推导类型函数后置返回类型 6.总结 函数模板讲完后,C全部的函数类型我们就接触的差不多了。今天给做一些关于函数份文件编写的知识点补充。 1…

C# winform 多语言(json)方式实现

前后对比 使用nuget json工具包1.总体思路 创建对应的json字典对照表 { "测试":"Test", "语言":"Language", "设置":"Set", "中文(默认)":"Chinese (default)", "英文":"E…

【对象属性拷贝】⭐️按照需要转换的类型反射设置拷贝后对象的属性

背景: 小伙伴们大家好,最近开发的时候遇到一种情况,项目引入了全局序列化器来实现Date,LocalDateTime类型的字段根据时区转换,总体来说接口没什么要改动的,只要原来字段的属性是以上两种就行,但…

【linux】校招中的“熟悉linux操作系统”一般是指达到什么程度?

这样,你先在网上找一套完整openssh升级方案(不是yum或apt的,要源码安装的),然后在虚拟机上反复安装测试,直到把他理解了、背下来。 面试的时候让你简单说说linux命令什么的,你就直接把这个方案…

Linux服务详解

如有错误或有补充,以及任何改进的意见,请在评论区留下您的高见,同时文中给出大部分命令的示例,即是您暂时无法在Linux中查看,您也可以知道各种操作的功能以及输出 如果觉得本文写的不错,不妨点个赞&#x…

CentOS 7中搭建NFS文件共享服务器的完整步骤

CentOS 7中搭建NFS文件共享服务器的完整步骤 要求:实现镜像文件共享,并基于挂载的共享目录配置yum源。 系统环境: 服务器:172.20.26.167-CentOS7.6 客户端:172.20.26.198-CentOS7.6 1、在服务器和客户端上&#x…

案例分析技巧-软件工程

一、考试情况 需求分析(※※※※)面向对象设计(※※) 二、结构化需求分析 数据流图 数据流图的平衡原则 数据流图的答题技巧 利用数据平衡原则,比如顶层图的输入输出应与0层图一致补充实体 人物角色:客户、…

MySQL 索引和事务

目录 1 索引1.1 简介1.2 使用1.3 示例 2 事务2.1 简介2.2 使用 1 索引 1.1 简介 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 索引底层是…

TypeScript 学习笔记(Day4)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. TypeScript 学习笔记(Day1) 2. TypeScript 学习笔…

Three.js学习2:页面引入 Three.js

一、关于 Three.js 的版本 随着页面3D化应用越来越多,近两年 Three.js 处于飞速发展之中。现在 Three.js 几乎每个月都会发布一个新的版本,会增加新的 API,废掉一些旧的功能之类的。 可以从 Three.js 官网 Three.js – JavaScript 3D Libra…

web漏洞扫码工具

Invicti 是一种自动化但完全可配置的 Web 应用程序安全扫描程序,使您能够扫描网站、Web 应用程序和 Web 服务,并识别安全漏洞。Invicti 可以扫描所有类型的 Web 应用程序,无论其构建平台或语言。 Invicti 是唯一一款能够以只读且安全的方式自…

Next.js初识

Next.js初识 Next.js:这是一个用于生产环境的React 框架(国外用的比较多)。 Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验:包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能 无需任何配…