插值表
插值表功能允许用户在优化建模时使用预定义的数据进行插值计算, 适用于需要基于数据进行建模的场景, 如基于风洞测试数据进行飞行器性能建模等. 当前支持一维, 二维和三维插值表.
在使用前需要先导入相关模块:
from optimake.extension import *
插值表功能依赖scipy库, 请确保已安装scipy库 (1.14.0版本及以上).
建模
定义插值表
下面为定义一维和二维插值表的例子:
# 定义一维插值表
M2 = [0, 0.4, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8]
etatab = [0.54, 0.54, 0.54, 0.75, 0.79, 0.78, 0.89, 0.93, 0.93]
lt_eta = lookup_table(name='eta', points=M2, values=etatab, method='cubic', bc_type='natural', interp_func=None)
# 定义二维插值表
Mtab = np.array(
[0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8])
alttab = 304.8 * np.array(
[0, 5, 10, 15, 20, 25, 30, 40, 50, 70])
Ttab = 4448.222* np.array(
[[24.2, 24.0, 20.3, 17.3, 14.5, 12.2, 10.2, 5.7, 3.4, 0.1], # M = 0
[28.0, 24.6, 21.1, 18.1, 15.2, 12.8, 10.7, 6.5, 3.9, 0.2], # M = 0.2
[28.3, 25.2, 21.9, 18.7, 15.9, 13.4, 11.2, 7.3, 4.4, 0.4],
[30.8, 27.2, 23.8, 20.5, 17.3, 14.7, 12.3, 8.1, 4.9, 0.8],
[34.5, 30.3, 26.6, 23.2, 19.8, 16.8, 14.1, 9.4, 5.6, 1.1],
[37.9, 34.3, 30.4, 26.8, 23.3, 19.8, 16.8, 11.2, 6.8, 1.4],
[36.1, 38.0, 34.9, 31.3, 27.3, 23.6, 20.1, 13.4, 8.3, 1.7],
[36.1, 36.6, 38.5, 36.1, 31.6, 28.1, 24.2, 16.2, 10.0, 2.2],
[36.1, 35.2, 42.1, 38.7, 35.7, 32.0, 28.1, 19.3, 11.9, 2.9],
[36.1, 33.8, 45.7, 41.3, 39.8, 34.6, 31.1, 21.7, 13.3, 3.1]])
lt_T = lookup_table(name='T', points=[Mtab.tolist(), alttab.tolist()], values=Ttab.tolist(), method='cubic', interp_func=None)
通过lookup_table接口定义插值表, 其入参如下:
name: 插值表名称points: 插值表的输入点, 每个维度必须单调递增- 对于一维插值表, 其为一个列表
- 对于二维插值表, 其为一个包含两个列表的列表, 分别表示两个输入变量的点
- 对于三维插值表, 其为一个包含三个列表的列表, 分别表示三个输入变量的点
values: 插值表的输出值- 对于一维插值表, 其为一个列表
- 对于二维插值表, 其为一个二维列表, 每一行对应第一个输入变量的一个点, 每一列对应第二个输入变量的一个点
- 对于三维插值表, 其为一个三维列表, 每一层对应第一个输入变量的一个点, 每一行对应第二个输入变量的一个点, 每一列对应第三个输入变量的一个点
method: 插值方法, 可选值为'cubic', 'pchip', 'akima', 'makima', 'user', 默认为'cubic'bc_type: 边界条件类型, 仅在method为'cubic'且points为一维时有效, 可选值为'natural', 'clamped', 'not-a-knot', 默认为'natural'interp_func: 用户自定义的插值函数, 仅在method为'user'时有效, 其为一个函数对象且阶次为3, 其输入为插值表的输入点, 输出为插值表的输出值
信息
以上的插值功能是基于scipy.interpolate库实现的, 其支持的插值方法和边界条件类 型与scipy.interpolate库一致. 可以参考scipy.interpolate库的文档了解更多关于插值方法和边界条件类型的信息.
使用插值表进行插值计算
通过定义的插值表, 可以在优化建模中使用interpolation接口进行插值计算, 其入参如下:
lookup_table: 通过lookup_table接口定义的插值表*args: 插值表的输入变量, 关于优化变量的表达式或者常数
例如, 下面为使用定义的插值表进行插值计算的例子:
eta = interpolation(lt_eta, Mach)
Thrust = interpolation(lt_T, Mach, h)
当插值表的输入变量为常数时, interpolation函数会返回一个常数值. 反之, 当插值表的输入变量关于优化变量的表达式时, interpolation函数会返回一个关于优化变量的表达式, 可以作为目标函数或者约束进行建模.
例如, 下面为将插值表的输出作为目标函数进行最小化的例子:
prob.objective((Thrust - Thrust_ref) ** 2)