2013-10-22 7 views
0

최근에 나는 "해상도"가 너무 작기 때문에 내가 가지고있는 데이터 세트에 문제가 생겼다. 모든 숫자는 기본적으로 "X 축"의 "1 by 1 unit"인 "resolution"내에있는 더 높은 숫자로 정규화되므로 데이터 세트는 최대 (0)로 최대화됩니다. 기둥. Y 값은 항상 포물선과 비슷합니다.vba 엑셀 역 입방 스플라인 보간

Y  X 
-34,32 -93 
-16,56 -92 
-10,04 -91 
-6,03 -90 
-3,34 -89 
-1,56 -88 
-0,47 -87 
0  -86 
-0,10 -85 
-0,78 -84 
-2,11 -83 
-4,20 -82 
-7,36 -81 
-12,31 -80 
-22,03 -79 
-25,17 -78 

이제 0은 0과 -0,10 사이 또는 0과 -0,47 사이 여야합니다. 선형 보간은 너무 많은 오차를 줄 수 있으므로 큐빅 스플라인을 사용합니다. 내가해야 할 일은

내 Y는 정말 내가하려고 모든 함수는 지정된 X에서 Y를 계산하기 때문에 내가 인터넷에서 발견 한 것은 사용하지 수 = 0

너무 나쁜 곳 X 매개 변수를 계산하는 것입니다 (코드 예제 아래). 누구든지 도와 줄 수 있습니까?

Function SpLine(PeriodCol As Range, RateCol As Range, x As Range) 

Dim Period_Count As Integer 
Dim Rate_Count As Integer 
Dim c As Integer 
Dim n As Integer 
Dim i, k As Integer 
Dim p, qn, sig, un As Single 
Dim klo, khi As Integer 
Dim h, b, a As Single 

' shows the calculation of a cubic spline interpolated value given known values for fixed periods 

Period_Count = PeriodCol.Rows.Count 
Rate_Count = RateCol.Rows.Count 

If Period_Count <> Rate_Count Then 
    SpLine = "Error: Range count dos not match" 
    GoTo endnow 
End If 

ReDim xin(Period_Count) As Single 
ReDim yin(Period_Count) As Single 

For c = 1 To Period_Count 
    xin(c) = PeriodCol(c) 
    yin(c) = RateCol(c) 
Next c 

ReDim u(Period_Count - 1) As Single 
ReDim yt(Period_Count) As Single 
n = Period_Count 
yt(1) = 0 
u(1) = 0 

For i = 2 To n - 1 
    sig = (xin(i) - xin(i - 1))/(xin(i + 1) - xin(i - 1)) 
    p = sig * yt(i - 1) + 2 
    yt(i) = (sig - 1)/p 
    u(i) = (yin(i + 1) - yin(i))/(xin(i + 1) - xin(i)) - (yin(i) - yin(i - 1))/(xin(i) - xin(i - 1)) 
    u(i) = (6 * u(i)/(xin(i + 1) - xin(i - 1)) - sig * u(i - 1))/p 
Next i 

qn = 0 
un = 0 
yt(n) = (un - qn * u(n - 1))/(qn * yt(n - 1) + 1) 

For k = n - 1 To 1 Step -1 
    yt(k) = yt(k) * yt(k + 1) + u(k) 
Next k 

klo = 1 
khi = n 

Do 
    k = khi - klo 
    If xin(k) > x Then 
     khi = k 
    Else 
     klo = k 
    End If 

    k = khi - klo 
Loop While k > 1 

h = xin(khi) - xin(klo) 
a = (xin(khi) - x)/h 
b = (x - xin(klo))/h 
SpLine = a * yin(klo) + b * yin(khi) + ((a^3 - a) * yt(klo) + (b^3 - b) * yt(khi)) * (h^2)/6 

endnow: 

End Function 

답변

0

누구도 대답하지 않았으므로 나는 다른 방법을 찾아야한다고 생각합니다.

내 값이 포물선 곡선의 y와 비슷하므로 3 차 다항식의 계수를 구해서이 곡선을 근사화했습니다.

은 셀 1X4 배열의 수식을 채움으로써 이루어진다 :

worksheet.MyRange1x4.formulaarray = "=LINEST(" & MyX & "," & MyY & "^{1,2,3})" 

MYX 및 MYY 다시 동일한하는 치수 (1 XN)에 배열되는 곳

결과 인 "는 ","b ","c ","d "를 ax^3+bx^2+cx+d

최대치를 찾고 싶다면 델타를 풀어야했습니다. 2 차 방정식 : Delta = (-b (+/-) SQRT(b^2 - 3ac))/3a

델타를 0으로 강제 설정하면 (+/- SQRT로 인해) 2 개의 가능한 X 값을 얻었습니다. 그 중 하나는 확실히 모든 최대 값이있는 범위에 있었고 다른 하나는 완전히 잘못되었습니다. 범위.

올바른 것을 선택하면 마침내 내 X가 발견되었습니다.