R中无穷级数的建模

R中无穷级数的建模,r,for-loop,taylor-series,R,For Loop,Taylor Series,我正试图编写一个代码,从R中的泰斯水文地质方程,近似下面的无穷泰勒级数 我对函数式编程相当陌生,所以这是一个挑战!这是我的尝试: Wu <- function(u, repeats = 100) { result <- numeric(repeats) for (i in seq_along(result)){ result[i] <- -((-u)^i)/(i * factorial(i)) } return(sum(result) - log(u)-0.5772) }

我正试图编写一个代码,从R中的泰斯水文地质方程,近似下面的无穷泰勒级数

我对函数式编程相当陌生,所以这是一个挑战!这是我的尝试:

Wu <- function(u, repeats = 100) {
result <- numeric(repeats) 
for (i in seq_along(result)){
result[i] <- -((-u)^i)/(i * factorial(i))
}
return(sum(result) - log(u)-0.5772)
}
这是2sf的正确答案

有人能指出我做错了什么和/或提出更好的方法来编码这个等式吗?我认为这个问题与我的for循环有关,或者随着u变大,阶乘生成无穷大的数,但我一点也不确定


谢谢

您可以编写一个函数,该函数接收一个值和重复次数,并输出所需的值:

w=function(u,l){
  a=2:l
  -0.5772-log(u)+u+sum(u^(a)*rep(c(-1,1),length=l-1)/(a)/factorial(a))
}
transform(Wu_QC,new=Vectorize(w)(u,170))
         u    Wu_table          new
1  1.0e-15 3.39616e+01 3.396158e+01
2  4.1e-14 3.02480e+01 3.024800e+01
3  9.9e-13 2.70639e+01 2.706387e+01
4  7.0e-12 2.51079e+01 2.510791e+01
5  3.7e-11 2.34429e+01 2.344290e+01
6  2.3e-10 2.16157e+01 2.161574e+01
7  6.8e-09 1.82291e+01 1.822914e+01
8  5.7e-08 1.61030e+01 1.610301e+01
9  8.4e-07 1.34126e+01 1.341266e+01
10 6.3e-06 1.13978e+01 1.139777e+01
11 3.1e-05 9.80430e+00 9.804354e+00
12 7.4e-04 6.63240e+00 6.632400e+00
13 5.1e-03 4.70640e+00 4.706408e+00
14 2.9e-02 2.99200e+00 2.992051e+00
15 8.7e-01 2.74200e-01 2.741930e-01
16 4.6e+00 1.84100e-03 1.856671e-03
17 9.9e+00 4.63700e-06 2.030179e-05

随着数字变得越来越大,估计不是很好,所以我们应该进一步超过170!但R不能做到这一点。也许你可以尝试其他平台。ie Python

我想我自己可能已经解决了这个问题(尽管大量借用了Onyanbo的答案!)以下是我的代码:

well_func2 <- function (u, l = 100) {
    result <- numeric(length(u))
a <- 2:l
for(i in seq_along(u)){
result[i] <- -0.5772-log(u[i])+u[i]+sum(u[i]^(a)*rep(c(-1,1),length=l-1)/(a)/factorial(a))
}
return(result)
}

正如参考资料第93页所说,W也被称为指数积分。另见

然后,例如,
expint
提供了一个计算W(u)的函数:


结果与参考表中的结果完全一致。

接下来的两个术语是什么?谢谢!看起来你在那里所做的对于我正在做的事情来说已经足够精确了(而且它切断了for循环)。我希望我的应用程序中u保持在1以下,精度达到2-3 sig。无花果就足够了。我明天亲自试试你的代码。在回答你之前的问题时,序列中的下两个项是:+u^5/(5*5!)-u^6/(6*6!)…我对你的函数做了一些微调。它适用于样本数据和单个数据点,但不适用于我的真实数据。这里有一个简化的版本:嗯,func这个表可能在python或其他采用更大阶乘的语言中运行。数字越大,结果越不准确表是1962年的,所以我怀疑它是用python运行的!顺便说一句,我已经考虑过表格是错的,我的数字是对的,但是我想不出一个好的方法来检验这一点,所以我现在假设表格是100%准确的。这太棒了,谢谢!遗憾的是,我已经花了几天的时间做了一个不太好的版本,但是,你可以考虑接受这个答案。完成。抱歉,这是我发布的第一个问题,所以我不太了解过程。再次感谢你的帮助
w=function(u,l){
  a=2:l
  -0.5772-log(u)+u+sum(u^(a)*rep(c(-1,1),length=l-1)/(a)/factorial(a))
}
transform(Wu_QC,new=Vectorize(w)(u,170))
         u    Wu_table          new
1  1.0e-15 3.39616e+01 3.396158e+01
2  4.1e-14 3.02480e+01 3.024800e+01
3  9.9e-13 2.70639e+01 2.706387e+01
4  7.0e-12 2.51079e+01 2.510791e+01
5  3.7e-11 2.34429e+01 2.344290e+01
6  2.3e-10 2.16157e+01 2.161574e+01
7  6.8e-09 1.82291e+01 1.822914e+01
8  5.7e-08 1.61030e+01 1.610301e+01
9  8.4e-07 1.34126e+01 1.341266e+01
10 6.3e-06 1.13978e+01 1.139777e+01
11 3.1e-05 9.80430e+00 9.804354e+00
12 7.4e-04 6.63240e+00 6.632400e+00
13 5.1e-03 4.70640e+00 4.706408e+00
14 2.9e-02 2.99200e+00 2.992051e+00
15 8.7e-01 2.74200e-01 2.741930e-01
16 4.6e+00 1.84100e-03 1.856671e-03
17 9.9e+00 4.63700e-06 2.030179e-05
well_func2 <- function (u, l = 100) {
    result <- numeric(length(u))
a <- 2:l
for(i in seq_along(u)){
result[i] <- -0.5772-log(u[i])+u[i]+sum(u[i]^(a)*rep(c(-1,1),length=l-1)/(a)/factorial(a))
}
return(result)
}
library(expint)
expint(10^(-8))
# [1] 17.84347
expint(4.6)
# [1] 0.001841006