Search code examples
pythongaussian

Python: finding the intersection point of two gaussian curves


I have two gaussian plots:

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

and I want to find the point at where the two curves intersect. Is there a way of doing this? In particular I want to find the value of the x-coordinate where they meet.


Solution

  • You want to find the x's such that both gaussian functions have the same height.(i.e intersect)

    You can do so by equating two gaussian functions and solve for x. In the end you will get a quadratic equation with coefficients relating to the gaussian means and variances. Here is the final result:

    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)
    

    The output is :

    array([ 3.75])
    

    You can plot the found intersections:

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

    The plot will be: enter image description here

    If your gaussians have multiple intersections, the code will also find all of them(say m1=2.5, std1=3.0, m2=5.0, std2=1.0): enter image description here