使用负斜率对曲线上的数据点进行插值

时间:2016-01-18 15:05:44

标签: python numpy interpolation

您好我有两个numpy数组(在这种情况下代表深度和百分比深度剂量数据)如下:

depth = np.array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ,
                   1.1,  1.2,  1.3,  1.4,  1.5,  1.6,  1.7,  1.8,  1.9,  2. ,  2.2,
                   2.4,  2.6,  2.8,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5])
pdd = np.array([  80.40649399,   80.35692155,   81.94323956,   83.78981286,
                  85.58681373,   87.47056637,   89.39149833,   91.33721651,
                  93.35729334,   95.25343909,   97.06283306,   98.53761309,
                  99.56624117,  100.        ,   99.62820672,   98.47564754,
                  96.33163961,   93.12182427,   89.0940637 ,   83.82699219,
                  77.75436857,   63.15528566,   46.62287768,   29.9665386 ,
                  16.11104226,    6.92774817,    0.69401413,    0.58247614,
                   0.55768992,    0.53290371,    0.5205106 ])

当绘制时给出以下曲线:

Percentage Depth Dose

我需要找到pdd下降到给定值的深度(最初为50%)。我已经尝试在pdd达到100%的位置切片,因为我只对这之后的点感兴趣。

不幸的是,np.interp似乎只在x和y值都有效的情况下起作用。

有人可以建议下一步该去哪儿吗?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望在depth = f(pdd)处插入函数pdd = 50.0。出于插值的目的,您可以将pdd视为与“x”值对应,将depth视为与“y”值对应。

您可以使用np.argsort按“x”的升序(即升序pdd)对“x”和“y”进行排序,然后像往常一样使用np.interp

# `idx` is an an array of integer indices that sorts `pdd` in ascending order
idx = np.argsort(pdd)

depth_itp = np.interp([50.0], pdd[idx], depth[idx])

plt.plot(depth, pdd)
plt.plot(depth_itp, 50, 'xr', ms=20, mew=2)

enter image description here

答案 1 :(得分:0)

这不是一个真正的编程解决方案,但它是你如何找到深度。我冒昧地重命名你的变量,所以x(i) = depth(i)y(i) = pdd(i)

在给定的时间间隔[x(i),x(i+1)]中,线性插值是

p_1(X) = y(i) + (X - x(i))*(y(i+1) - y(i))/(x(i+1) - x(i))

您希望找到X p_1(X) = 50。首先找i x(i)>50x(i+1),然后可以重新排列上面的等式来给出

X = x(i) + (50 - y(i))*((x(i+1) - x(i))/(y(i+1) - y(i)))

对于你的数据(使用MATLAB;抱歉,没有python代码)我大约2.359。然后可以使用np.interp(X, depth, pdd)

验证

答案 2 :(得分:0)

有几种方法可以进行插值。对于您的情况,您基本上在寻找50%的深度,这在您的数据中是不可用的。最简单的插值是线性情况。我在C ++中使用numerical recipes库通过几种技术获取插值,因此,

线性插值:请参阅第117页

插值深度(50%): 2.35915

多项式插值,请参阅第117页

插值深度(50%): 2.36017

三次样条插值,请参阅第120页

插值深度(50%): 2.19401

Rational Function Interpolation:参见第124页

插值深度(50%): 2.35986