一阶差分方程的C++递归算法(由房贷想到的)

来源:互联网 发布:mac excel vb 编辑:程序博客网 时间:2024/04/30 08:33

最近办公室的好多同志都在买房了,我了解了等月还款的方式。其实是一个一阶差分方程。
设总贷款数为y0,分n月换清,月利率为Rate,每月换M,那么得到以下递推公式:
第一月还款后:y1 = y0*(1+Rate)-M   还有y1这么多未还
第二月还款后:y2 = y1*(1+Rate)-M   还有y2这么多未还
...................................................
第k月后(k<n):yk = y(k-1)*(1+Rate)-M  其实这就是一阶差分方程。
...................................................
第n月后:     yn = y(n-1)*(1+Rate)-M  此时已经还完了,yn=0。
熟悉差分方程的,还是一阶的差分方程,可以很快写出公式。当然可以通过递推公式,从后面带入前面的公式,也可以找出规律,计算出公式:
M = y0*(1+Rate)^n/((1+Rate)^n-1)
不过这里,我想实现的,并不需要太多数学的知识,而是通过迭代公式,通过设定一个M的初始值,然后逐次逼近。以下是这个算法。

//total         贷款总数
//permonth      每月还款数
//rate          月利率
//count         总共还款次数(多少个月换)

float calculate(float total, float permonth, float rate, int count)
{
 if(count == 1)
  return total*(1.+rate) -permonth;
 else
  return calculate(total, permonth, rate, count-1)*(1.+rate) - permonth;
}

void main()
{
 float total = 100000.;     //假设贷款10W
 int count = 120;          //假设分10年还完 
 float permonth = total/count; //假设银行不收利息,得到初始值(不过银行是不会不收利息的,不过我们需要一个近似的值)
 float rate = 0.0513/12.;   //月利率
 float temp = 0;          
 int num = 0;
 while(true)
 {
  temp = calculate(total, permonth, rate,count);   //得到没有换完的数,根据这个值进行修正!
  num++;
  if(temp<1. && temp>-1.)
  {
   printf("%f ---------------%d/n",permonth, num);
   break;
  }
  else
   permonth += temp/count;                      //逐次修正这个值
 }
}

这样计算,是不是根本就不需要知道这个差发方程的公式呢!

 
原创粉丝点击