Как построить вогнутый набор в R?
У меня есть один вопрос с функцией "кривой" в R. Может быть, это не лучший способ реализовать мою идею, но мы здесь.
Я пытался построить функцию, которая состоит из нескольких сегментов. Разница на склоне. Просто чтобы проиллюстрировать, первая часть - это что-то вроде "y = 1300 - 3.83*x" для [0,10]. Следующий сегмент, "y = 1300-4.41*t", будет на [11,20] и так далее в соответствии с кодом ниже.
seg1 <- function(t) 1300-3.83*t
curve(seg1, 0, 10, n=1000,xlim=c(0,150),ylim=c(0,1400))
seg2 <- function(t) 1300-4.41*t
curve(seg2, 10,20,n=1000,add=TRUE)
seg3 <- function(t) 1300-5.83*t
curve(seg3, 20,30,n=4000, add=TRUE)
seg4 <- function(t) 1300-6.71*t
curve(seg4, 30,50,n=16000,add=TRUE)
seg5 <- function(t) 1300-7.71*t
curve(seg5, 50,100,n=10000,add=TRUE)
seg6 <- function(t) 1300-8.87*t
curve(seg6,100,150,n=9000,add=TRUE)
Получающийся в результате сюжет, однако, полон пустых пространств. Я не могу добавить его здесь, но я бы ожидал чего-то вроде вогнутого набора, а не большого количества сегментов с пробелами среди них. Это должно быть связано. Может быть, это не лучший способ построить функцию с разрывами в R.
Может ли кто-нибудь помочь мне, пожалуйста?
2 ответа
Еще один, но более гибкий способ получения очков:
segments <- mget(paste0("seg", 1:6)) # A list of functions
ll <- c(0, 10, 20, 30, 50, 100) # Lower limits
ul <- c(10, 20, 30, 50, 100, 150) # Upper limits
k <- length(ll) # Number of segments
n <- 100 # Points per each segment
myfun <- function(ll, ul, n)
c(mapply(function(s, l, u) s(seq(l, u, length = n)), segments, ll, ul))
plot(y = myfun(ll, ul, n), x = seq(ll[1], ul[k], length = n * k), type = 'l')
Как насчет генерации очков вместо использования curve
?
seg1 <- function(t) 1300-3.83*t
seg2 <- function(t) 1300-4.41*t
seg3 <- function(t) 1300-5.83*t
seg4 <- function(t) 1300-6.71*t
seg5 <- function(t) 1300-7.71*t
seg6 <- function(t) 1300-8.87*t
step <- 0.5 # Smaller for better look but slower to plot
y <- c(seg1(seq(0,10,step)),
seg2(seq(10,20,step)),
seg3(seq(20,30,step)),
seg4(seq(30,50,step)),
seg5(seq(50,100,step)),
seg6(seq(100,150,step)))
plot(y, type='l', xlim=c(0,150), ylim=c(0,1400))
РЕДАКТИРОВАТЬ:
Ваш пост неверный, но если я правильно понимаю ваш комментарий, вам нужно изменить from
а также to
в вашем коде на тот же номер:
seg1 <- function(t) 1300-3.83*t
seg2 <- function(t) 1300-4.41*t
seg3 <- function(t) 1300-5.83*t
seg4 <- function(t) 1300-6.71*t
seg5 <- function(t) 1300-7.71*t
seg6 <- function(t) 1300-8.87*t
curve(seg1, 0, 150, n=1000,xlim=c(0,150),ylim=c(0,1400))
curve(seg2, 0,150,n=1000,add=TRUE)
curve(seg3, 0,150,n=1000, add=TRUE)
curve(seg4, 0,150,n=1000,add=TRUE)
curve(seg5, 0,150,n=1000,add=TRUE)
curve(seg6, 0,150,n=1000,add=TRUE)