2016-07-31 47 views
2

我试图绘制一个相当复杂的函数,即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。 我注意到,试图打印

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

f结果这是否Ne有些事情要和我的错误?

+1

使用Python 2.7.10,SymPy 1.0不存在这样的问题:'sympy.real_root(-9,3).N()''返回-2.08008382305190' – Leon

+0

非常感谢。我忘了提及我正在使用Python 3.5。 更新'conda'和'anaconda'(因此'sympy')后,我也能够计算9的立方根。 反正 '从sympy进口*' 'F = real_root(日志(X /(X-2)),3)' '图(F)' 给出了一个非常复杂的错误消息我不能理解! – David

+1

您看到的消息是SymPy中的错误。我在这里打开了一个问题(https://github.com/sympy/sympy/issues/11461)。 – asmeurer

回答

2

看来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

+0

你的解决方案对于正数很好,但我仍然无法用'x <0'得到该函数的图。 例如,如果您替换'np.linspace(-10,10,1000)',则错误为“RuntimeWarning:在日志中遇到无效值 ”“”和'RuntimeWarning:在电源 中遇到无效值“”“ ' – David

+0

它看起来像SymPy用于real_root的公式是在用NumPy评估x的负值时给出'nan + nan * j'。 – asmeurer

+0

如果您想关注它,我打开了https://github.com/sympy/sympy/issues/11463。 – asmeurer