【问题标题】:How to compute the square root also from negative number?如何也从负数计算平方根?
【发布时间】:2021-01-22 12:08:15
【问题描述】:

我收到以下错误,但不确定其来源:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

于是我写了

    if om_dif > 0:

我得到了SIGKILL

目的是获取列表k,包括否定om_dif和肯定om_dif的结果。

import numpy as np
import matplotlib.pyplot as plt

omega = np.linspace(0, 1128, 10000)
e = 1.602176634e-19
m_e = 9.1093837015e-31
eps_0 = 8.8541878128e-12
n_0 = 0.00032
c = 1
omega_p = np.sqrt(n_0*e**2/(eps_0*m_e))        
k = []


############
for i in omega:
    om_dif = omega**2-omega_p**2

    if om_dif > 0:
        kk = np.sqrt((om_dif)/c**2)
    else:
        kk = np.sqrt((abs(om_dif))/c**2)
    k.append(kk)

##############

v_phi = omega/k

ax.set_xlim(0, 2*omega_p)
ax.set_ylim(-4, 4)

ax.plot(v_phi**2/c**2, omega)
plt.show()

【问题讨论】:

    标签: python python-3.x numpy matplotlib


    【解决方案1】:

    您可以通过使用numpy 函数直接使用数组执行计算来避免循环。 (它也快得多)

    import numpy as np
    import matplotlib.pyplot as plt
    
    omega = np.linspace(0, 1128, 10000)
    e = 1.602176634e-19
    m_e = 9.1093837015e-31
    eps_0 = 8.8541878128e-12
    n_0 = 0.00032
    c = 1
    omega_p = np.sqrt(n_0*e**2/(eps_0*m_e))        
    
    k = np.sqrt((np.abs(omega**2 - omega_p**2))/c**2)
    
    fig, ax=plt.subplots(1)
    v_phi = omega / np.array(k)
    
    ax.set_xlim(0, 2*omega_p)
    ax.set_ylim(-4, 4)
    
    ax.plot(v_phi**2/c**2, omega)
    plt.show()
    

    【讨论】:

      【解决方案2】:

      为了专门解决错误消息,问题在于您正确地迭代了 omega 数组,但是您随后操作的是整个数组而不是 id i 的数组值

      [...]
      for i in omega:
          om_dif = omega[i]**2-omega_p[i]**2
      [...]
      

      如果om_dif 是正数,您也可以通过不打扰测试并始终将abs() 函数应用于您的值来获得计算时间。

      for i in omega:
          om_dif = omega[i]**2-omega_p[i]**2
      
          k.append(np.sqrt((abs(om_dif))/c**2))
      

      在实际方法中,@Andreaanswer 似乎最好地利用了numpy 库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-31
        • 2021-01-04
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        相关资源
        最近更新 更多