Функция VBA Linest для интерполяции значения - PullRequest
0 голосов
/ 08 апреля 2020

Привет, пытаясь использовать функцию LinEst на рабочем листе, чтобы работать в качестве оценщика для данного X. Сначала нашел функцию, которая выдала бы список чисел от 1 до n для использования в качестве степеней. Затем попытался включить в функцию. Но я уверен, что сделал несколько ошибок. В конечном счете, я хочу ввести диапазон x, диапазон yy, полиномиальный порядок моей линейной оценки и x, чтобы получить ожидаемый результат.


Option Explicit

Public Function ReturnArrayAtoB(ByVal M As Long, ByVal N As Long) As Variant

    Dim lngCounter  As Long
    Dim arrReturn   As Variant

    ReDim arrReturn(N - M)

    For lngCounter = 0 To N - M
        arrReturn(lngCounter) = M + lngCounter
    Next lngCounter

    ReturnArrayAtoB = arrReturn

End Function


Function PolyFit(rX As Range, rY As Range, Xinput, Optional PolyOrder = 3)
Dim varLinEst As Variant
Dim arrReturn As Variant
Dim i As Integer
Dim a As Long

arrReturn = ReturnArrayAtoB(1, PolyOrder)

varLinEst = WorksheetFunction.LinEst(rY, ((rX) ^ (arrReturn)), True, False)

a = 0
For i = 1 To PolyOrder
    a = Xinput ^ varLinEst(i) + a
Next i
a = a + varLinEst(0)

    PolyFit = a

PolyFit = varLinEst

End Function

1 Ответ

1 голос
/ 08 апреля 2020

вам нужно позднее связать формулу и использовать Application.Power

были некоторые другие проблемы логики c, которые я исправил.

Public Function ReturnArrayAtoB(ByVal M As Long, ByVal N As Long) As Variant
    Dim arrReturn   As Variant
    ReDim arrReturn(N - M)

    Dim lngCounter  As Long
    For lngCounter = 0 To N - M
        arrReturn(lngCounter) = M + lngCounter
    Next lngCounter

    ReturnArrayAtoB = arrReturn

End Function


Function PolyFit(rX As Range, rY As Range, Xinput As Double, Optional PolyOrder = 3)
    Dim arrReturn As Variant
    arrReturn = ReturnArrayAtoB(1, PolyOrder)

    Dim varLinEst As Variant
    varLinEst = Application.LinEst(rY, Application.Power(rX, arrReturn))

    Dim a As Double
    a = 0#

    Dim i As Long
    For i = 1 To PolyOrder + 1
        a = (Xinput ^ (PolyOrder + 1 - i)) * varLinEst(i) + a
    Next i

    PolyFit = a
End Function

И только потому, что следующая формула делает то же самое, если есть Sequence ():

=SUMPRODUCT(INDEX(LINEST(B1:B8,(A1:A8^SEQUENCE(,E2))),SEQUENCE(E2+1)),E1^(SEQUENCE(E2+1,,E2,-1)))

enter image description here

...