Автор работы: Пользователь скрыл имя, 13 Марта 2013 в 19:43, реферат
В электронные таблицы Excel, систему управления базами данных Access, язык программирования Visual Basic и многие другие современные компьютерные технологии встроены так называемые “финансовые функции”: fv(), pv(), pmt(), ppmt(), ipmt(), rate(), nper() и т.д. В повседневной жизни с задачами, в которых они могут быть использованы, приходится сталкиваться достаточно часто.
Введение
Динамика вклада
Задача о величине вклада
Задача о величине вклада после снятия денег в конце каждого периода
Задача о величине вклада после внесения (снятия) денег в конце или начале каждого периода
Задача о изменяющихся процентных ставках
Задача о изменяющихся процентных ставках и величинах снимаемых денег
Дисконтирование. Инвестиции. Консолидирование
Задача о дисконтировании
Задача о инвестировании проекта
Задача о консолидировании платежей
Платежи
Задача о равных платежах в конце каждого периода
Задача о платежах с одинаковой современной стоимостью
Задача о платежах на проценты
Разные задачи
Задача о величине процентной ставки
Задача о величине процентной ставки 2
Задача о количестве периодов для расчета заемщика с банком
Задача о суммарной способности к кредитованию
Задача о минимальном количестве банков
Задача о изменении величины суммарного кредитования
Заключение
Литература
Финансовые функции и рекурсия
Министерство образования РФ
Тульский государственный педагогический университет
имени Л.Н. Толстого
Кафедра информатики
Дипломная работа
"Финансовые функции" и рекурсия
Выполнил:
Научный руководитель:
Тула-2000
План
Введение
Динамика вклада
Задача о величине вклада
Задача о величине вклада после снятия денег в конце каждого периода
Задача о величине вклада после внесения (снятия) денег в конце или начале каждого периода
Задача о изменяющихся процентных ставках
Задача о изменяющихся процентных ставках и величинах снимаемых денег
Дисконтирование. Инвестиции. Консолидирование
Задача о дисконтировании
Задача о инвестировании проекта
Задача о консолидировании платежей
Платежи
Задача о равных платежах в конце каждого периода
Задача о платежах с одинаковой современной стоимостью
Задача о платежах на проценты
Разные задачи
Задача о величине процентной ставки
Задача о величине процентной ставки 2
Задача о количестве периодов для расчета заемщика с банком
Задача о суммарной способности к кредитованию
Задача о минимальном количестве банков
Задача о изменении величины суммарного кредитования
Заключение
Литература
Введение
В электронные таблицы Excel, систему управления базами данных Access, язык программирования Visual Basic и многие другие современные компьютерные технологии встроены так называемые “финансовые функции”: fv(), pv(), pmt(), ppmt(), ipmt(), rate(), nper() и т.д. В повседневной жизни с задачами, в которых они могут быть использованы, приходится сталкиваться достаточно часто. Это заставляет преподавателей информатики педагогических вузов не только знакомить студентов различных специальностей с синтаксисом и семантикой этих функций, но и уделять особое внимание поиску новых методик и технологий обучения, ориентированных на прочное усвоение соответствующих знаний. И здесь на помощь может прийти рекурсия, с помощью которой строятся лаконичные и легко понимаемые алгоритмы, а затем и соответствующие информационные модели в виде рекурсивных программ на том или ином языке программирования [9, 10]. И что особенно важно, набор упомянутых финансовых функций и рекурсивные алгоритмы их вычисления могут служить весьма подходящим фоновым материалом для начального освоения студентами рекурсии как достаточно общего и эффективного метода решения практических задач.
Заметим, что вычисление значений
финансовых функций с помощью
электронных таблиц Excel или других
пакетов прикладных программ можно
признать целесообразным лишь при уже
полностью сформированном понимании
их синтаксиса и семантики. Но при
первом знакомстве с этими и другими
функциями рекурсивный подход в
полной мере демонстрирует все свои
дидактические преимущества по сравнению
с простым описанием функций
и решением по ним соответствующих
прикладных задач. Он дает возможность
не только всесторонне понять содержание
излагаемого материала, но сделать
это быстро и эффективно. И что
особенно важно, полученные знания становятся
достоянием долговременной памяти. Последний
вывод убедительно
При отборе материала для
первоначального знакомства студентов
и учащихся с рекурсивными методами
решения прикладных задач, ориентированных
на экономические специальности, существенную
роль играют два фактора: наличие
экономического содержания в этих задачах
и прозрачность свойств рекурсивности
рассматриваемых в них
Большой выбор содержательных
задач, решаемых финансовыми функциями,
можно встретить в сфере
Рис.1. Банк как финансовый посредник между вкладчиками и заемщиками
В рассматриваемой ниже серии
задач везде речь идет об обычных
вкладах и сложных процентах,
а решения оформлены в виде
рекурсивных программ-функций
Динамика вклада
Начнем упомянутую серию задач с рассмотрения простой и многим знакомой житейской проблемы хранения денег в банке.
Задача о величине вклада
Вкладчик положил в банк сумму в sum денежных единиц под p процентов за один период времени (год, месяц, неделя и т.д.). Составить программу-функцию, возвращающую величину вклада по истечении n периодов времени (n = 1, 2, …).
Решение. Пусть invest(sum,p,n) - искомая функция. Вычисления значений invest() можно проводить по известной формуле:
invest(sum,p,n) = sumЧ(1+p/100) n.
Однако в учебных целях
нас будет интересовать рекурсивный
вариант алгоритма решения
(1)
Реализуя декомпозицию иным способом, получим другой вариант рекурсивной программы (1). Например, сделаем это исходя из такого факта. Положить некоторую сумму в банк на n периодов – это то же самое, что положить эту сумму на 1 период, взять и снова положить на n-1 период. Соответствующая программа-функция выглядит так:
(2)
В данной и подобной ей задачах указанные декомпозиционные посылки программно реализуются приблизительно с равной степенью сложности и, тем самым, обе имеют право на существование. Однако может возникнуть ситуация, когда предпочтение должно быть отдано той или иной конкретной посылке. Например, если в последующем имеется необходимость перейти к нерекурсивному варианту программы, то лучше пользоваться посылкой первого типа, а если есть проблемы с доказательством правильности реализуемого алгоритма, то целесообразно работать с посылкой второго типа.
Нетрудно видеть, что общее количество рекурсивных вызовов при вычислении invest(sum,p,n) и invest1(sum,p,n) равно n. Можно было бы уменьшить это значение до величины floor(log2(n)) +1, где floor(a) - целая часть натурального числа a, исходя из следующих двух декомпозиционных посылок.
Пусть сумма sum=mЧ g денежных единиц помещена на вклад при ставке в p процентов за период. Тогда через n периодов sum возрастет до той же самой величины, что и совокупная сумма m отдельных вкладов по g денежных единиц каждый, также помещенных под р процентов за период. Не ограничивая общности, величину sum можно считать целым неотрицательным числом. В противном случае можно было бы перейти к иному номиналу денежных единиц. Значения m и g также будем считать целыми числами.
Положить некоторую сумму sum в банк на n периодов – это то же самое, что положить эту сумму на k (0ЈkЈn) периодов, взять и снова положить на n-k периодов.
Основанную на этих посылках
рекурсивную функцию для
Первая посылка.
В частности, при m=1 получаем:
Первая и вторая посылки. Пусть k=floor(n/2), тогда.
Отсюда при n=2Чk сразу же получаем:
При n=2Чk+1 имеем:
Выведенные соотношения для inv() позволяют записать такую программу для её вычисления:
Общее количество рекурсивных
вызовов при счете по этой программе-функции
можно было бы подсчитать с помощью
следующей вспомогательной
и оно действительно равно
Контрольные примеры.
Незначительная перестройка структуры функции inv(sum,p,n) позволяет получить еще один вариант её реализации, в котором количество рекурсивных вызовов в точности равно Сделать это можно так:
Замечание. В любых ситуациях, в которых возникают вопросы о быстродействии алгоритма, желательно по возможности минимизировать общее количество рекурсивных вызовов. В рассмотренной задаче построить алгоритм с рекурсивными вызовами можно было бы значительно проще, исходя из конечной формулы для решения задачи и дихотомии. Однако путь, который мы прошли, имеет свои достоинства. Он позволяет в общем случае выявить ограничения на рекурсивную функцию, достаточные для столь малого количества рекурсивных обращений при её вычислении. Фактически, из проведенных рассуждений вытекает такое утверждение.
Пусть функция F(a,n,v) удовлетворяет условиям:
F(a,1,v) =g(a,v),
F(a,n,v) =aЧF(1,n,v),
F(a,n,v) =F(F(a,k,v),n-k,v) (1ЈkЈn),
где a - действительное число,
n - натуральное число, v=(v1,v2,…,vs) T - вектор
с числовыми компонентами, g(a,v) - функция,
значения которой для a и v из области
определения F(a,n,v) мы вычислять можем.
Тогда рекурсивная программа-
вычисляет значение F(a,n,v) ровно за рекурсивных вызовов.
Доказательство этого факта с использованием свойств A, B и C можно провести так:
Отсюда, при n=2Чk имеем
а при n=2Чk+1 получаем
Именно на этих соотношениях и базируется алгоритм, реализуемый программой-функцией F(a,n,v).
И в заключение замечания приведем пример функции, удовлетворяющей условиям A, B и С: где в области определения функции f(v) её значения мы вычислят умеем.
Задача о величине вклада после снятия денег в конце каждого периода
Вкладчик положил в
банк сумму в sum денежных единиц под
p процентов за один период времени.
В конце каждого периода
Решение. Данная задача весьма похожа на задачу 1. Рекурсивная программа-функция waste(sum,p,A,n) реализует декомпозицию, исходя из такого утверждения. Положить сумму sum в банк на n периодов со снятием в конце каждого периода по A денежных единиц – это то же самое, что положить данную сумму на тех же условиях на n – 1 период, взять, снова положить на 1 период и затем снять A единиц.
(3)
Нетрудно понять, на какую
посылку опирается при
(4)
Замечание 1. Конечная формула для решения задачи 2 выглядит так:
Выводится она следующим образом.
Одно из преимуществ “формул” waste() и waste1() в том, что они выписываются без всякого вывода и практически без затруднений.
Контрольные примеры.
Замечание 2. В связи с задачей о динамике вклада может быть поставлен и такой вопрос. Сколько лет подряд вкладчик может снимать со счета по A денежных единиц в конце каждого периода после начисления процентов, если он положил в банк сумму в S единиц при ставке p процентов. Ответ на него может дать рекурсивная функция year(S,p,A):
Здесь случай неубывания величины вклада выделен отдельно (loіS), рекурсия организована по остаткам вклада после периодов, в которых хватило денег на очередную выплату в A единиц.
Контрольные примеры.
Задача о величине вклада после внесения (снятия) денег в конце или начале каждого периода
Вкладчик положил в банк pv денежных единиц на nper периодов при неизменной банковской ставке в rate процентов. В дальнейшем он предполагает в конце (type=0) или начале (type=1) каждого периода вносить (забирать) по pmt денежных единиц. Какой будет величина вклада через nper периодов?
Решение. Данная задача является прямым обобщением задач 1 и 2 и может быть решена с помощью встроенной в Excel функции fv(). Однако нас будут интересовать её рекурсивные аналоги. Будем считать, что знак величины pmt определяет тип операции, совершаемой вкладчиком в конце или начале каждого периода. При pmtі0 деньги вносятся на счет, а при pmt<0 деньги снимаются со счета (в Excel наоборот!). Далее, пусть знак pv определяет, имеет ли вкладчик деньги на счету или он должен банку. При pvі0 деньги на счету есть, при pv<0 имеется задолженность в |pv| денежных единиц (в Excel наоборот!).
Пусть fv(rate,nper,pmt,pv,type) - функция для решения исходной задачи. Ниже приведено два варианта (fv1(), fv2()) рекурсивной реализации fv():
Дадим пояснения к функциям fv1() и fv2(), например, при type=0. Параметризация задачи фактически осуществлена в её постановке. Базой рекурсии для обоих предложенных вариантов служит случай nper=0. Иными словами, если pv денежных единиц положить в банк и сразу же их забрать, то будет возвращена та же самая сумма. Декомпозиция для fv1() и fv2() проведена, исходя из того, что решение исходной задачи по конечному результату равносильно соответственно совокупности следующих действий. Для fv1(): “Положить на тех же условиях pv денежных единиц в банк на nper-1 период, снять всю сумму с вклада и, наконец, на тех же условиях снова положить её на один период”. Для fv2(): “Положить на тех же условиях pv денежных единиц в банк на 1 период, снять всю сумму с вклада и, наконец, на тех же условиях снова положить её на nper-1 период”. Именно это и реализовано в соответствующих программах функциях.