Python渐变匹配样条曲线

时间:2016-05-10 11:26:29

标签: python scipy curve-fitting spline cubic-spline

我试图在Python中使用样条曲线填充两条曲线之间的间隙。我希望我的新线能够匹配每端的原始曲线的渐变。问题源于需要在scipy.interpolate样条例程中单调增加x值。下面的代码是我正在处理的一个例子。蓝色的两条曲线(“第1行”和“第2行”)是我所得到的(类似的)我想要的样条曲线,标有“通缉”的行。

有没有人有任何建议如何解决这个问题?

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as interp

line1_x = np.array([4.0e8, 4.7e8, 5.5e8, 6.6e8, 8.0e8, 1.0e9, 1.4e9, 2.0e9, 3.6e9, 
                    9.5e9])
line1_y = np.array([5500., 5000., 4500., 4000., 3500., 3000., 2500., 2000., 1500.,
                    1000.])

line2_x = np.array([1.010e10, 1.060e10, 1.081e10, 1.084e10, 1.076e10, 1.064e10, 
                    1.055e10, 1.050e10, 1.051e10, 1.057e10, 1.067e10, 1.079e10, 
                    1.091e10, 1.102e10, 1.112e10])
line2_y = np.array([350., 361., 372., 385., 395., 407., 418., 430., 442., 454., 
                    466., 478., 490., 503., 515.])

desired_x = np.array([1.112e10, 1.117e10, 1.121e10, 1.116e10, 1.087e10, 1.027e10, 
                      9.869e9, 9.5e9])
desired_y = np.array([515., 536., 575., 645., 748., 891., 962., 1000.])

plt.plot(line1_x, line1_y, 'b-', label='Line 1')
plt.plot(line2_x, line2_y, 'b-', label='Line 2')
plt.plot(desired_x, desired_y, 'r--', label='Wanted')
plt.legend(loc=0)

Spline Fig Example http://i67.tinypic.com/jajbmc.jpg

1 个答案:

答案 0 :(得分:0)

我还没有能够找到解决x增长需求的方法。所以我采取了轻微的欺骗行为#34;相反的选择。由于我的y总是在增加,我可以使用标准的scipy.interpolate样条例程来获得所需的输出。

需要在问题中添加我的示例才能使其正常工作的代码是:

x = np.concatenate((line1_x, line2_x))
y = np.concatenate((line1_y, line2_y))
order = np.argsort(y)

spline_fit = interp.UnivariateSpline(y[order], x[order])
y_points = np.linspace(515, 1000, 20)

plt.plot(spline_fit(y_points), y_points, 'k--', label='Fit')

这给出了期望的结果: enter image description here