Страница: 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-сайт:
Профиль | | #7
Добавлено: 19.01.10 15:15
верно.
Номер ответа: 8
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #8
Добавлено: 19.01.10 15:21
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-сайт:
Профиль | | #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-сайт:
Профиль | | #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 Спасибо, очень разъяснили! По смыслу мне вообще не подходят отрицательные числа.