powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Код ВСД функции EXCEL
5 сообщений из 5, страница 1 из 1
Код ВСД функции EXCEL
    #38559000
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Необходим внутренний код функции Excel ВСД, (конкретно от Microsoft-а)

Кто-то случайно не работал с этим ?
Имею Oracle реализацию, получил большую погрешность, допускаю что ГРЕШИТ
господин EXCEL, однако все считают его действия ИСТИННО НЕПОГРЕШИМЫМ,
соответственно приходиться подгонять результат и допускать идентичные ошибки
отсюда такая просьба.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
with TableItem as (
           select To_Date('01.04.2011','dd.mm.yyyy') DAY, -5144.86 OKK from dual union all
           select To_Date('02.05.2011','dd.mm.yyyy') DAY,  1730.00 OKK from dual union all
           select To_Date('02.06.2011','dd.mm.yyyy') DAY,  1730.00 OKK from dual union all
           select To_Date('03.07.2011','dd.mm.yyyy') DAY,  1725.00 OKK from dual
)


 select round((1/x-1),7) F1
 from
 (
  select * from TableItem
   model 
        dimension by (Row_Number() over (order by DAY) NUM)
        measures (DAY-First_Value(DAY) over(order by DAY) dat,
                  OKK s,
                  0 ss,
                  0 f_a,
                  0 f_b,
                  0 f_x,
                  0 a,
                  1 b,
                  0 x,
                  0 iter
                 )
           rules  iterate(33)
           until (Abs(f_x[1])<Power(10,-7))
                 (ss[any]=s[CV()]*power(a[1],dat[CV()]/365),
                  f_a[1] =sum(ss)[any],
                  ss[any]=s[CV()]*power(b[1],dat[CV()]/365),
                   f_b[1]=sum(ss)[any],
                     x[1]=a[1]-f_a[1]*(b[1]-a[1])/(f_b[1]-f_a[1]),
                  ss[any]=s[CV()]*power(x[1],dat[CV()]/365),
                   f_x[1]=sum(ss)[any],
                     a[1]=decode(sign(f_a[1]*f_x[1]),1,x[1],a[1]),
                     b[1]=decode(sign(f_a[1]*f_x[1]),1,b[1],x[1]),
                  iter[1]=iteration_number+1
                 )
         )
 where NUM=1;
...
Рейтинг: 0 / 0
Код ВСД функции EXCEL
    #38559081
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

В экономике я почти абсолютный ноль... Но есть некоторые наблюдения.
Функция ВСД на английском выглядит как IRR.
В классе VBA есть функция IRR, судя по описанию из одного справочника "Возвращает значение типа Double, указывающее норму прибыли для последовательности периодических финансовых операций (выплат или поступлений)". Оно) ?
Если да, то код функции увидеть нельзя напрямую, но зная что все функции VBA включая финансовые перетекли в библиотеку VB.NET для совместимости, то подсмотреть реализацию можно. Как пример:
Кусочек кода из Microsoft.VisualBasic.dll .NET 4.0
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
' Microsoft.VisualBasic.Financial
''' <summary>Возвращает значение типа Double, определяющее внутреннюю ставку доходности для ряда периодических денежных потоков (платежей и поступлений).</summary>
''' <returns>Возвращает значение типа Double, определяющее внутреннюю ставку доходности для ряда периодических денежных потоков (платежей и поступлений).</returns>
''' <param name="ValueArray">Обязательный параметр.Массив значений типа Double, определяющий значения денежных операций.Этот массив должен содержать по крайней мере одно отрицательное значение (платеж) и одно положительное значение (поступление).</param>
''' <param name="Guess">Необязательный параметр.Объект, задающий значение, которое будет возвращено функцией IRR.Если этот параметр опущен, используется значение <paramref name="Guess" />, равное 0,1 (10 процентам).</param>
''' <exception cref="T:System.ArgumentException">Указаны недопустимые значения аргументов массива или <paramref name="Guess" /> &lt;= -1.</exception>
''' <filterpriority>1</filterpriority>
Public Shared Function IRR(ByRef ValueArray As Double(), Optional Guess As Double=0.1) As Double
	Dim upperBound As Integer
	Try
		upperBound = ValueArray.GetUpperBound(0)
	Catch ex As StackOverflowException
		Throw ex
	Catch ex2 As OutOfMemoryException
		Throw ex2
	Catch ex3 As ThreadAbortException
		Throw ex3
	Catch ex_1B As Exception
		Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", New String()() = { "ValueArray" }))
	End Try
	' The following expression was wrapped in a checked-expression
	Dim num As Integer = upperBound + 1
	If Guess <= -1.0 Then
		Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", New String()() = { "Guess" }))
	End If
	If num <= 1 Then
		Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", New String()() = { "ValueArray" }))
	End If
	Dim num2 As Double
	If ValueArray(0) > 0.0 Then
		num2 = ValueArray(0)
	Else
		num2 = -ValueArray(0)
	End If
	Dim arg_BF_0 As Integer = 0
	Dim num3 As Integer = upperBound
	Dim i As Integer
	' The following expression was wrapped in a checked-expression
	i = arg_BF_0
	While i <= num3
		If ValueArray(i) > num2 Then
			num2 = ValueArray(i)
		Else
			If-ValueArray(i) > num2 Then
				num2 = -ValueArray(i)
			End If
		End If
		i = i + 1
	End While
	Dim num4 As Double = num2 * 1E-07 * 0.01
	Dim num5 As Double = Guess
	Dim num6 As Double = Financial.OptPV2(ValueArray, num5)
	Dim num7 As Double
	If num6 > 0.0 Then
		num7 = num5 + 1E-05
	Else
		num7 = num5 - 1E-05
	End If
	If num7 <= -1.0 Then
		Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", New String()() = { "Rate" }))
	End If
	Dim num8 As Double = Financial.OptPV2(ValueArray, num7)
	i = 0
	While True
		If num8 = num6 Then
			If num7 > num5 Then
				num5 -= 1E-05
			Else
				num5 += 1E-05
			End If
			num6 = Financial.OptPV2(ValueArray, num5)
			If num8 = num6 Then
				Exit While
			End If
		End If
		num5 = num7 - (num7 - num5) * num8 / (num8 - num6)
		If num5 <= -1.0 Then
			num5 = (num7 - 1.0) * 0.5
		End If
		num6 = Financial.OptPV2(ValueArray, num5)
		If num5 > num7 Then
			num2 = num5 - num7
		Else
			num2 = num7 - num5
		End If
		Dim num9 As Double
		If num6 > 0.0 Then
			num9 = num6
		Else
			num9 = -num6
		End If
		If num9 < num4 AndAlso num2 < 1E-07 Then
			Return num5
		End If
		num2 = num6
		num6 = num8
		num8 = num2
		num2 = num5
		num5 = num7
		num7 = num2
		' The following expression was wrapped in a checked-statement
		i += 1
		If i > 39 Then
			GoTo Block_17
		End If
	End While
	Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue"))
	Block_17:
	Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue"))
End Function

...
Рейтинг: 0 / 0
Код ВСД функции EXCEL
    #38559092
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вроде оно. Решает одинаково.
...
Рейтинг: 0 / 0
Код ВСД функции EXCEL
    #38559127
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

ОНО ----!!!!
Спасибо Вам Влад ....


"..подсмотреть реализацию можно.."
Как и где Вы это подсмотрели ?
...
Рейтинг: 0 / 0
Код ВСД функции EXCEL
    #38559329
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Программой-дизассемблиром типа .NET Reflector (платная) или IL Spy (бесплатная).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Код ВСД функции EXCEL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]