簡體   English   中英

在R中建模無限系列

[英]modelling an infinite series in R

我正在嘗試編寫一個代碼來近似R中Theis水文地質方程中的以下無限泰勒級數。

井方程(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循環有關,和/或隨着你變大而生成無限數的因子的問題,但我不確定。

謝謝!

正如您在參考文獻的第93頁所述,W也稱為指數積分。 另見這里

然后,例如, expint提供計算W(u)的函數:

library(expint)
expint(10^(-8))
# [1] 17.84347
expint(4.6)
# [1] 0.001841006

結果與您推薦的表格中的結果完全相同。

您可以編寫一個函數,該函數將值與重復次數一起輸出並輸出所需的值:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM