📄 滑动平均m2.bas
字号:
Attribute VB_Name = "modMethod"
'滑动平均
Option Explicit
'一次三点滑动平均
'P:原始数据,二维
'R:滑动平均结果,二维
'E:残差,二维
Public Sub Smooth_1_3(P() As Double, R() As Double, E() As Double)
Dim I As Integer, J As Integer
Dim M As Integer, N As Integer
On Error GoTo SmoothErr
M = UBound(P, 1) '数据组数
N = UBound(P, 2) '数据点数
For I = 1 To M
'滑动平均
R(I, 1) = 0.83333333 * P(I, 1) + 0.33333333 * P(I, 2) - 0.16666667 * P(I, 3)
For J = 2 To N - 1
R(I, J) = (P(I, J - 1) + P(I, J) + P(I, J + 1)) * 0.33333333
Next J
R(I, N) = -0.16666667 * P(I, N - 2) + 0.33333333 * P(I, N - 1) + 0.83333333 * P(I, N)
'计算残差
For J = 1 To N
E(I, J) = P(I, J) - R(I, J)
Next J
Next I
Exit Sub
SmoothErr:
MsgBox "在求一次三点滑动平均的过程中出现错误!"
Exit Sub
End Sub
'一次五点滑动平均
'P:原始数据,二维
'R:滑动平均结果,二维
'E:残差,二维
Public Sub Smooth_1_5(P() As Double, R() As Double, E() As Double)
Dim I As Integer, J As Integer
Dim M As Integer, N As Integer
On Error GoTo SmoothErr
M = UBound(P, 1) '数据组数
N = UBound(P, 2) '数据点数
For I = 1 To M
'滑动平均
R(I, 1) = (3 * P(I, 1) + 2 * P(I, 2) + P(I, 3) - P(I, 5)) / 5
R(I, 2) = (4 * P(I, 1) + 3 * P(I, 2) + 2 * P(I, 3) + P(I, 4)) / 10
For J = 3 To N - 2
R(I, J) = (P(I, J - 2) + P(I, J - 1) + P(I, J) + P(I, J + 1) + P(I, J + 2)) / 5
Next J
R(I, N - 1) = (P(I, N - 3) + 2 * P(I, N - 2) + 3 * P(I, N - 1) + 4 * P(I, N)) / 10
R(I, N) = (-P(I, N - 4) + P(I, N - 2) + 2 * P(I, N - 1) + 3 * P(I, N)) / 5
'计算残差
For J = 1 To N
E(I, J) = P(I, J) - R(I, J)
Next J
Next I
Exit Sub
SmoothErr:
MsgBox "在求一次五点滑动平均的过程中出现错误!"
Exit Sub
End Sub
'三次五点滑动平均
'P:原始数据,二维
'R:滑动平均结果,二维
'E:残差,二维
Public Sub Smooth_3_5(P() As Double, R() As Double, E() As Double)
Dim I As Integer, J As Integer
Dim M As Integer, N As Integer
On Error GoTo SmoothErr
M = UBound(P, 1) '数据组数
N = UBound(P, 2) '数据点数
For I = 1 To M
'滑动平均
R(I, 1) = 0.98571429 * P(I, 1) + 0.05714286 * (P(I, 2) + P(I, 4)) _
- 0.08571429 * P(I, 3) - 0.01428571 * P(I, 5)
R(I, 2) = 0.05714286 * (P(I, 1) + P(I, 5)) + 0.77142857 * P(I, 2) _
+ 0.34285714 * P(I, 3) - 0.22857143 * P(I, 4)
For J = 3 To N - 2
R(I, J) = -0.08571429 * (P(I, J - 2) + P(I, J + 2)) + 0.34285714 * _
(P(I, J - 1) + P(I, J + 1)) + 0.48571429 * P(I, J)
Next J
R(I, N - 1) = 0.05714286 * (P(I, N - 4) + P(I, N)) - 0.22857143 * _
P(I, N - 3) + 0.34285714 * P(I, N - 2) + 0.77142857 * P(I, N - 1)
R(I, N) = -0.01428571 * P(I, N - 4) + 0.05714286 * (P(I, N - 3) + P(I, N - 1)) _
- 0.08571429 * P(I, J - 2) + 0.98571429 * P(I, N)
'计算残差
For J = 1 To N
E(I, J) = P(I, J) - R(I, J)
Next J
Next I
Exit Sub
SmoothErr:
MsgBox "在求一次五点滑动平均的过程中出现错误!"
Exit Sub
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -