当前位置: 首页 > 知识库问答 >
问题:

Python:寻找两条高斯曲线的交点

孟花蜂
2023-03-14

我有两个高斯图:

x = np.linspace(-5,9,10000)
plot1=plt.plot(x,mlab.normpdf(x,2.5,1))
plot2=plt.plot(x,mlab.normpdf(x,5,1))

我想找到两条曲线相交的点。有没有办法做到这一点?特别是我想找到它们相交的x坐标的值。

共有2个答案

薛元忠
2023-03-14

这里有一个基于纯Numpy的解决方案,也适用于高斯曲线以外的曲线。

def get_intersection_locations(y1,y2,test=False,x=None): 
    """
    return indices of the intersection point/s.
    """
    idxs=np.argwhere(np.diff(np.sign(y1 - y2))).flatten()
    if test:
        x=range(len(y1)) if x is None else x
        plt.figure(figsize=[2.5,2.5])
        ax=plt.subplot()
        ax.plot(x,y1,color='r',label='line1',alpha=0.5)
        ax.plot(x,y2,color='b',label='line2',alpha=0.5)
        _=[ax.axvline(x[i],color='k') for i in idxs]
        _=[ax.text(x[i],ax.get_ylim()[1],f"{x[i]:1.1f}",ha='center',va='bottom') for i in idxs]
        ax.legend(bbox_to_anchor=[1,1])
        ax.set(xlabel='x',ylabel='density')
    return idxs
# single intersection
x = np.arange(-10, 10, 0.001)
y1=sc.stats.norm.pdf(x,-2,2)
y2=sc.stats.norm.pdf(x,2,3)
get_intersection_locations(y1=y1,y2=y2,x=x,test=True) # returns indice/s array([10173])
# double intersection
x = np.arange(-10, 10, 0.001)
y1=sc.stats.norm.pdf(x,-2,1)
y2=sc.stats.norm.pdf(x,2,3)
get_intersection_locations(y1=y1,y2=y2,x=x,test=True)

基于对类似问题的回答。

张和颂
2023-03-14

你想要找到x,使得两个高斯函数具有相同的高度。(即相交)

你可以通过等效两个高斯函数并求解x来做到这一点。最后,你会得到一个二次方程,其系数与高斯均值和方差有关。以下是最终结果:

import numpy as np

def solve(m1,m2,std1,std2):
  a = 1/(2*std1**2) - 1/(2*std2**2)
  b = m2/(std2**2) - m1/(std1**2)
  c = m1**2 /(2*std1**2) - m2**2 / (2*std2**2) - np.log(std2/std1)
  return np.roots([a,b,c])

m1 = 2.5
std1 = 1.0
m2 = 5.0
std2 = 1.0

result = solve(m1,m2,std1,std2)

输出为:

array([ 3.75])

您可以绘制发现的交叉点:

x = np.linspace(-5,9,10000)
plot1=plt.plot(x,mlab.normpdf(x,m1,std1))
plot2=plt.plot(x,mlab.normpdf(x,m2,std2))
plot3=plt.plot(result,mlab.normpdf(result,m1,std1),'o')
 类似资料:
  • 想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。 请在类 [] 中实现方法 它必须返回两条线的交集 []。 注意,直线由线性方程定义:。行构造函数将和系数作为参数。 如果线重合或不相交,该方法必须返回null。我们使用< code>int作为参数和坐标域,这似乎令人惊讶。关键是使用< code>double会带来一些额外的复杂性,这是我们希望在这个基本练习中避免的。所有测试都在中

  • 本文向大家介绍python绘制高斯曲线,包括了python绘制高斯曲线的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python绘制高斯曲线的具体代码,供大家参考,具体内容如下 源码: 效果图: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我正在用Piccolo编写一个交互式applet,并且需要在其中包含高斯曲线(又称正态分布图)。 我想象任何一种Java实现都足够,但是我找不到。理想情况下,我想传递一组值并将图表绘制在面板,图像对象或可以嵌入在applet中的任何对象中。 在让我自己动手编写代码之前,有人知道做这件事的有用代码吗? 欢迎使用其他语言的实现,只要它们易于移植到Java中即可。 问题答案: 不知道它是否有

  • 问题内容: 我正在尝试阴影绘制的两条曲线之间的区域。这是我绘制的。 使用以下代码。 我尝试使用,但是要使其正常工作,我需要在上具有相同的数据(将需要执行)。是否有其他功能可能对此有所帮助,还是我使用的是错误的功能。 问题答案: 您可以尝试: 例如:

  • 例如,随机函数产生120个数字(0或1),这些相加值的平均值必须接近60。

  • 规则的曲线比如圆、椭圆、抛物线都可以用一个函数去描述,对于不规则的曲线无法使用一个特定的函数去描述,这也就是样条曲线和贝塞尔曲线出现的原因。Threejs提供了这两种曲线的API,不需要自己封装,如果你想深入研究可以学习计算机图形学。 一条光滑样条曲线案例 在三维空间中设置5个顶点,输入三维样条曲线CatmullRomCurve3作为参数,然后返回更多个顶点,通过返回的顶点数据,构建一个几何体,通

  • 从一系列的点中,创建一个平滑的二维样条曲线。内部使用Interpolations.CatmullRom来创建曲线。 代码示例 // Create a sine-like wave const curve = new THREE.SplineCurve( [ new THREE.Vector2( -10, 0 ), new THREE.Vector2( -5, 5 ), new THRE

  • 我目前正在用js尝试SVG路径,我想用一条曲线连接两点。以下是我目前的进展: CodePen版本在这里 看来我需要在路径中添加另一条曲线。 我还找到了这个工作的CodePen。