[英]modelling an infinite series in R
我正在嘗試編寫一個代碼來近似R中Theis水文地質方程中的以下無限泰勒級數。
我對函數式編程很陌生,所以這是一個挑戰! 這是我的嘗試:
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)
}
我將結果與這里提供的數據表中的值進行了比較: https : //pubs.usgs.gov/wsp/wsp1536-E/pdf/wsp_1536-E_b.pdf - 見下文(借口詳細代碼 - 應該是csv,事后才知道):
Wu_QC <- data.frame(u = c(1.0*10^-15, 4.1*10^-14,9.9*10^-13, 7.0*10^-12, 3.7*10^-11,
2.3*10^-10, 6.8*10^-9, 5.7*10^-8, 8.4*10^-7, 6.3*10^-6,
3.1*10^-5, 7.4*10^-4, 5.1*10^-3, 2.9*10^-2,8.7*10^-1,
4.6,9.90),
Wu_table = c(33.9616, 30.2480, 27.0639, 25.1079, 23.4429,
21.6157, 18.2291, 16.1030, 13.4126, 11.3978,
9.8043,6.6324, 4.7064,2.9920,0.2742,
0.001841,0.000004637))
Wu_QC$rep_100 <- Wu(Wu_QC$u,100)
好消息是公式給出重復= 50,100,150和170的相同結果(所以我剛剛給你上面的100版本)。 壞消息是,雖然該函數對於u <~10 ^ -3表現良好,但它會偏離軌道並為數量級內的數字提供負輸出1.當我剛剛調用時,這不會發生個人號碼的功能。 即:
> Wu(4.6)
[1] 0.001856671
這是2sf的正確答案。
任何人都可以發現我做錯了什么和/或建議更好的方法來編碼這個等式嗎? 我認為這個問題與我的for循環有關,和/或隨着你變大而生成無限數的因子的問題,但我不確定。
謝謝!
您可以編寫一個函數,該函數將值與重復次數一起輸出並輸出所需的值:
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不能那樣做。 也許你可以嘗試其他平台。 即Python
我想我可能已經解決了這個問題(盡管從Onyambo的答案中大量借用!)這是我的代碼:
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)
}
據我所知,到目前為止,這與u <5(與Onyambo的代碼一樣)的表格結果很好地匹配,並且它也給出了向量與單值輸入相同的結果。
仍然需要更多的測試,並且可能有一種更整潔的方法來使用map()或類似代碼而不是for循環來編碼它,但我現在很開心。 以為我會分享以防其他人有同樣的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.