Подтвердить что ты не робот

Когда использовать approxfun vs. approx

В документации для approxfun указано, что она "часто более полезна, чем approx". Я изо всех сил пытаюсь опустить голову approxfun. Когда approxfun будет более полезным, чем approx (и когда approx будет более полезным)?

4b9b3361

Ответ 1

approx возвращает значение аппроксимируемой функции в (или) указанных точках или в заданном числе точек. approxfun возвращает функцию, которая затем может быть оценена в некоторых конкретных точках. Если вам нужна аппроксимация в точках, которые вы знаете во время создания приближения, approx сделает это за вас. Если вам нужна функция (в математическом смысле), которая вернет значение аппроксимации для некоторого аргумента, приведенного ниже, approxfun - это то, что вам нужно.

Вот несколько примеров.

dat <- data.frame(x=1:10, y=(1:10)^2)

Выход из approx и approxfun с использованием этих данных

> approx(dat$x, dat$y)
$x
 [1]  1.000000  1.183673  1.367347  1.551020  1.734694  1.918367  2.102041
 [8]  2.285714  2.469388  2.653061  2.836735  3.020408  3.204082  3.387755
[15]  3.571429  3.755102  3.938776  4.122449  4.306122  4.489796  4.673469
[22]  4.857143  5.040816  5.224490  5.408163  5.591837  5.775510  5.959184
[29]  6.142857  6.326531  6.510204  6.693878  6.877551  7.061224  7.244898
[36]  7.428571  7.612245  7.795918  7.979592  8.163265  8.346939  8.530612
[43]  8.714286  8.897959  9.081633  9.265306  9.448980  9.632653  9.816327
[50] 10.000000

$y
 [1]   1.000000   1.551020   2.102041   2.653061   3.204082   3.755102
 [7]   4.510204   5.428571   6.346939   7.265306   8.183673   9.142857
[13]  10.428571  11.714286  13.000000  14.285714  15.571429  17.102041
[19]  18.755102  20.408163  22.061224  23.714286  25.448980  27.469388
[25]  29.489796  31.510204  33.530612  35.551020  37.857143  40.244898
[31]  42.632653  45.020408  47.408163  49.918367  52.673469  55.428571
[37]  58.183673  60.938776  63.693878  66.775510  69.897959  73.020408
[43]  76.142857  79.265306  82.551020  86.040816  89.530612  93.020408
[49]  96.510204 100.000000

> approxfun(dat$x, dat$y)
function (v) 
.C(C_R_approxfun, as.double(x), as.double(y), as.integer(n), 
    xout = as.double(v), as.integer(length(v)), as.integer(method), 
    as.double(yleft), as.double(yright), as.double(f), NAOK = TRUE, 
    PACKAGE = "stats")$xout
<bytecode: 0x05244854>
<environment: 0x030632fc>

Дополнительные примеры использования:

a <- approx(dat$x, dat$y)
af <- approxfun(dat$x, dat$y)

plot(dat)
points(a, pch=2)

enter image description here

plot(dat)
curve(af, add=TRUE)

enter image description here

или другой пример, где нужна функция:

> uniroot(function(x) {af(x)-4}, interval=c(1,10))
$root
[1] 1.999994

$f.root
[1] -1.736297e-05

$iter
[1] 24

$estim.prec
[1] 6.103516e-05