使用Python GEKKO与IPOPT、Poliastro/Astropy的时间转换问题
GEKKO MV变量无法传入Astropy Time类转换时间格式
问题场景
使用Python GEKKO结合IPOPT与Poliastro/Astropy开发时,定义了如下操纵变量与初始猜测:
# Manipulating variables and initial guesses launch = m.MV(value = 2460159.5, lb = 2460159.5, ub = 2460525.5) launch.STATUS = 1 flyby = m.MV(value = 2460424.5, lb = 2460342.5, ub = 2460525.5) flyby.STATUS = 1 arrival = m.MV(value = 2460694.5, lb = 2460480.5, ub = 2460845.5) arrival.STATUS = 1
尝试将这些变量传入Astropy的Time类转换时间格式时:
# Dates date_launchE = Time(launch, format="jd", scale="utc").tdb date_flyby = Time(flyby, format="jd", scale="utc").tdb # Mars date_arrivalE = Time(arrival, format="jd", scale="utc").tdb
触发错误:
ValueError: Input values did not match the format class jd: TypeError:
for jd class, input should be doubles, string, or Decimal, and second
values are only allowed for doubles.
使用print(launch)仅返回'p1',需要获取变量的数值以满足时间格式转换需求。
解决方案
GEKKO的MV(操纵变量)是符号型变量,用于构建优化模型的数学表达式,并非直接存储数值的普通变量,因此不能直接传入Astropy Time类。需要通过.value属性访问其数值:
1. 获取初始猜测值(求解前)
如果需要使用定义时的初始猜测值,直接调用变量的.value[0](GEKKO变量以数组形式存储数值,需取索引0):
# 获取初始猜测值用于时间转换 date_launchE = Time(launch.value[0], format="jd", scale="utc").tdb date_flyby = Time(flyby.value[0], format="jd", scale="utc").tdb date_arrivalE = Time(arrival.value[0], format="jd", scale="utc").tdb
2. 获取优化求解后的数值(求解后)
若要使用IPOPT求解后的最优值,需先调用m.solve()完成优化,再通过.value[0]获取结果:
# 执行优化求解 m.solve(disp=False) # 获取求解后的时间数值并转换 date_launchE_opt = Time(launch.value[0], format="jd", scale="utc").tdb date_flyby_opt = Time(flyby.value[0], format="jd", scale="utc").tdb date_arrivalE_opt = Time(arrival.value[0], format="jd", scale="utc").tdb
注:print(launch)返回'p1'是因为GEKKO内部用符号名称标识变量,用于构建优化问题的数学模型,并非数值本身。
内容的提问来源于stack exchange,提问作者pbhuter
相关产品推荐
相关产品推荐

