【问题标题】:Why can't Python separate the real and imaginary components of a complex number?为什么 Python 不能分离复数的实部和虚部?
【发布时间】:2020-04-26 19:05:12
【问题描述】:

我正在编写代码来解决物理问题。总而言之,我使用了 solve 函数来确定二次方的根,它们打印在一个有 2 个条目的列表中。我正在提取第一个值(即列表的第一个条目)并将其与随机生成的数字的值(或更具体地说,与函数 -ln(random #)的值进行比较。代码指示错误,只要列表的第一个条目(第一个根)是复杂的(即 A + BI)。因此,我很想看看如果我只考虑实部会发生什么。我应用了 np.real(A + BI) 并且返回是仍然是 A + BI,这仍然会导致错误。我尝试了几种仅提取实部的方法均未成功。有什么建议吗?提前谢谢!

下面是部分代码:

from sympy.solvers import solve
from sympy import Symbol
s = Symbol("s")
sol = solve((x_0+(omega_x*s)-x_c)**2+(y_0+(omega_y*s)-y_c)**2-9, s)
print("s = ", sol)

#"p" coordinates of intersection point with sphere
p = Symbol("p")
psol = solve((x_0+(omega_x*p)-x_d)**2+(y_0+(omega_y*p)-y_d)**2+(z_0+(omega_z*p)-z_d)**2-1, p)
print("p = ", psol)

#"s" regions
s_region1 = np.real(sol[0])
s_region2 = np.real(sol[1]) - np.real(sol[0])
s_region3 = np.real(psol[0]) - np.real(sol[1])
print("s_region1 = ", s_region1)
print("s_region2 = ", s_region2)
print("s_region3 = ", s_region3)

#Total number of mfp's in Region 1 and Region 2 (no scattering)
T1_ns = (s_region1 + s_region3)*sigma_1a
T2_ns = s_region2*sigma_2a
T_total_ns = T1_ns + T2_ns
print("T1_ns =", T1_ns)
print("T2_ns = ", T2_ns)
print("T_total_ns =", np.real(T_total_ns))

mfp[i] = (-1*np.log(np.random.random())) 
while (mfp[i] < T_total_ns):
    if np.random.random() > 1:
        mfp[i] = mfp[i] + (-1*np.log(np.random.random())) 
    else:
        break
else: 
    CountP = CountP + 1

Along with the corresponding error:
TypeError                                 Traceback (most recent call last)
<ipython-input-93-131a66cd0909> in <module>
152 
153     mfp[i] = (-1*np.log(np.random.random()))
--> 154     while (mfp[i] < T_total_ns):
155         if np.random.random() > 1:
156             mfp[i] = mfp[i] + (-1*np.log(np.random.random()))

C:\ProgramData\Anaconda3\lib\site-packages\sympy\core\expr.py in __gt__(self, other)
335         for me in (self, other):
336             if me.is_complex and me.is_real is False:
--> 337                 raise TypeError("Invalid comparison of complex %s" % me)
338             if me is S.NaN:
339                 raise TypeError("Invalid NaN comparison")

TypeError: Invalid comparison of complex 2.9397439170991 - 0.178627638621441*I

【问题讨论】:

  • 嗨,彼得,尝试运行您的代码。也许我遗漏了一些东西,但我不确定你是如何得到这个错误的。 x_0、omega_x、x_c、y_0、omega_y 和 y_c 都是未定义和未声明的。所以这有点难以重现。 mfp 和 CountP 未初始化。如果可能,尝试包括所有出现的变量?此外,如果随机数正好为 0,np.log(np.random.random() 可能会使您的脚本崩溃。最后,为了便于调试和重现性,您可能希望使用 np.random.seed(somenumber)
  • 嗨,Ruslan,感谢您的尝试。我在这里重新发布了一个捕获问题的工作代码:stackoverflow.com/questions/61448225/…

标签: python


【解决方案1】:

np.real 不修改基础值,它只是返回数据副本的真实部分。您只在 print 函数中调用了 np.real,但没有进行比较。

你需要修改比较本身:

while mfp[i] < np.real(T_total_ns):

【讨论】:

  • 感谢您的意见。我试过几个版本。在上面的一个中, T_total_ns 是 np.real 被调用的项的总和,因此它应该是实数。我也试过 while mfp[i]
  • @Peter 尝试将您的示例最小化为一段仍然存在问题的独立代码。我刚刚在您发布的代码中发现了问题,通过此更改应该没有问题。
  • 好主意。我会尝试重新发布。谢谢。
猜你喜欢
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
相关资源
最近更新 更多