Scipy三维和更高维插值

Scipy三维插值

插值运算在科学计算任务中非常常见,而scipy又是使用python进行科学计算任务的必备工具之一。关于如何使用scipy进行一位和二维插值官方文档介绍的已经非常详细,基本上根据demo操作就能搞清楚怎么使用scipy进行一维和二维插值。但是有时发现自己需要使用scipy进行三维和更高维插值,然而官方文档对于如何进行高维插值介绍的十分简略,很难看懂,这里详细分析一下怎么使用scipy.interpolate.interpn实现n维插值。

1.官方文档介绍

scipy.interpolate.interpn(
points,
values,
xi,
method='linear', 
bounds_error=True, 
fill_value=nan)

points:形如 (m1, ), …, (mn, )numpy浮点数组元组,用来定义n维插值的空间,每个元素相当于一个维度坐标轴上已知数据点的坐标值,比如三维插值,传入元组的三个元素代表已知数据点在x,y,z三个坐标轴上的坐标值,这里看不懂可以看示例。

values:类似于数组,形如 (m1,…,mn) 的已知数据点对应的值,和point在每个维度上一一对应,表示已知数据点的值。

xinnumpy数组,和point在维度上一一对应,表示需要获取值的点在每个维度上的坐标值,如果是三维,表明你传入的是坐标(x,y,z),希望得到f(x,y,z)。

method : 插值实现方法,和一维、二维类似,一般由 linearnearest等插值方法。

bounds_error: 当传入的 xi某个或者多个坐标值不在给定插值空间(空间范围由 points每个维度上的最大和最小值划定)中时是否抛出错误,默认 True,如果设置为 False,当 fill_valueFalse,将会返回 numpy NAN值。

fill_value :设置为 True,当 xi不在给定插值空间时,根据一定的算法的计算出某个值,如果 xi 距离给定插值空间比较远,通常这个值误差很大。

示例

给定以下数据
导弹重心位置是 X g = 0.9381 X_g=0.9381 Xg=0.9381时,阻尼力矩导数
Scipy三维和更高维插值_第1张图片
导弹重心位置是 X g = 0.8896 X_g=0.8896 Xg=0.8896时,阻尼力矩系数导数
Scipy三维和更高维插值_第2张图片
Scipy三维和更高维插值_第3张图片
导弹重心 X g X_g Xg为[0.8896,0.9831],攻角 α \alpha α在[ − 1 0 。 -10^。 10 1 0 。 10^。 10],马赫数Ma在[0.1,0.9],现在要求导弹质心位置为 X g 1 = 0.8900 X_{g1}=0.8900 Xg1=0.8900,攻角为 α 1 = 5 。 \alpha_1 =5^。 α1=5,马赫数 M a 1 = 0.5 Ma_1=0.5 Ma1=0.5的阻尼力矩系数导数。

分析

这里涉及三维插值,定义插值空间的三个维度分别是质心位置 X g X_g Xg,攻角 α \alpha α和马赫数Ma,这三个量的元组就是scipy.interpolate.interpn n维插值函数的points,表格中是已知数据点,就是values;[ X g 1 X_{g1} Xg1, α 1 \alpha_1 α1 , M a 1 Ma_1 Ma1]就是xi。

插值程序

import numpy as np
from scipy.interpolate import interpn 

#三维python列表,第一维是对应质心位置,第二维对应马赫数,第三维对应攻角
#攻角单位是弧度。
values = []
#x_g=0.8896是阻尼力矩系数导数的值
values.append(data["derivative_of_damping_moment_xg_8896"])
#x_g=0.9831是阻尼力矩系数导数的值
values.append(data["derivative_of_damping_moment_xg_9381"])
points=(
	np.array([0.8896, 0.9381]),
	#数据表格中给定的马赫数数组
	data["mach_number"],
	#数据表格中给定的攻角范围数组
	data["attack_angle"]
)
#给定的要求阻尼力矩系数导数的坐标值
xi=np.array([x_g_1, mach_number_1, attack_angle_1])
#进行n维插值,这里是三维插值
res = interpn(
	points,
	values,xi,
	fill_value=True,
	bounds_error=False,
    method='linear')
#得到一个只有一个元素的一维数组,就是在xi坐标对应的插值函数值。    
print(res[0])

values的结构如下:

[array([[-0.7182, -0.6999, -0.6805, -0.66  , -0.6384, -0.6179, -0.6384,
        -0.66  , -0.6805, -0.6999, -0.7182],
       [-0.7207, -0.7024, -0.683 , -0.6626, -0.641 , -0.6207, -0.641 ,
        -0.6626, -0.683 , -0.7024, -0.7207],
       [-0.7249, -0.7067, -0.6874, -0.667 , -0.6455, -0.6253, -0.6455,
        -0.667 , -0.6874, -0.7067, -0.7249],
       [-0.731 , -0.7129, -0.6937, -0.6734, -0.6521, -0.6319, -0.6521,
        -0.6734, -0.6937, -0.7129, -0.731 ],
       [-0.7406, -0.7226, -0.7036, -0.6835, -0.6624, -0.6424, -0.6624,
        -0.6835, -0.7036, -0.7226, -0.7406],
       [-0.7636, -0.7459, -0.7272, -0.7074, -0.6866, -0.6669, -0.6866,
        -0.7074, -0.7272, -0.7459, -0.7636],
       [-0.7948, -0.7774, -0.7589, -0.7395, -0.719 , -0.6997, -0.719 ,
        -0.7395, -0.7589, -0.7774, -0.7948],
       [-0.8365, -0.8194, -0.8014, -0.7824, -0.7624, -0.7435, -0.7624,
        -0.7824, -0.8014, -0.8194, -0.8365],
       [-0.9035, -0.8859, -0.8672, -0.8474, -0.8266, -0.8069, -0.8266,
        -0.8474, -0.8672, -0.8859, -0.9035]]), array([[-0.5409, -0.5272, -0.513 , -0.4982, -0.4829, -0.4686, -0.4829,
        -0.4982, -0.513 , -0.5272, -0.5409],
       [-0.5429, -0.5292, -0.515 , -0.5003, -0.485 , -0.4707, -0.485 ,
        -0.5003, -0.515 , -0.5292, -0.5429],
       [-0.5464, -0.5327, -0.5186, -0.5039, -0.4886, -0.4744, -0.4886,
        -0.5039, -0.5186, -0.5327, -0.5464],
       [-0.5514, -0.5378, -0.5237, -0.509 , -0.4939, -0.4797, -0.4939,
        -0.509 , -0.5237, -0.5378, -0.5514],
       [-0.5593, -0.5458, -0.5318, -0.5173, -0.5022, -0.4882, -0.5022,
        -0.5173, -0.5318, -0.5458, -0.5593],
       [-0.5791, -0.5658, -0.552 , -0.5376, -0.5227, -0.5089, -0.5227,
        -0.5376, -0.552 , -0.5658, -0.5791],
       [-0.6058, -0.5927, -0.579 , -0.5649, -0.5502, -0.5366, -0.5502,
        -0.5649, -0.579 , -0.5927, -0.6058],
       [-0.6415, -0.6287, -0.6153, -0.6014, -0.5871, -0.5738, -0.5871,
        -0.6014, -0.6153, -0.6287, -0.6415],
       [-0.696 , -0.683 , -0.6694, -0.6553, -0.6407, -0.6272, -0.6407,
        -0.6553, -0.6694, -0.683 , -0.696 ]])]

你可能感兴趣的:(python科学计算,scipy,python,算法)