2016-07-31 11 views
2

Ich versuche, eine ziemlich komplexe Funktion zu plotten, d. H. log(x/(x-2))**Rational(1,3). Ich arbeite nur mit reellen Zahlen. Wenn ich versuche, es zu plotten, sympy plottet nur die x> 2 Teil davon.Würfelwurzel von negativen reellen Zahlen

ich, dass tatsächlich komplexe Zahlen ins Spiel kommen und zum Beispiel gefunden, root(-8,3).n() gibt:

1,0 + 1.73205080756888i

, die auch sinnvoll ist, obwohl es nicht das, was ich gesucht habe (weil ich nur am wirklichen Ergebnis interessiert bin).

Lesen sympy › principle root Ich fand, dass real_root(-8,3) gibt -2 wie erwartet. Aber ich kann immer noch nicht die x < 0 Teil dieser Funktion plotten; in der Tat scheint es, dass real_root funktioniert nur für Integer-Wurzeln, und real_root(-9,3).n() gibt immer noch ein imaginäres Ergebnis, anstatt -(real_root(9, 3)), wie ich erwarten würde.

Ich dachte, ein echtes Ergebnis existiert für (-9)^(1/3) und ich verstehe nicht, warum real_root stattdessen ein imaginäres Ergebnis gibt.

Gibt es eine einfache Möglichkeit, ein Schulbuchergebnis für die Kubikwurzel von echten negativen Zahlen zu erhalten, wie (-x)^(1/3) = - (x)^(1/3)?

bearbeiten:
Nach @Leon ‚s Vorschlag: Ich sympy aktualisiert und könnte tatsächlich die reale Kubikwurzel von -9 berechnen. Aber ich kann noch nicht die Funktion, die ich am Anfang des Themas erwähnt habe, plotten.

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

gibt einen Fehler wie NameError: name 'Ne' is not defined. Ich bemerkte, dass f Ergebnisse in

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

Versuch drucken Heißt das Ne etwas mit meinem Fehler zu tun haben?

+1

Mit Python 2.7.10, SymPy 1.0 gibt es kein solches Problem ist: 'sympy.real_root (-9,3) · n()' 'kehrt -2.08008382305190' – Leon

+0

Vielen Dank . Ich habe vergessen zu erwähnen, dass ich Python 3.5 verwende. Nach der Aktualisierung von 'conda' und' anaconda' (und damit 'sympy') konnte ich auch die Kubikwurzel von 9 berechnen. Wie auch immer, 'von sympy import *' 'f = real_root (log (x/(x-2)), 3)' 'Grundstück (f)' gibt eine sehr komplizierte Fehlermeldung I kann ich nicht verstehen! – David

+1

Die Nachricht, die Sie sehen, ist ein Fehler in SymPy. Ich habe ein Problem [hier] (https://github.com/sympy/sympy/issues/11461) geöffnet. – asmeurer

Antwort

2

Es scheint SymPy Komplott hat einen Bug, so jetzt, werden Sie lambdify verwenden müssen und matplotlib es manuell zeichnen:

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)) 

Dieses einige Warnungen gibt, da der 2-Wert am Endpunkt ist eine Singularität, und warnt auch, dass, wenn Sie eine komplexe Zahl haben, der Imaginärteil ignoriert wird. Hier

ist die Handlung enter image description here

+0

Ihre Lösung funktioniert gut für positive Zahlen, aber ich kann immer noch kein Diagramm für diese Funktion mit 'x <0 'bekommen. Wenn Sie beispielsweise "np.linspace (-10, 10, 1000)" ersetzen, sind die Fehler "RuntimeWarning: ungültiger Wert im Protokoll " "" und "RuntimeWarning: ungültiger Wert in der Leistung gefunden" "" ' – David

+0

Es sieht so aus, als ob die Formel, die SymPy für real_root verwendet, 'nan + nan * j' ergibt, wenn sie mit NumPy bei negativen Werten von x ausgewertet wird. – asmeurer

+0

Ich öffnete https://github.com/sympy/sympy/issues/11463, wenn Sie folgen wollen. – asmeurer

Verwandte Themen