如何修改Dymos的traj.simulate()参数以开展蒙特卡洛分析?
调整Dymos中traj.simulate()的运行参数方法
要在traj.simulate()中修改初始条件、推力、气动系数这类参数,核心是通过传递仿真用的输入参数或修改模型的状态/参数值来实现,以下是具体操作方式:
1. 修改初始状态(比如初始燃油量)
在调用simulate()前,先从最优解中获取基线状态,再修改目标初始值,通过simulate()的initial_guesses参数传入:
# 先获取最优解的初始燃油量 baseline_fuel = prob.get_val('traj.phase0.timeseries.states:fuel_mass')[0] # 扰动初始燃油量(示例:减少10%) perturbed_fuel = baseline_fuel * 0.9 # 构造初始猜测字典,覆盖原初始值 initial_guess = {'traj.phase0.states:fuel_mass': perturbed_fuel} # 传入simulate函数执行仿真 traj.simulate(initial_guesses=initial_guess)
2. 修改模型参数(比如推力系数、气动系数)
如果你的Dymos模型中通过add_parameter()定义了可调整参数(如params:thrust_coeff),可以直接在仿真前修改参数值,再执行仿真:
# 修改推力系数为原最优值的1.05倍 baseline_thrust_coeff = prob.get_val('traj.phase0.parameters:thrust_coeff') prob.set_val('traj.phase0.parameters:thrust_coeff', baseline_thrust_coeff * 1.05) # 执行仿真,模型会使用修改后的参数运行 traj.simulate()
3. 批量扰动仿真生成轨迹包络
如果要多次随机扰动参数生成轨迹包络,可通过循环结合上述方法,每次修改参数/初始状态后调用simulate()并保存结果:
import numpy as np # 示例:生成5次随机初始燃油量扰动仿真 for i in range(5): # 在±5%范围内随机扰动初始燃油量 perturb_ratio = np.random.uniform(0.95, 1.05) perturbed_fuel = prob.get_val('traj.phase0.timeseries.states:fuel_mass')[0] * perturb_ratio initial_guess = {'traj.phase0.states:fuel_mass': perturbed_fuel} # 执行仿真 traj.simulate(initial_guesses=initial_guess) # 保存当前仿真轨迹数据 np.save(f'simulation_result_{i}.npy', prob.get_val('traj.phase0.timeseries.states'))
关键注意点
- 确保修改的参数/状态在Dymos模型中已正确定义:状态变量需通过
add_state()声明,参数需通过add_parameter()声明。 simulate()默认沿用最优解作为初始猜测,仅修改部分参数时,其余值会自动继承最优解,无需全部重新定义。- 仿真后可通过
prob.get_val()提取轨迹数据,与原最优解做对比分析。
内容的提问来源于stack exchange,提问作者Mark Garnett
相关产品推荐
相关产品推荐

