PolynomialFit 함수는 다항식의 계수만 주어지게 됩니다.
y=a_0 + a_1 x + a_2 x^2+ ... + a_n x^n
따라서, x값을 주게 되면, 위의 다항식을 계산하여 결과를 출력해주는 함수가 필요합니다.
만약, 위의 계수를 다 알고 있다고 하면, 미분값은 다음과 같이 주어집니다.
y'= a_1 + 2 a_2 x+ ... + n a_n x^(n-1)
2차 이상의 미분계수 역시 마찬가지로 계산이 가능합니다. 그러나, 다항식의 차수보다 높은 미분차수는 계산할 수 없습니다. 따라서, n차 다항식으로 Savitzky-Golay smoothing 계산을 수행했다면, n차 이하의 미분계수까지는 다항식의 계수로부터 쉽게 구할 수 있습니다.
'------------------------------------------
Function PFit_GetFitValueAt(iXVal, iA()) As Double
'Fitting 결과로부터 구한 다항식의 계수와, X값을 입력하면, Fitting 결과를 계산합니다.
Function PFit_GetFitValueAt(iXVal, iA()) As Double
'Fitting 결과로부터 구한 다항식의 계수와, X값을 입력하면, Fitting 결과를 계산합니다.
Dim i As Long, tYFit As Double, tVal As Double
tVal = 1
tYFit = iA(1, 1)
For i = 2 To UBound(iA, 1)
tVal = tVal * iXVal
tYFit = tYFit + iA(i, 1) * tVal
Next
PFit_GetFitValueAt = tYFit
End Function
'------------------------------------------
Function PFit_GetDiffValueAt(iXVal, iA(), Optional iOrder As Long = 1) As Double
'다항식 계수 iA와 계산 위치 X, 미분차수를 입력하여 미분계수를 계산합니다.
tYFit = iA(1, 1)
For i = 2 To UBound(iA, 1)
tVal = tVal * iXVal
tYFit = tYFit + iA(i, 1) * tVal
Next
PFit_GetFitValueAt = tYFit
End Function
'------------------------------------------
Function PFit_GetDiffValueAt(iXVal, iA(), Optional iOrder As Long = 1) As Double
'다항식 계수 iA와 계산 위치 X, 미분차수를 입력하여 미분계수를 계산합니다.
Dim i As Long, j As Long, n As Long, tA() As Double, tXVal As Double, tVal As Double
If iOrder <= 0 Then
PFit_GetDiffValueAt = PFit_GetFitValueAt(iXVal, iA)
Else
n = UBound(iA, 1)
ReDim tA(1 To n)
tVal = 0
tXVal = 1
For i = iOrder + 1 To n
tA(i) = 1
For j = 1 To iOrder
tA(i) = tA(i) * (i - j)
Next
tVal = tVal + tA(i) * iA(i, 1) * tXVal
tXVal = tXVal * iXVal
Next
PFit_GetDiffValueAt = tVal
End If
End Function
'------------------------------------------
If iOrder <= 0 Then
PFit_GetDiffValueAt = PFit_GetFitValueAt(iXVal, iA)
Else
n = UBound(iA, 1)
ReDim tA(1 To n)
tVal = 0
tXVal = 1
For i = iOrder + 1 To n
tA(i) = 1
For j = 1 To iOrder
tA(i) = tA(i) * (i - j)
Next
tVal = tVal + tA(i) * iA(i, 1) * tXVal
tXVal = tXVal * iXVal
Next
PFit_GetDiffValueAt = tVal
End If
End Function
'------------------------------------------
댓글 없음:
댓글 쓰기
의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~