生活中,我们可能遇到这样的情况,朋友小明向你借10000元,保证5个月连本带息还给你。假设你手上有如下两套方案:

| 方案1 | 方案2
----|----|---
第一月还款|3350 | 2100
第二月还款|3050 | 2100
第三月还款|2000 | 2100
第四月还款|1000 | 2100
第五月还款|1000 | 2100
总还款|10400 | 10500

如果单看收益/利息的话,毫无疑问应该选择方案2。那是否真的就是方案2更好?或者说如果某个方案更好,它相当于另一个方案好多少,能否量化?回答这个问题就需要用到IRR的知识。

IRR( internal rate of return)内部收益率,是一种投资的评估方法,也就是找出资产潜在的回报率,其原理是利用内部回报率折现,投资的净现值恰好等于零。其求解公式如下:

IRR求解公式

其中n代表回合(案例中N=5),Cn代表收益,C0为初始投资金额(为负数,如方案1,C0=-10000,C1=3350...),r就是需要求解的IRR。公式可以看出是一个一元多次方程,我们知道五次及五次以上的代数方程一般不能用根式求解。如果要求解这个方程的根就需要用到超越方程求解方法


Newton's method

牛顿法Newton's method)又称为牛顿-拉弗森方法Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。

公式如下:

Newton's method

使用牛顿法,我们需要初始一个x0,尽可能贴近要求解的根。这个时候这个方程会收敛(Newton's method只具有局部收敛性),当达到我们精度要求,就可以得到解。对于我们要解的IRR,应该是位于(-1,1]之间的值,我们的x0也就可以选择这其中的数字进行迭代。

演示

我的实现代码如下:

long double f(long double x)
{long double out = 0;for (int i = 0; i <= M; i++) {if (i == 0) {out -= c[i] * powl(x, M);}else{out += c[i] * powl(x, M-i);}}return out;
}long double derf(long double x)
{long double out = 0;for (int i = 0; i < M; i++) {if (i == 0) {out -= c[i] * powl(x, M-1) * M;}else{out += c[i] * powl(x, M-i-1) * (M - 1);}}return out;
}long double NewtonRaphson(long double factor)
{long double up = f(factor), down = derf(factor);return factor - up / down;
}

调用的代码:

        long double pre = 1.618;long double now = NewtonRaphson(pre);while (fabsl(now-pre) > precision * fabsl(now)) {if (fabsl(now) < precision) {break;}pre = now;now = NewtonRaphson(pre);}

其中precision就是精度,设置的是1e-9,最后如果能找到结果,那么now-1就是IRR。Newton's method可以解决一部分超越方程求根问题,但是某些方程在Newton's method下会呈现不收敛情况,就不能用这种方法。

Bisection method

二分法(英语:Bisection method),是一种方程式的近似值求法,也可以用来求已知范围的超越方程的解。IRR正好就是求解区间(-1,1]的值,所以可以使用Bisection method。

求解流程如下:
若要求已知函数 f(x) = 0 的根 (x 的解),则:

  1. 先找出一个区间 [a, b],使得f(a)与f(b)异号。根据介值定理,这个区间内一定包含着方程式的根。
  2. 求该区间的中点m=(a+b)/2,并找出 f(m) 的值。
  3. f(m) 与 f(a) 正负号相同则取 [m, b] 为新的区间, 否则取 [a, m]。
  4. 重复第2和第3步至理想精确度为止。
Bisection method

我的实现代码如下:


long double f(long double x)
{long double out = 0;for (int i = 0; i <= M; i++) {if (i == 0) {out -= c[i] * powl(x, M);}else{out += c[i] * powl(x, M-i);}}return out;
}long double biSearch()
{long double left = precision, right = 2;while (fabsl(right - left) > precision) {long double mid = (right + left) / 2.0;long double fmid = f(mid),fleft = f(left);if (fmid * fleft > 0) {left = mid;}else{right = mid;}}return right;
}

这里left初始并没有取0,是为了防止取到IRR=-1而抛弃了其他更有意义的值。

Secant method

在数值分析中,割线法Secant method)是一个求根算法,该方法用一系列割线的根来近似代替函数f的根。他和牛顿的算法思想相似,但实现方式不同,这种方法同样也有不收敛的情况。

公式如下:

Secant method

从上式中可以看出,割线法需要两个初始值x0和x1,它们离函数的根越近越好。

演示

我的实现代码如下:

long double f(long double x)
{long double out = 0;for (int i = 0; i <= M; i++) {if (i == 0) {out -= c[i] * powl(x, M);}else{out += c[i] * powl(x, M-i);}}return out;
}long double secant()
{long double first = precision, second = 2;while (fabsl(second - first) > precision) {long double f1 = f(first),f2 = f(second);long double next = second - f2 * (second - first) / (f2 - f1);first = second;second = next;}return second;
}

Microsoft Excel中求解IRR的公式就是用的这个算法,Excel中的精度是0.00001%。

Regula Falsi method

这种算法是针对前面Secant Method和Newton Method算法可能出现不收敛情况而提出的,它一定会收敛,并且相对于Bisection Method效率更高。

他的思想是在交换逼近方向的时候用一个系数(这里选2)去调整取值。公式如下(如果系数由1/2变为1,公式就和Secant Method一样)

我的实现代码如下:

long double f(long double x)
{long double out = 0;for (int i = 0; i <= M; i++) {if (i == 0) {out -= c[i] * powl(x, M);}else{out += c[i] * powl(x, M-i);}}return out;
}long double Falsi()
{long double left = precision, right = 2;int side = 0;long double fleft = f(left), fright = f(right);long double ratio = (fleft*right - fright *left) / (fleft - fright);while (fabsl(right - left) > precision) {ratio = (fleft*right - fright *left) / (fleft - fright);long double fratio = f(ratio);if (fright * fratio > 0) {right = ratio;fright = fratio;if (side == -1) {fleft /= 2;}side = -1;}else if (fleft * fratio > 0){left = ratio;fleft = fratio;if (side == 1) {fright /= 2;}side = 1;}else{break;}}return ratio;
}

现在有了超越方程的解法与IRR的概念,那么对于小明的借款,到底哪种方案对于自己更好呢?
下面看一下两种方案Excel计算结果:

可以看到方案1的IRR=1.69%,方案2的IRR=1.65%。方案1的虽然总利息少了,但是内部收益率更高。所以对于作为东家的自己来说选择方案1更优。

不仅限于上面的案例,类似的对于房贷还款,银行提供了等额本金与等额本息两种方式。客户往往倾向于等额本金方式,因为还款总利息更少。那么对于银行来说到底哪种方式对于他们来说更优?有了IRR和超越方程知识,我们也可以自己算一下

由IRR看超越方程求解相关推荐

  1. python超越方程_matlab简单的超越方程求解近似值

    超越方程(英语:transcendental equation)是包含超越函数的方程,也就是方程中有无法用自变数的多项式或开方表示的函数,与超越方程相对的是代数方程.超越方程的求解无法利用代数几何来进 ...

  2. bootstrapwizard 参数_bootstrapWizard 这个插件古怪的用法,看不懂求解?

    问题描述 找了一个老外写的关于bootstrapWizard的向导插件代码,他这个用法看不懂,一脸懵逼.百度别人写的都能看懂,他这个用法,怎么理解运行原理.求大神解答一下. 问题出现的环境背景及自己尝 ...

  3. java异常看不懂_报错了 看不懂求解

    严重: Error configuring application listener of class CodeConsoleInitializer java.lang.ClassNotFoundEx ...

  4. lisp 焊缝_超声波焊接工具性能参数求解与参数图绘制

    1.焊接工具性能参数解决方案 #超声波焊接# 焊接工具的参数输入和溶液反馈界面,如图2所示. 该表格是使用Microsoft Excel电子表格软件进行编译和编程的.解决方案期间需要输入的基本信息包括 ...

  5. MATLAB数学建模-规划模型总结| MATLAB求解

    目录 1 线性规划问题(LP) 风格1 风格2 2 非线性规划 3 动态规划 A星算法 基于dijkstra的概率路线图 4 多目标规划 帕累托最优 支配(Dominace) 不可支配解集 帕累托最优 ...

  6. MATLAB粒子群算法求解带充电站(桩)的电动车辆路径规划EVRP问题代码实例

    MATLAB粒子群算法求解带充电站(桩)的电动车辆路径规划EVRP问题代码实例 问题实例描述: 现有一个配送中心需要向20个客户点进行送货.每个客户点有不同货物需求量和卸货服务时间.配送中心和客户点的 ...

  7. MATLAB遗传算法求解超市物流配送选址问题实例

    遗传算法编程问题实例: MATLAB遗传算法求解超市物流配送中心选址问题代码实例 添加链接描述 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表 ...

  8. MATLAB水母搜索算法求解超市物流配送选址问题代码实例

    MATLAB水母搜索算法求解超市物流配送选址问题实例 作者:麦哥 MATLAB水母搜索算法求解超市物流配送选址问题代码实例 水母搜索算法编程问题实例: 在范围为(0,0)到(100,100)的矩形区域 ...

  9. 经典汉诺塔问题的推理思路以及求解

    汉诺塔是递归中的一道经典题目,接着我们看如何求解以及求解的思路. 首先了解汉诺塔 汉诺塔是给定三根柱子,通过一次移动一片圆盘将一根柱上所有圆盘移到另外一根柱上 而当圆盘数>=2时我们就要借助另外 ...

最新文章

  1. 【神经网络】(14) MnasNet 代码复现,网络解析,附Tensorflow完整代码
  2. JAVA——开启多线程的方法汇总
  3. nextcloud php工程师,教你如何基于宝塔面板和nextcloud搭建自己的网盘
  4. PyCharm喜好设置
  5. WCF 第一章 基础 为一个ASMX服务实现一个WCF客户端
  6. HTML中的行内元素和框元素详解
  7. matlab工作区导入多个文件,MATLAB可以直接把Excel文件中的数据导入工作区中
  8. linux搭建sftp服务器
  9. matlab画矩阵中的两列,matlab 图例 两列
  10. 敲笨钟(古诗词押 ong 韵)
  11. Palantir早期员工、连续创业者Brien Colwell:创业动力源自创造文化
  12. beyond compare密钥
  13. 使用 mesh 实现多边形裁剪图片!Cocos Creator!
  14. 千元平板乐Pad A1完整拆解视频
  15. vue 实现 高德地图 api 掩模、定位、天气
  16. 怎么取消服务器账号密码,FTP怎样取消账号密码登陆?
  17. Jeff的错题集(九):奥利给!
  18. poj1015陪审团——DP+路径记录
  19. 第1期-软件测试-简历-正确编写测试简历的姿势
  20. [转]第一次用joomla做网站的一点感悟

热门文章

  1. PHP自学笔记(基础语法篇)
  2. FBX二进制文件格式规范
  3. 第一次学习Web的总结
  4. Android ImageView: resolveUri failed on bad bitmap uri
  5. 【2016-10-14收获】Cloud IDEs
  6. PDF如何编辑,怎样替换PDF页面
  7. 大数据24小时:孙彬出任乐视云新CEO,趣店数百万学生信息数据疑似泄露
  8. 程序员也懂浪漫,表白代码,你值得拥有 (html+css+js制作一个结婚邀请函)
  9. 年会邀请函如何制作?教你一分钟快速制作年会邀请函
  10. logstash解析iis日志