负实数的立方根

时间:2016-07-31 10:15:59

标签: python sympy python-3.5

我试图绘制一个相当复杂的函数,即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< 0部分;事实上似乎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是否与我的错误有关?

1 个答案:

答案 0 :(得分:3)

似乎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值是奇点,并且还警告如果你有一个复数,忽略虚部。

这是情节enter image description here