2016-05-10 4 views
0

J'essaie de combler les lacunes entre deux courbes en utilisant une spline en Python. Je voudrais que ma nouvelle ligne corresponde au dégradé des courbes d'origine à chaque extrémité. Le problème provient du besoin de valeurs x croissantes monotones dans les routines spline scipy.interpolate. Le code ci-dessous est un exemple de ce que j'ai à faire. Deux courbes en bleu ('ligne 1' et 'ligne 2') sont ce que j'ai et (quelque chose comme) ce que je voudrais en spline est montré par la ligne 'Wanted'.Python gradient spline correspondant

Quelqu'un at-il des suggestions comment je pourrais faire à ce sujet?

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

+0

Choisissez un algorithme approprié de [ici] (http://docs.scipy.org/doc/scipy-0.14.0/reference/interpolate.html) – sascha

+0

Malheureusement, je ne pouvais pas faire fonctionner les algorithmes de scipy.interpolate "out of the box" comme je le souhaite. Je pense que c'est à cause du besoin de x d'augmenter. Heureusement j'ai trouvé un travail autour duquel je vais décrire dans une réponse. Merci pour votre suggestion. –

Répondre

0

Je n'ai pas été en mesure de travailler sur la façon de contourner la nécessité de x à augmenter. J'ai donc pris une option légèrement "triche" à la place. Comme mon y augmente toujours, je peux simplement utiliser les routines spline scipy.interpolate standard pour obtenir la sortie désirée.

Le bit de code qui doit ajouter à mon exemple dans la question pour le faire fonctionner est:

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') 

Ce qui donne le résultat souhaité: enter image description here