Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: Нахождение корня полинома методом Ньютона Добавлено: 19.01.10 13:01  

Автор вопроса:  fifa36

Function myXirr(ByRef cf As Variant, ByRef df As Variant, _
        Optional ByVal guess As Double = 0, Optional ByVal maxiter As Long = 50, Optional basis As Long) As Variant

    Dim i As Long
    Dim rowcf As Long
    Dim rowdf As Long
    
    rowcf = UBound(cf) - LBound(cf) + 1
    rowdf = UBound(df) - LBound(df) + 1
'
    'Scale the current CF stream, avoiding divide by zero. -------------
    Dim meanCF As Double
    Dim sumAbsCF As Double
    Dim deviator As Double
    Dim meanAbsCF As Double

    meanCF = 0
    sumAbsCF = 0
    For i = 1 To rowcf
        sumAbsCF = sumAbsCF + VBA.Abs(cf(i - 1))
    Next i

    meanAbsCF = sumAbsCF / rowcf
    deviator = Excel.WorksheetFunction.Max(meanAbsCF, 1)
    For i = 1 To rowcf
        cf(i - 1) = cf(i - 1) / deviator
    Next i
'    '--------------------------------------------------------------------
    'Convert df to time factors in fractions of a year. -----------------
    Dim tf() As Double
    ReDim tf(0 To rowcf - 1)
    
    For i = 1 To rowcf
        tf(i - 1) = (df(i - 1) - df(1 - 1)) / 365
    Next i
    '--------------------------------------------------------------------
    ' Initialize parameters
    Dim tIRR As Double
    Dim del As Double
    Dim cfPV As Double
    Dim factor As Double
    Dim f As Double
    Dim fp As Double
    Dim k As Long
    
    tIRR = guess  ' Assign the initial IRR guess.
    
    f = 2
    k = 0 'Iteration counter
    ' Newton"s method ---------------------------------------------------
    Do While Abs(f) > 0.000001
        'Sum of PV of Cash flows -polynomial ---------------------------
        k = k + 1                                     ' Increment iteration count
        If k > maxiter Then
            'warning ("finance:xirr:maxIterations Maximum iterations reached (increase MAXITER or try new GUESS).")
            myXirr = "nan"
            Exit Function
        End If
        '---------------------------------------------------------------
        'Sum of PV of Cash flows -polynomial ---------------------------
        'f = 0
        For i = 1 To rowcf
            factor = 1 + tIRR
            If factor < 0 Then
                cfPV = (cf(i - 1) / (-(-factor) ^ tf(i - 1)))
            Else
                cfPV = (cf(i - 1) / (factor) ^ tf(i - 1))
            End If
            'On Error Resume Next
            'cfPV = (cf(i - 1) / (factor) ^ tf(i - 1))
            f = f + cfPV
        Next i
        '---------------------------------------------------------------
        'First derivative ----------------------------------------------
        fp = 0
        For i = 1 To rowcf
            factor = 1 + tIRR
            If factor < 0 Then
                'cfPV = (cf(i - 1) / (-(-factor) ^ tf(i - 1))) * (-tf(i - 1) / (1 + tIRR))
            Else
                cfPV = (cf(i - 1) / (1 + tIRR) ^ tf(i - 1)) * (-tf(i - 1) / (1 + tIRR))
            End If
            'On Error Resume Next
            'cfPV = (cf(i - 1) / (1 + tIRR) ^ tf(i - 1)) * (-tf(i - 1) / (1 + tIRR))
            fp = fp + cfPV
        Next i
        '---------------------------------------------------------------
      
        If fp = 0 Then
            'warning("finance:xirr:noIRR", "Unable to find internal rate of return.")
            myXirr = "nan"
            Exit Function
        End If
'        If fp <= 1E-21 Then
'            myXirr = "fpNan"
'            Exit Function
'        End If
        del = CDbl(-f / fp)
        tIRR = tIRR + del
    Loop
    '--------------------------------------------------------------------
    myXirr = tIRR
End Function

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #1 Добавлено: 19.01.10 13:06
Здравствуйте, помогите, разобраться.
Написал процедуру чтобы искала внутреннею норму доходности. На вход подаются массив денежных потоков и массив дат.
Постоянно выдает ошибку "overflow" в строке (в конце кода)

del = CDbl(-f / fp)

видимо не сходится к решению процесс у меня. Может кто скажет как это дело улучшить?
Начальное предположение беру "0"

Второй вопрос, правомерно ли такая формула
-6,555555555555555555^0.3333333333333333 = -(6,555555555555555555^0.3333333333333333)
иначе бэйсик выдает ошибку для такой операции -6,555555555555555555^0.3333333333333333

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 19.01.10 13:13
-6,555555555555555555^0.3333333333333333 - это ты возводишь отрицательное число в дробную степень. Он (бейсик) не знает, что ты хочешь корень кубический.

Ответить

Номер ответа: 3
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #3 Добавлено: 19.01.10 14:24
Не удачный пример привел)
Вот здесь возникает ошибка постоянно при возведении в степень, когда основание отрицательное, степень < 1
cfPV = (cf(i - 1) / (factor) ^ tf(i - 1))

Ответить

Номер ответа: 4
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #4
Добавлено: 19.01.10 14:39
А ты сам подумай. Отрицательное число. В четное степени - положительное, в нечетной - отрицательное. А в дробной?

Ответить

Номер ответа: 5
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #5 Добавлено: 19.01.10 14:54
например
-6.5^0.8 = -6,5^(4/5) = (-6,5^4)^0.2
и все ок. или нет?

Ответить

Номер ответа: 6
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #6 Добавлено: 19.01.10 15:15
V?DUnitа в дробной отрицательных чисел не бывает

Ответить

Номер ответа: 7
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #7
Добавлено: 19.01.10 15:15
верно.

Ответить

Номер ответа: 8
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #8
Добавлено: 19.01.10 15:21
V?DUnitа в дробной отрицательных чисел не бывает
Как же?
4^-(1/2) = 0.5
-4^(1/2)

Ответить

Номер ответа: 9
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #9
Добавлено: 19.01.10 20:23
http://ru.wikipedia.org/wiki/Комплексное_число

Ответить

Номер ответа: 10
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #10
Добавлено: 19.01.10 23:40
зачем Комплексные сюда?
все просто X^-1=1/X

Ответить

Номер ответа: 11
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #11
Добавлено: 20.01.10 12:23
(-1)^1,75

?

Ответить

Номер ответа: 12
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #12 Добавлено: 20.01.10 13:35
фокус покус
(-1)^1,75 = (-1)^(2/3.5)=((-1)^2)^3.5 = 1
но это бред конечно, получается отрицательные вообще нельзя возводить в нечетные степеня?

Ответить

Номер ответа: 13
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #13 Добавлено: 20.01.10 13:36
то есть так
(-1)^1,75 = (-1)^(2/3.5)=((-1)^2)^(1/3.5) = 1

Ответить

Номер ответа: 14
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #14
Добавлено: 20.01.10 14:06
____ При возведении отрицательного числа в степень ненатурального показателя Вы должны сами решить, какой ответ Вам нужен в результате по физическому смыслу задачи. В Вашем случае есть просто математическая неопределённость. Ведь показатель, равный рациональной дроби (коей является любая десятичная дробь) можно реализовывать поочерёдно: и возвести сначала в степень и взять сначала корень. При этом корень из любого числа любой целой степени N имеет имеет ровно N значений. Отсюда вывод — решение зависит и от представления степени — либо как 175/100, либо 35/20, либо ...., либо 7/4.
____ Так что в Вашем примере надо искать смысл и из него выбирать результат, поскольку способов получения результата более одного.
____ Ответа №13 — абсолютно некорректный. Либо Вы работает в простых дробях, либо в десятичных. Смешивать их в данном случае бессмысленно. Я бы определил дробную степень (и десятичную тоже), как функцию двух переменных: числителя и знаменателя степени.
____ В Вашем случае наиболее простой ответ: sqrt(2) -i*sqrt(2)

Ответить

Номер ответа: 15
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #15 Добавлено: 21.01.10 15:23
ADSemenov.ru Спасибо, очень разъяснили! По смыслу мне вообще не подходят отрицательные числа.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам