Смекни!
smekni.com

Финансовые функции и рекурсия (стр. 5 из 7)

Решение. Данная задача может быть решена с помощью встроенной в Excel функции ppmt(rate,per,nper,pv,type). Получим её рекурсивную реализацию. Пусть pk (k=1,2,…,nper) - последовательные платежи.

Рассмотрим сначала случай type=0. Современные стоимости всех платежей должны совпадать. Отсюда

(25)

Но

(26)

Аналогично при type=1 получим

(27)

Из соотношений (25), (26) и (27) нетрудно получить соответствующие формулы для случая произвольного значения type. Выглядят они так:

Теперь ясно, что брать в качестве базы рекурсии, и как организовать декомпозицию по периодам при построении функции ppmt(), а также как получить конечную формулу (ppmt1) для решения исходной задачи:

Контрольные примеры.

Задача о платежах на проценты

Некто взял заем в pv денежных единиц при ставке rate процентов за период. Возврат долга должен быть произведен nper равными платежами в конце каждого периода. Подсчитать платеж ipmt в период per (1£per£nper), составляющий часть общего платежа, равную приросту долга по процентам за этот период.

Решение. Данная задача может быть решена с помощью встроенной в Excel функции ipmt(rate,per,nper,pv). Получим её рекурсивную реализацию. Общая величина платежа pmt в каждый из периодов может быть вычислена так (см. задачу 11 при type=0):

Базой рекурсии будем считать случай per=1. К концу первого периода часть долга, приходящаяся на проценты, будет равна pv×rate/100. Декомпозицию проведем, опираясь на такие соображения. Решать исходную задачу, вычисляя ipmt в период per- это то же самое, что решать укороченную на один период задачу, но с начальным займом в pv×(1+rate/100) -pmt денежных единиц. Тогда решение задачи можно получать с помощью пары функций ipmt() и ip(). Первая из них вычисляет вспомогательную величину pmt- размер общих платежей в конце каждого периода, и передает её в качестве формального параметра функции ip(), в которой и организуется описанный рекурсивный процесс:

Вывести конечную формулу (ipmt1) для решения задачи можно так. Остаток долга после завершения (k-1) - го периода равен:

Тогда увеличение долга по процентам за k-ый период можно подсчитать так:

Но это и есть прирост долга по процентам за k-ый период. И окончательно имеем:

Контрольные примеры.

Разные задачи

Задача о величине процентной ставки

Банк выдал заемщику S денежных единиц. Условия кредита таковы: заемщик должен внести в банк k последовательных платежей. Первый платеж в a0 денежных единиц необходимо осуществить через t0 периодов, второй платеж в a1 единиц - через t1 периодов и т.д. и, наконец, (k-1) - й платеж в ak-1 единиц - через tk-1 периодов. Все величины tn (n=0. . k-1) отсчитываются от момента получения займа. Какую процентную ставку установил банк для этого кредита?

Решение. Пусть p- процентная ставка и x=1+p/100. Считая, что современная стоимость всех внесенных в банк платежей должна равняться величине кредита, получаем:

Но t0<t1<…<tk-1 и для нахождения величины x, а значит и p, имеем уравнение:

Нам требуется определить положительный корень многочлена f(x), стоящего в левой части последнего соотношения. Из экономических соображений вытекает, что такой корень должен существовать и быть единственным. Впрочем, с учетом того, что S>0 и an>0 (n=0. . k-1), чисто формальными рассуждениями можно установить даже более сильное утверждение. Многочлен f(x) имеет единственный неотрицательный корень x0. Модули остальных его корней не превосходят x0. Доказательство этого факта вытекает из применения теоремы Фробениуса-Перона [8, c.263; 9, стр.319, 340] к сопровождающей матрице f(x).

Схема дальнейшей нашей работы будет такой. Пусть векторы a и t- заданы соотношениями (10). Напишем рекурсивную программу-функцию vecto() формирования компонентов вектора m коэффициентами f(x), начиная от свободного члена a0 и далее по возрастающим степеням x. Затем в головной программе percent(S,a,t) для нахождения процентной ставки p воспользуемся композицией серии встроенных в Mathcad функций:

polyroots(m) – вычисление всех корней f(x);

max(v) - нахождение числа a+i×b, где a и b наибольшие соответственно из действительных частей и коэффициентов при мнимых частях компонентов v;

Re(z) - вычисление действительной части комплексного числа z.

(28)

(29)

Несколько слов об аргументах функции vecto(a,t,n,q,m). Назначение величин a, t и n ясно. Вспомогательный параметр q служит счетчиком количества сформированных в матрице m коэффициентов f(x): q=0. . tn.

Нерекурсивный вариант программ (28) -(29) может быть записан так:

(30)

Контрольные примеры.

Задача о величине процентной ставки 2

Инвестор вложил в некоторый проект pv денежных единиц (д. е) и в течение последующих nper периодов это должно приносить ему платежи по pmt д. е. Пусть платежи производятся в конце (type=1) или в начале (type=0) каждого периода. Под какой процент вложены инвестором деньги?

Решение. Данная задача может быть решена с помощью встроенной в Excel функции rate(nper,per,pv,type). Строя рекурсивные аналоги rate(), будем делать это отдельно для случаев type=0 и type=1.

A. type=0. Современная стоимость всех платежей должна быть равна pv:

(31)

Преобразуем (31) к виду

(32)

На последнее соотношение можно смотреть как на декомпозицию исходной задачи с прежними платежами и процентной ставкой, nper-1 периодом и инвестициями в pv×(1+rate/100) -pmt денежных единиц. Правда, инвестиции здесь содержат неизвестный параметр rate. Далее ясно, что при nper=1

Если считать последнее из этих соотношений базой индукции, то соответствующая программа-функция могла бы выглядеть так:

(33)

где за x обозначена величина rate(nper,pmt,pv). Мы получили, что в процессе рекурсивных вызовов функция обращается к самой себе с тем же самым набором значений параметров. Ясно, что вычисления по ней не будут иметь останова. Точнее, останов будет аварийным по переполнению стека. С подобной ситуацией мы уже сталкивались при решении задачи 10. И там для выхода из создавшейся ситуации был использован прием введения дополнительного параметра. Поступим также и здесь, заменив (33) функцией:

(34)

Теперь будем искать решения x=x* уравнения

(35)

Делать это можно, например, методом дихотомии с помощью рекурсивной функции dicho() (см. (17)).

Замечание. Обратим внимание на следующее обстоятельство. При решении уравнения g(nper,pmt,pv,x) =0 с вычислениями по (34) могут появиться “посторонние корни” - значения x* ºrate1(nper,pmt,pv,x*), но не являющиеся решениями исходной задачи. Поэтому все полученные корни (35) обязаны подвергнуться проверке по данным задачи, например, на выполнимость условия (31). Ограничимся рассмотрением одного примера.

Контрольный пример.

Полученное значение x=7.35616 не является решением задачи, ибо pv=320.88289¹b.

Получили решение задачи, ибо pv=320.88289=b.

B. type=1. К началу второго периода задолженность инвестору с одной стороны равна (pv-pmt) ×(1+rate/100), а с другой стороны - должна быть погашена вторым платежом pmt. Таким образом