2012-04-17 12 views
8

In R, gibt es eine Möglichkeit, 2D-Kurven durch Gleichungen gegeben zu zeichnen? Zum Beispiel, wie kann ich die Hyperbel, die durch die Gleichung x^2 - 3 * y^2 + 2 * x * y - 20 = 0?Plotten Kurven gegeben durch Gleichungen in R

+1

Ich glaube, tun diejenigen sein wird Hyperbeln (oder was auch immer die richtige Plural dieses Wortes ist). –

+0

Danke, @DWin, korrigiert. – Leo

Antwort

15

Sie können contour verwenden, um die zwei Zweige Ihrer Hyperbel darzustellen.

f <- function(x,y) x^2 - 3*y^2 + 2*x*y - 20 
x <- y <- seq(-10,10,length=100) 
z <- outer(x,y,f) 
contour(
    x=x, y=x, z=z, 
    levels=0, las=1, drawlabels=FALSE, lwd=3 
) 

enter image description here

+0

Sorta überrascht, dass es keine Möglichkeit gibt, dies direkt zu erfassen. 'plot (fun = ..., xlim = ..., ylim = ...)' oder ein Weg, um x und y an 'stat_function' in' ggplot2' zu übergeben. – Justin

+0

Okay, ich habe keine Ahnung, wie diese Äußerung funktioniert. Ich könnte eine ähnliche Handlung bekommen, indem ich zuerst nach 'x' oder' y' suche, aber das ist sehr effizient. Möchten Sie das erklären? – thelatemail

+1

'äußere (x, y, f)' gibt die Matrix zurück z, [i, j] = f (x [i], y [j]), , d. H. Sie wertet die Funktion auf einem Gitter aus. Sie können 'image (z)' oder 'contour (z)' versuchen, um 'z' zu visualisieren. Lösung für x oder y ist numerisch problematisch , weil für einen gegebenen Wert von x, mehrere entsprechende Werte von y sein können. (Natürlich kann es einfach formell mit einem Computer Algebra System: Maxima, Yacas, etc.) –

1

Nur für das Protokoll - eine ggplot Version

library(ggplot2) 
library(dplyr) 
f <- function(x,y) x^2 - 3*y^2 + 2*x*y - 20 
seq(-10,+10,length=100) %>% 
    expand.grid(x=.,y=.) %>% 
    mutate(z=f(x,y)) %>% 
    ggplot + 
    aes(x=x,y=y,z=z) + 
    stat_contour(breaks=0) 

enter image description here

0

vielleicht die Lösung kann die Gleichung in eine Formel und Verwendung Kurve wird Transformation() zu machen eine Handlung.

curve(sqrt(4/9*x^2-20/3) + x/3,-20,20)