построение неявного уравнения в виде контурного графика является излишним.По сути, вы отбрасываете 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, для построения графиков.
Я не делал никаких тестов, поэтому не могу сказать, какой из методов быстрее.Хотя для такой простой неявной функции это не имеет значения