Как построить вогнутый набор в 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)
Другие вопросы по тегам