Вычисление касательного пересечения с R - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь добавить касательную к моему графику в точке x = 30, и я хочу вычислить x-пересечение касательной в y = 0.08.

Я уже нашел очень полезный пример, который я пытался использовать, но по какой-то причине он не работает для y = 0.08. Я не понимаю смысла производного в функции predict() и фактической разницы между pred0 и pred1. Может кто-нибудь объяснить, пожалуйста?

x <- seq(0,40)
y <- dnorm(seq(0,40), mean=25, sd=5)
plot(x, y)
spl <- smooth.spline(y ~ x)
lines(spl, col="green")

newx <- 30
pred0 <- predict(spl, x=newx, deriv=0)
pred1 <- predict(spl, x=newx, deriv=1)

yint <- pred0$y - (pred1$y*newx)
xint <- -yint/pred1$y
xint



plot(x, y)
abline(h=0, col="red")
lines(spl, col="red") 
points(pred0,col="red", pch=19) 
lines(x, yint + pred1$y*x) 
points(xint, 0, col="red", pch=19) 

enter image description here

1 Ответ

3 голосов
/ 06 июня 2019

Похоже, у вас нет проблем с вычислением касательной и пересечения, но вам нужна помощь в поиске значения x для данного значения y. Этот метод будет работать для любой плавной кривой, но пометьте предупреждение Грегора. Может не быть соответствующего значения x или их может быть несколько.

x <- seq(0, 40, by=0.01)
y <- dnorm(x, mean=25, sd=5)
spl <- smooth.spline(y ~ x)
plot(spl, type="l")

yval <- 0.08
ad <- abs(yval - spl$y)

if (min(ad) > max(diff(spl$y))*10) {
    warning("The supplied y value is out of bounds")
}

xval <- x[which(diff(sign(diff(ad))) > 1) + 1]
points(xval, rep(yval, length(xval)))

С этим xval вы можете вычислить касательную, как вы уже сделали.

enter image description here

...