【问题标题】:Get minimum point(s) of numpy.poly1d curve获取 numpy.poly1d 曲线的最小点
【发布时间】:2015-06-20 11:15:15
【问题描述】:

我有一个numpy.poly1d 多项式如下:

c = np.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])

-2.5 <= x <= 2.5 范围内绘制时曲线如下所示:

如何在给定范围内找到这条曲线的最小点,没有使用用于绘制曲线的离散值(我的意思是只使用连续的poly1d对象)?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    这为您提供了临界点,即区间中的那些 x,使得导数为零或它们位于区间的边界。从那以后,它应该只评估和接受min

    In [22]: p = numpy.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])
    
    In [23]: bounds = [-2.5, 2.5]
    
    In [24]: crit_points = bounds + [x for x in p.deriv().r if x.imag == 0 and bounds[0] < x.real < bounds[1]]
    
    In [25]: crit_points
    Out[25]: 
    [-2.5,
     2.5,
     (-2.0243100544390678+0j),
     (1.8753707038871632+0j),
     (1.2307367723613383+0j),
     (-0.41217268372324861+0j)]
    

    从图中,在这种情况下,最小值似乎是最后一个。

    【讨论】:

      【解决方案2】:

      好吧,与@matiasg 的功能有点不同,目的是制作更多可复制的代码并尽可能多地使用矢量化代码。

      import numpy as np
      from matplotlib.pyplot import *
      
      c = np.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])
      
      crit = c.deriv().r
      r_crit = crit[crit.imag==0].real
      test = c.deriv(2)(r_crit) 
      
      
      # compute local minima 
      # excluding range boundaries
      x_min = r_crit[test>0]
      y_min = c(x_min)
      plot( x_min, y_min, 'o' )
      
      xc = np.arange(-2.5, 2.6, 0.02)
      yc = c(xc)
      plot( xc, yc)
      
      xlim([-2.5,2.5])
      show()
      

      图片 1:结果。请注意,在您的范围之外还有另一个局部最小值;)

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 2013-10-06
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-28
        • 2014-03-05
        相关资源
        最近更新 更多