一、引言
2022年A题是围绕波浪能发电装置进行运动学建模,整体建模难度中等;可以调用模型进行求解,编程难度中等,整体解题难度中等偏下。
第二问紧接着第一问,根据第一问的建模进行优化,可以调用多种优化模型进行优化。第二问分为两个部分,阻尼力不变和阻尼力变化。阻尼力不变时候为一维线性优化,阻尼力变化为双变量二维优化。
题目下载链接:2022高教社杯全国大学生数学建模竞赛赛题下载(官方链接)
二、建模思路
第一步:物理系统与假设
- 研究对象:与问题1相同,为一个波浪能转换装置,由外部浮子、内部振子以及连接二者的能量输出系统(PTO)构成。PTO包含弹簧和直线阻尼器。
- 核心假设:
- 浮子只做垂荡运动,就是纯上下平移。
- 海水无粘、无旋,波浪为线性微幅波。
- 忽略所有摩擦及PTO等部件的质量。
- 核心变化:波浪频率更换为 ω = 2.2143 s − 1 \omega = 2.2143 \text{s}^{-1} ω=2.2143s−1,目标是优化阻尼系数以最大化平均输出功率。
第二步:变量与参数定义(同第一问)
- 状态变量:
- 浮子垂荡位移和速度: x f ( t ) x_f(t) xf(t), v f ( t ) v_f(t) vf(t)
- 振子垂荡位移和速度: x o ( t ) x_o(t) xo(t), v o ( t ) v_o(t) vo(t)
- 关键参数:
- 系统参数: m f , m o , m a , k s , c w , B , F 0 m_f, m_o, m_a, k_s, c_w, B, F_0 mf,mo,ma,ks,cw,B,F0。
- 优化变量:直线阻尼器的阻尼系数 c d c_d cd。本问题旨在寻找使平均功率最大的 c d c_d cd 值。
第三步:受力分析与功率定义
浮子与振子的受力分析与问题1完全相同。因此,我们直接得到运动方程。
功率计算是问题2的新核心:
阻尼器是能量提取元件,其瞬时功率等于阻尼力乘以相对速度:
P
(
t
)
=
F
d
(
t
)
⋅
v
rel
(
t
)
P(t) = F_d(t) \cdot v_{\text{rel}}(t)
P(t)=Fd(t)⋅vrel(t)
其中,
v
rel
(
t
)
=
v
o
(
t
)
−
v
f
(
t
)
v_{\text{rel}}(t) = v_o(t) - v_f(t)
vrel(t)=vo(t)−vf(t)。
- 对于情形1(线性阻尼):
F
d
=
c
d
⋅
v
rel
F_d = c_d \cdot v_{\text{rel}}
Fd=cd⋅vrel,代入得:
P ( t ) = c d ⋅ ( v rel ( t ) ) 2 P(t) = c_d \cdot (v_{\text{rel}}(t))^2 P(t)=cd⋅(vrel(t))2 - 优化目标是最大化平均输出功率,即在一段稳定时间
T
T
T 内对瞬时功率取平均:
P ˉ = 1 T ∫ t 0 t 0 + T P ( t ) d t ≈ 1 N ∑ i = 1 N c d ⋅ ( v rel ( t i ) ) 2 \bar{P} = \frac{1}{T} \int_{t_0}^{t_0+T} P(t) dt \approx \frac{1}{N} \sum_{i=1}^{N} c_d \cdot (v_{\text{rel}}(t_i))^2 Pˉ=T1∫t0t0+TP(t)dt≈N1i=1∑Ncd⋅(vrel(ti))2
第四步:运动方程与优化模型建立
-
运动微分方程(线性阻尼):
浮子方程:
( m f + m a ) x ¨ f = F 0 cos ( ω t ) + c d ( v o − v f ) + k s ( x o − x f ) − c w v f − B x f (m_f + m_a) \ddot{x}_f = F_0 \cos(\omega t) + c_d (v_o - v_f) + k_s (x_o - x_f) - c_w v_f - B x_f (mf+ma)x¨f=F0cos(ωt)+cd(vo−vf)+ks(xo−xf)−cwvf−Bxf振子方程:
m o x ¨ o = − c d ( v o − v f ) − k s ( x o − x f ) m_o \ddot{x}_o = - c_d (v_o - v_f) - k_s (x_o - x_f) mox¨o=−cd(vo−vf)−ks(xo−xf) -
优化模型建立:
- 优化变量: c d c_d cd
- 目标函数:平均输出功率 P ˉ ( c d ) \bar{P}(c_d) Pˉ(cd)
- 约束条件: 0 ≤ c d ≤ 100000 0 \le c_d \le 100000 0≤cd≤100000,且运动满足上述微分方程及初始条件。
- 问题表述:寻找一个最优的
c
d
∗
c_d^*
cd∗,使得系统在给定波浪激励下,从运动方程解出的
P
ˉ
(
c
d
)
\bar{P}(c_d)
Pˉ(cd) 达到最大。
c d ∗ = arg max 0 ≤ c d ≤ 1 0 5 P ˉ ( c d ) c_d^* = \arg \max_{0 \le c_d \le 10^5} \bar{P}(c_d) cd∗=arg0≤cd≤105maxPˉ(cd)
第五步:求解策略
-
为什么需要数值优化?
目标函数 P ˉ ( c d ) \bar{P}(c_d) Pˉ(cd) 是隐式的。你无法直接写出一个关于 c d c_d cd 的简单函数式,因为 P ˉ \bar{P} Pˉ 的值依赖于微分方程组的数值解。这构成了一个仿真优化问题。 -
求解的基本思想(两层循环):
- 内层循环(仿真):对于一个给定的候选阻尼系数 c d c_d cd,通过龙格-库塔法求解微分方程组,得到系统在足够长时间(如100s后达到稳态)内的运动响应 x f ( t ) , x o ( t ) , v f ( t ) , v o ( t ) x_f(t), x_o(t), v_f(t), v_o(t) xf(t),xo(t),vf(t),vo(t)。
- 外层循环(优化):采用优化算法(如遗传算法,如你所提供的代码中使用的)在区间 [ 0 , 100000 ] [0, 100000] [0,100000] 内搜索 c d c_d cd。该算法会生成一系列 c d c_d cd 的候选值,对每个值调用内层循环进行仿真并计算其对应的平均功率 P ˉ \bar{P} Pˉ,然后根据功率大小引导搜索方向,最终逼近使 P ˉ \bar{P} Pˉ 最大的 c d ∗ c_d^* cd∗。
三、编程计算
遗传算法代码
def objective_function(self, individual: List[float]) -> Tuple[float]:
"""目标函数 - 计算平均功率(最大化问题)"""
try:
power = self.run_simulation(individual[0])
return (power,)
except Exception as e:
print(f"模拟错误: {e}")
return (0.0,)
def setup_genetic_algorithm(self) -> base.Toolbox:
"""设置遗传算法工具箱"""
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, 0, 100000)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_float, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("evaluate", self.objective_function)
toolbox.register("mate", tools.cxBlend, alpha=0.5)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1000, indpb=0.2)
toolbox.register("select", tools.selTournament, tournsize=3)
return toolbox
4万+

被折叠的 条评论
为什么被折叠?



