2016-07-31 116 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