【问题标题】:Np.interp returning same value for every x value I inputNp.interp 为我输入的每个 x 值返回相同的值
【发布时间】:2022-01-24 12:01:22
【问题描述】:

生成的图形使用名为 w 的数组作为 x 轴,使用名为 A1 的数组作为 y 轴。我必须找到并打印结果图形上的最大值。为此,我使用 max() 函数在名为 A1 的数组中查找最大值。为了找到相应的 X 值,我使用 np.interp() 函数并交换 x 和 y 输入轴,因此返回的值实际上是生成图的 x 值(np.interp 使用 x 值来查找 ay,我我正在使用 ay 值来查找 x)。但是,无论我给 np.interp 函数赋予什么值,它总是返回 4.99。我认为问题必须在于交换轴的事实?但这是让函数返回给定 y 的 x 值的唯一方法。

    import numpy as np
    import matplotlib.pyplot as plt

    F = 10
    m = 5
    w0 = 1

    w = np.array(np.arange(0.01, 5, 0.01))

    b1 = 0.25*m*w0
  

    G1 = np.array(np.sqrt((m**2)*(((w**2)-(w0**2))**2)+(b1**2)*(w**2)))

    A1 = np.array(F/G1)       

    A1_Max = max(A1)

我在这里打印值只是为了测试它是否正确。如您所见,np.interp 函数中的 x 轴应为 w 和 y A1,但是如前所述,轴已交换:

    w1_Max = np.interp(A1_Max, A1, w)
    print(w1_Max)

    plt.figure(figsize=(20, 20))

    plt.plot(w, A1, '-', label='b=0.25*m*w0')
    plt.xlabel('Frequency (rad/s)')
    plt.ylabel('Amplitude (a.u.)')
    plt.title('F = {0} m = {1}'.format(F,m))
    plt.legend()

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    np.interp 需要它的第二个参数单调递增。 您可以改用np.argmax() 来查找最大值的索引。

    要找到对应于任意幅度的内插 w 值,您可以使用 How to find the exact intersection of a curve (as np.array) with y==0? 中的 find_roots 函数

    import numpy as np
    import matplotlib.pyplot as plt
    
    def find_roots(x, y):
        s = np.abs(np.diff(np.sign(y))).astype(bool)
        return x[:-1][s] + np.diff(x)[s] / (np.abs(y[1:][s] / y[:-1][s]) + 1)
    
    F = 10
    m = 5
    w0 = 1
    w = np.arange(0.01, 5, 0.01)
    
    b1 = 0.25 * m * w0
    G1 = np.sqrt((m ** 2) * (((w ** 2) - (w0 ** 2)) ** 2) + (b1 ** 2) * (w ** 2))
    
    A1 = F / G1
    A1_Max = max(A1)
    w1_Max = w[np.argmax(A1)]
    
    A_special = 5
    w_special = find_roots(w, A1 - A_special)
    
    plt.figure(figsize=(20, 20))
    plt.plot(w, A1, '-', label='b=0.25*m*w0')
    plt.plot(w1_Max, A1_Max, 'ro', label='Maximum amplitude')
    plt.plot(w_special, np.repeat(A_special, len(w_special)), 'go', label=f'Special amplitude ({A_special})')
    plt.xlabel('Frequency (rad/s)')
    plt.ylabel('Amplitude (a.u.)')
    plt.title(f'F = {F}  m = {m}')
    plt.legend()
    plt.margins(x=0)
    plt.tight_layout()
    plt.show()
    

    【讨论】:

    • 你能解释一下 np.argmax() 周围的 'w[]' 是什么吗?我在网上找不到任何关于它的信息。
    • np.argmax(A1) 给出A1 的最大值的索引(“arg”)。在这个例子中,索引是97. w`是一个频率值数组(从0.015)。 w[np.argmax(A1)] 将是w[97]0.98,是对应于A1 最大值的频率。
    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多