簡體   English   中英

如何將梯形積分方法調整為自定義零點?

[英]How to adjust trapezoidal integration method to a custom zero point?

我想計算一個序列向量的積分。 由於沒有可用的函數,我使用梯形方法1

iglTzm <- function(x, y) sum(diff(x) * (head(y, -1) + tail(y, -1))) / 2

序列的第一個元素應該是零點,所以原則是:如果序列的值主要低於第一個值,則積分應為負,否則為正,或為 0。

考慮矩陣m1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    6    7    8    8    6    8   10
[2,]    9    9    8    9    9    8    9
[3,]    9   10   10    9    9    9    9
[4,]    9    8    8    8    6    8    9
[5,]   10   10   10    9   10    8    0
[6,]    9    8    9   10    9    9    9

與這些原始值的集成很可能會導致不一致的值:

> setNames(apply(m1, 1, iglTzm, 0:6), 1:6)
  1   2   3   4   5   6 
 15   2  -2   7 -52   0 

所以我在它們的第一個值(第 1 列)上調整序列(行),以設置正確的符號,並得到矩陣m2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    0    1    2    2    0    2    4
[2,]    0    0   -1    0    0   -1    0
[3,]    0    1    1    0    0    0    0
[4,]    0   -1   -1   -1   -3   -1    0
[5,]    0    0    0   -1    0   -2  -10
[6,]    0   -1    0    1    0    0    0

從邏輯上講,這不會改變iglTzm()拋出的任何值,因為diff()是相同的:

> setNames(apply(m2, 1, iglTzm, 0:6), 1:6)
  1   2   3   4   5   6 
 15   2  -2   7 -52   0 

無論如何,因為我不能簡單地縮放或反轉它,所以我還沒有一個絕妙的主意如何調整函數以獲得正確的符號,假設是:

#  1   2   3   4   5   6 
# 15  -2   2  -7 -52   0

有誰知道如何調整iglTzm()以獲得具有正確符號的積分?

m2的圖應該更多地說明原理:

在此處輸入圖片說明


數據

m1 <- matrix(c(6, 7, 8, 8, 6, 8, 10,
                9, 9, 8, 9, 9, 8, 9,
                9, 10, 10, 9, 9, 9, 9,
                9, 8, 8, 8, 6, 8, 9, 
                10, 10, 10, 9, 10, 8, 0, 
                9, 8, 9, 10, 9, 9, 9), 6, byrow=TRUE)

m2 <- t(apply(m1, 1, function(x) scale(x, center=x[1], scale=FALSE)))

# plot
par(mfrow=c(2, 3))
lapply(1:nrow(m2), function(x) {
  plot(m2[x, ], type="l", main=x)
  abline(h=m2[x, 1], col="red", lty=2)
})

首先,還有另一個小但更重要的問題,盡管在修復它之后您的問題仍然有效。 我的意思是,由於您在apply使用函數的方式,作為函數參數的xy的順序應該顛倒。

但這還不夠,現在我們回到你的問題。 為此,讓我們回憶一下通常的積分: ʃf(x)dx(限制從 a 到 b)將積分 f 下方的區域,這就是您的函數已經成功執行的操作。 現在你想要的是調整它的水平。 但是如果我們從 a 積分到 b,那就和 ʃ(f(x)-f(a))dx = ʃf(x)dx - (ba)f(a) 一樣,這導致

iglTzm <- function(y, x) sum(diff(x) * (head(y, -1) + tail(y, -1))) / 2 - y[1] * (max(x) - min(x))
setNames(apply(m1, 1, iglTzm, 0:6), 1:6)
#  1  2  3  4  5  6 
#  9 -2  2 -7 -8  0 

恰好只有兩個絕對值與xy顛倒的版本不同。 打賭讓我們看看第一個函數:它應該是 9 還是 15? 我們有 2*2/2 + 1*2 + 1*2/2 + 2*4/2 = 9,所以我們確實想要反轉xy

編寫函數的另一種方法是

iglTzm <- function(y, x) sum(diff(x) * (head(y - y[1], -1) + tail(y - y[1], -1))) / 2
setNames(apply(m1, 1, iglTzm, 0:6), 1:6)
#  1  2  3  4  5  6 
#  9 -2  2 -7 -8  0 

編輯:通過反轉我只是指函數定義中的順序或您如何在apply使用它; 就 y(函數值)和 x(網格值)而言,函數本身很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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