Оценка полинома с функцией - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь оценить полином P (x): polynomial

Однако я не думаю, что я правильно ввел сам полином в свою функцию.Код для функции:

directpoly1 <- function(x, coef, seqcoef = seq(coef) - 1) {
  sum(coef*x^seqcoef)
}
directpoly <- function(x, coef) {
  seqcoef <- seq(coef) - 1
  sapply(x, directpoly1, coef, seqcoef)
}

Код для использования функции:

directpoly(x=seq(-10,10, length=5000000), rep(c(2,-1),20))

Есть идеи, как правильно ее ввести?

1 Ответ

0 голосов
/ 13 ноября 2018

Вот два способа написания вашей функции.

  1. С петлей sapply.Делает код более читабельным и в несколько раз быстрее.
  2. Со стандартным циклом for.

Нет необходимости писать отдельную функцию вне функции, вызываемой с помощьюx значения, я поместил эту функцию в тело основных функций.
Затем обе функции тестируются с меньшим входным вектором.Как видите, функция цикла for работает быстрее.

directpoly <- function(x, n = 39, coef = NULL){
  f <- function(y) sum(coef * y^seqcoef)
  if(all(is.null(coef))) coef <- rep(c(2, -1), length.out = n + 1)
  seqcoef <- rev(seq_along(coef) - 1)
  sapply(x, f)
}

directpoly2 <- function(x, n = 39, coef = NULL){
  f <- function(y) sum(coef * y^seqcoef)
  if(all(is.null(coef))) coef <- rep(c(2, -1), length.out = n + 1)
  seqcoef <- rev(seq_along(coef) - 1)
  y <- numeric(length(x))
  for(i in seq_along(y))
    y[i] <- f(x[i])
  y
}

library(microbenchmark)
library(ggplot2)

x <- seq(-10, 10, length = 50000)
mb <- microbenchmark(
  Sapply = directpoly(x),
  Forloop = directpoly2(x)
)

autoplot(mb)

enter image description here

...