12

関数fとパラメーターkを取り、次数kのfのテイラー近似を返す関数/パッケージがRにありますか?

4

5 に答える 5

16

yacas数式処理システム(これもインストールする必要があります)を操作するためRyacas に使用できます

ビネットの例を使用する

 library(Ryacas)
 # run   yacasInstall() if prompted to install yacas
 #
 yacas("texp := Taylor(x,0,3) Exp(x)")
 ## expression(x + x^2/2 + x^3/6 + 1)
 # or

さて、それを関数に変換したい場合は、x

myTaylor <- function(f, k, var,...){
  .call <- sprintf('texp := Taylor( %s, 0, %s) %s', var,k,f)
  result <- yacas(.call)
  foo <- function(..., print = FALSE){
    if(print){print(result)}
    Eval(result, list(...))}
  return(foo)
}
# create the function
foo <- myTaylor('Exp(x)', 3, 'x')
foo(x=1:5)
## [1]  2.666667  6.333333 13.000000 23.666667 39.333333
foo(x=1:5, print = TRUE)
## expression(x + x^2/2 + x^3/6 + 1)
## [1]  2.666667  6.333333 13.000000 23.666667 39.333333
于 2013-02-08T03:26:38.660 に答える
5

上記のシンボリック解を数値テイラー近似と比較します。

library(pracma)

p <- taylor(f = exp, x0 = 0, n = 4)             # Numerical coefficients 
# 0.1666667 0.5000000 1.0000000 1.0000000       # x^3/6 + x^2/2 + x + 1

polyval(p, 1:5)                                 # Evaluate the polynomial
# 2.66667  6.33333 13.00000 23.66667 39.33334   # exp(x) at x = 1:5
于 2013-02-08T08:47:17.107 に答える
1

フォローアップとして、次のことを考慮してください。

 foo <- myTaylor('Exp(x)', 3, 'x')
sprintf('%2.15f',foo(x=1:5))
[1] "2.666666666666667"  "6.333333333333333"  "13.000000000000000"
[4] "23.666666666666664" "39.333333333333329"

p <- taylor(f = exp, x0 = 0, n = 3)
sprintf('%2.15f',polyval(p,1:5))
[1] "2.666666721845557"  "6.333333789579300"  "13.000001556539996"
[4] "23.666670376066413" "39.333340601497312"

これらのどれがより正確かは読者に任せます:-)

于 2013-02-08T17:54:16.287 に答える
1

エラー伝播のバックグラウンドでテイラー近似を求めている場合は、パッケージの「伝播」関数を試してみてください。この関数は、(エラー伝播の有名な行列表記)qpcRの形式の共分散行列とともにシンボリック勾配ベクトルを評価します。g * V * t(g)これは、1次のテイラー展開に相当します。

于 2013-02-09T09:55:37.410 に答える
0

以下の関数は、点aで関数fのn次のテイラー級数近似を使用して得られた関数を返します。

taylor <- function(f, n, a) {

    ith_derivative <- as.expression(body(f))
    f_temp <- function(x) x
    series <- as.character(f(a))
    for (i in seq_len(n)) {
        ith_derivative <- body(f_temp) <- D(ith_derivative, "x")
        series <- paste0(series, "+", f_temp(a) / factorial(i), "*(x - ", a, ")^", i)
    }
    f_output <- function(x) x
    body(f_output) <- parse(text = series)
    f_output

}

taylor(f = function(x) sin(x), n = 3, a = 0)
于 2021-10-21T15:55:15.410 に答える