R plot неявная функция внешняя команда - PullRequest
2 голосов
/ 12 марта 2011

Я хотел бы построить неявную функцию от x и y: 1 - 0.125 * y ^ 2 - x ^ 2 = 0.005 Я знаю, что она может быть построена как контурный график, но возникли проблемы с командой "external" в следующем:

x<-seq(0.4,1.01,length=1000)<br> y<-seq(0,3,length=1000)<br> z<-outer(x,y,FUN="1-0.125*y^2-x^2=0.005")<br> contour(x,y,z,levels=0,drawpoints=FALSE)

Я прочитал FAQ (7.17) относительно «внешней» команды и необходимости векторизации функции, но все еще в затруднительном положении.

Ответы [ 2 ]

5 голосов
/ 13 марта 2011

Я думаю, вы немного запутались в значении слова «функция». Все операции (+, -, ^) в вашей функции векторизованы, так что все работает отлично.

x <- seq(0.4,1.01,length=1000)
y <- seq(0,3,length=1000)
z <- outer(x,y,function(x,y) 1-0.125*y^2-x^2-0.005)
contour(x,y,z,levels=0,drawlabels=FALSE)

Или, если вы хотите небольшой ярлык:

library(emdbook)
curve3d(1-0.125*y^2-x^2-0.005,
        xlim=c(0.4,1.01),
        ylim=c(0,3),
        n=c(100,100),
        sys3d="contour",drawlabels=FALSE,levels=0)

Это на самом деле медленнее, потому что он использует цикл for для внутреннего использования, а не outer(), поэтому я установил его на 100x100, а не на 1000x1000 (что в любом случае является избыточным для этого примера), но он будет работать на более сложных примерах, которые не может быть легко векторизовано ...

1 голос
/ 07 мая 2015

построение неявного уравнения в виде контурного графика является излишним.По сути, вы отбрасываете 99,99% вычислений, которые вы сделали.

Лучше найти значение y для заданного x, которое будет составлять уравнение 0. Вот код, использующий uniroot в базе R.

R код, использующий uniroot из базы R

x = seq(0, 0.995, length = 100) # no real root above x = 0.995
root <- function(a) {
        uniroot(function(x,y) 1 - 0.125 * y^2 - x^2 - 0.005, c(0, 3), x = a )$root #only care about the root
} 
y <- sapply(x, root)
plot(x,y, type = "l")

Хорошо, c (0, 3) в аргументе uniroot - это диапазон значений y, где лежит корень.поэтому для каждого заданного значения x uniroot будет искать значение от 0 до 3 для корня.

R-код с использованием fsolve из пакета pracma

library("pracma")
x <- seq(0,0.995, length=100)
fun <- function(y) c(1 - 0.125 * y^2 - x^2 - 0.005)
y_sol <- fsolve(fun, rep(1, length(x)))$x
plot(x,y_sol, type="l")

fsolve принимает функцию, для которой ищется корень, и угадывает значения y для каждого заданного значения x.Здесь мы говорим, что значения y лежат около 1. Мы даем ему приблизительное значение 1 *

uniroot хочет, чтобы ограниченный диапазон искал root, fsolve требует предположения, где может находиться root.

Это более быстрые способы построения неявных уравнений.Затем вы можете использовать любой пакет графиков, например ggplot2 / rbokeh, для построения графиков.

Я не делал никаких тестов, поэтому не могу сказать, какой из методов быстрее.Хотя для такой простой неявной функции это не имеет значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...