R 中是否有一个函数/包,它取一个函数f和一个参数k,然后返回一个阶数为k的泰勒逼近?
答案 0 :(得分:16)
您可以使用Ryacas
使用yacas计算机代数系统(您还需要安装)
使用小插图中的示例
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
答案 1 :(得分: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
答案 2 :(得分: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"
其中哪一个更准确,我会留给读者: - )
答案 3 :(得分:1)
如果您要求在错误传播的背景中进行泰勒逼近,您可以尝试我的qpcR
包的“传播”功能,该功能会以{{{{}}的形式评估符号梯度向量和协方差矩阵。 1}}(着名的误差传播矩阵表示法),相当于一阶泰勒展开式。
干杯, 安德烈