首页 > 解决方案 > 为什么 Python 不能分离复数的实部和虚部?

问题描述

我正在编写代码来解决物理问题。总而言之,我使用了求解函数来确定二次方的根,它们打印在一个有 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

标签: python

解决方案


np.real不修改基础值,它只返回数据副本的真实部分。您只调用np.realprint函数,但没有改变比较。

您需要修改比较本身:

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

推荐阅读