examples python matplotlib intersection

examples - plot() python



Python-matplotlib: encuentra intersección de lineplots (1)

Tengo una pregunta probablemente simple, que me mantiene en silencio desde hace un tiempo. ¿Hay una manera simple de devolver la intersección de dos conjuntos de datos graficados (no analíticos) en python matplotlib?

Para la elaboración, tengo algo como esto:

x=[1.4,2.1,3,5.9,8,9,23] y=[2.3,3.1,1,3.9,8,9,11] x1=[1,2,3,4,6,8,9] y1=[4,12,7,1,6.3,8.5,12] plot(x1,y1,''k-'',x,y,''b-'')

Los datos en este ejemplo son totalmente arbitrarios. Ahora me gustaría saber si existe una función de construcción simple que sigo perdiendo, que me devuelve las intersecciones precisas entre las dos parcelas.

Espero haber dejado en claro, y también que no me pierdo algo totalmente obvio ...


Podríamos usar scipy.interpolate.PiecewisePolynomial para crear funciones definidas por sus datos lineales por partes.

p1=interpolate.PiecewisePolynomial(x1,y1[:,np.newaxis]) p2=interpolate.PiecewisePolynomial(x2,y2[:,np.newaxis])

Entonces podríamos tomar la diferencia de estas dos funciones,

def pdiff(x): return p1(x)-p2(x)

y use optimize.fsolve para encontrar las raíces de pdiff :

import scipy.interpolate as interpolate import scipy.optimize as optimize import numpy as np x1=np.array([1.4,2.1,3,5.9,8,9,23]) y1=np.array([2.3,3.1,1,3.9,8,9,11]) x2=np.array([1,2,3,4,6,8,9]) y2=np.array([4,12,7,1,6.3,8.5,12]) p1=interpolate.PiecewisePolynomial(x1,y1[:,np.newaxis]) p2=interpolate.PiecewisePolynomial(x2,y2[:,np.newaxis]) def pdiff(x): return p1(x)-p2(x) xs=np.r_[x1,x2] xs.sort() x_min=xs.min() x_max=xs.max() x_mid=xs[:-1]+np.diff(xs)/2 roots=set() for val in x_mid: root,infodict,ier,mesg = optimize.fsolve(pdiff,val,full_output=True) # ier==1 indicates a root has been found if ier==1 and x_min<root<x_max: roots.add(root[0]) roots=list(roots) print(np.column_stack((roots,p1(roots),p2(roots))))

rendimientos

[[ 3.85714286 1.85714286 1.85714286] [ 4.60606061 2.60606061 2.60606061]]

La primera columna es el valor de x, la segunda columna es el valor de y del primer factorial de Piecewise evaluado en x , y la tercera columna es el valor de y para el segundo polinomio de Piecewise.