Python градиент соответствия сплайна

Я пытаюсь заполнить промежутки между двумя кривыми, используя сплайн в Python. Я хотел бы, чтобы моя новая линия соответствовала градиенту исходных кривых на каждом конце. Проблема возникает из-за необходимости монотонно увеличивающихся значений x в подпрограммах scipy.interpolate spline. Код ниже является примером того, с чем я имею дело. Две кривые синего цвета ("линия 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)

http://i67.tinypic.com/jajbmc.jpg

1 ответ

Решение

Я не смог понять, как обойти необходимость увеличения x. Поэтому я выбрал слегка "изменяющий" вариант. Поскольку у меня всегда увеличивается, я могу просто использовать стандартные процедуры сплайна 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')

Что дает желаемый результат:

Другие вопросы по тегам