【问题标题】:Cube root of negative real numbers负实数的立方根
【发布时间】:2016-08-02 04:12:11
【问题描述】:

我正在尝试绘制一个非常复杂的函数,即log(x/(x-2))**Rational(1,3)。我只使用实数。如果我尝试绘制它,sympy 只会绘制它的 x>2 部分

我发现实际上复数会起作用,例如,root(-8,3).n() 给出:

1.0+1.73205080756888i

这是合理的,尽管这不是我想要的(因为我只对真实结果感兴趣)。

阅读sympy › principle root 我发现real_root(-8,3) 按预期给出了-2。但我仍然无法绘制该函数的 x;事实上,real_root 似乎只适用于整数根,而real_root(-9,3).n() 仍然给出一个虚构的结果,而不是我所期望的-(real_root(9, 3))

我认为 (-9)^(1/3) 存在真实结果,但我不明白为什么 real_root 会给出虚构结果。

有没有一种简单的方法可以获得实负数立方根的教科书结果,例如 (-x)^(1/3) = - (x)^(1/3)?

编辑
遵循@Leon 的建议:我更新了sympy,实际上可以计算出-9 的真实立方根。 但是我仍然无法绘制我在主题开头提到的功能。

from sympy import *
var('x')
f=real_root((log(x/(x-2))), 3)
plot(f)

给出类似NameError: name 'Ne' is not defined 的错误。 我注意到尝试打印 f 会导致

Piecewise((1, Ne(arg(x/(x - 2)), 0)), ((-1)**(2/3), log(x/(x - 2)) < 0), (1, True))*log(x/(x - 2))**(1/3)

Ne 是否与我的错误有关?

【问题讨论】:

  • 使用 Python 2.7.10,SymPy 1.0 没有这样的问题:sympy.real_root(-9,3).n() 返回-2.08008382305190
  • 非常感谢。我忘了提到我正在使用 Python 3.5。在更新condaanaconda(以及sympy)之后,我还能够计算出9 的立方根。无论如何,from sympy import *f=real_root(log(x/(x-2)), 3)plot(f) 给出了一个非常复杂的错误消息,我无法理解!
  • 您看到的消息是 SymPy 中的一个错误。我打开了一个问题here
  • 我问了一个类似的问题,有些人甚至可能会说一个重复的问题:stackoverflow.com/questions/38682936/… 那里的答案在 real_root() 中提供了解决此问题的方法。

标签: python sympy python-3.5


【解决方案1】:

SymPy 的情节似乎有错误,所以现在,您必须使用lambdifymatplotlib 手动绘制它:

import numpy as np
import matplotlib.pyplot as plt

f = lambdify(x, (real_root((log(x/(x-2))), 3)), 'numpy')
vals = np.linspace(2, 10, 1000)
plt.plot(vals, f(vals))

这会给出一些警告,因为端点处的 2 值是奇点,并且还会警告如果您有一个复数,则会忽略虚部。

这里是剧情

【讨论】:

  • 您的解决方案适用于正数,但我仍然无法使用 x&lt;0 获得该函数的绘图。例如,如果替换为np.linspace(-10, 10, 1000),则错误为RuntimeWarning: invalid value encountered in log """RuntimeWarning: invalid value encountered in power """
  • 看起来 SymPy 用于 real_root 的公式在使用 NumPy 以 x 为负值进行评估时给出了 nan+nan*j
猜你喜欢
  • 2020-03-05
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多