Chr*_*ian 14 python intersection matplotlib
我有一个可能很简单的问题,让我已经安静了一段时间.有没有一种简单的方法可以在python matplotlib中返回两个绘制的(非分析)数据集的交集?
为了详细说明,我有这样的事情:
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-')
Run Code Online (Sandbox Code Playgroud)
此示例中的数据完全是任意的.我现在想知道是否存在一个我一直缺少的简单构建函数,它会返回两个图之间的精确交点.
希望我清楚自己,并且我也没有错过任何明显的东西......
unu*_*tbu 24
我们可以scipy.interpolate.PiecewisePolynomial用来创建由分段线性数据定义的函数.
p1=interpolate.PiecewisePolynomial(x1,y1[:,np.newaxis])
p2=interpolate.PiecewisePolynomial(x2,y2[:,np.newaxis])
Run Code Online (Sandbox Code Playgroud)
然后我们可以区分这两个函数,
def pdiff(x):
return p1(x)-p2(x)
Run Code Online (Sandbox Code Playgroud)
并使用optimize.fsolve查找以下内容的根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))))
Run Code Online (Sandbox Code Playgroud)
产量
[[ 3.85714286 1.85714286 1.85714286]
[ 4.60606061 2.60606061 2.60606061]]
Run Code Online (Sandbox Code Playgroud)
第一列是x值,第二列是第一个评估的PiecewisePolynomial的y值,x第三列是第二个PiecewisePolynomial的y值.
| 归档时间: |
|
| 查看次数: |
8263 次 |
| 最近记录: |