【问题标题】:Square root of complex numbers in pythonpython中复数的平方根
【发布时间】:2016-04-12 21:32:51
【问题描述】:

我在 python 中遇到了一些与复数平方根有关的令人困惑的行为。运行此代码:

from cmath import sqrt
a = 0.2
b = 0.2 + 0j
print(sqrt(a / (a - 1)))
print(sqrt(b / (b - 1)))

给出输出

0.5j
-0.5j

类似的事情发生在

print(sqrt(-1 * b))
print(sqrt(-b))

看来这两对陈述应该给出相同的答案?

【问题讨论】:

  • 根据Wolfram 你是对的。第一对(linklink)都应该是0.5i,第二对(linklink)都应该是0.447214... icmath.sqrt() 的来源是 here...
  • 两个答案都是正确的,问题是为什么它返回不同的共轭。
  • FWIW 行为在 2.7 和 3.5 中显示相同。
  • 复杂的根有多种解决方案。
  • @tzaman ...如果它被定义在某个 Python 应该返回的地方。如果没有定义,Python 有权任意选择。

标签: python math complex-numbers


【解决方案1】:

两个答案(+0.5j-0.5j)都是正确的,因为它们是 complex conjugates - 即实部是相同的,而虚部是符号翻转的。

查看code 使行为变得清晰 - 结果的虚部始终与输入的虚部具有相同的符号,如第 790 和 793 行所示:

r.imag = copysign(d, z.imag);

因为a/(a-1)0.25 隐含0.25+0j 你会得到一个肯定的结果; b/(b-1) 产生 0.25-0j (出于某种原因;不知道为什么它不会导致 0.25+0j tbh)所以你的结果同样是否定的。

编辑:This question 对同一问题进行了一些有用的讨论。

【讨论】:

  • a / (a - 1)-0.25。将其转换为复数会为您提供-0.25+0j。使用 b,您会得到 -0.25-0j
  • documentation 还指定分支切割被选择为沿着从 0 到 -∞ 的射线,这将给出观察到的行为。有趣的是,b/(b-1) 为虚部给出了负零。
  • @user2357112 是的,这很奇怪,我不知道为什么会这样。只需在 IDLE 中输入 1-0j 作为文字即可生成 1+0j 作为值。有趣的是,-0j 本身会产生 -0-0j
  • @tzaman:这是语法中令人讨厌的边缘情况。具有负零虚部的复数得到represented 为0.2-0j,但表达式0.2-0j 实际上是0.20j 的减法。减法产生一个零虚部,因为0j - 0j 0j。这是come up 在错误跟踪器上的几次。存在一个相关问题,即在 repr 输出中根本看不到负零实分量。
  • @user2357112 这太棒了,谢谢你的链接!
【解决方案2】:

我可以回答为什么会发生这种情况,但不能回答为什么选择这种行为。

a/(a - 1)

计算为 0.2/-0.8 即 -0.25,由cmath.sqrt 转换为复数,而

b/(b - 1)

计算为 (0.2+0j)/(-0.8+0j),即 (-0.25-0j),将其转换为具有负复分量的复数。

举个更简单的例子,

cmath.sqrt(0j) == 0j
cmath.sqrt(-0j) == -0j

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2016-04-27
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多