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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:24:54