您的位置:首页 > 其它

二分搜索求利率近似解

2017-02-19 15:03 211 查看
问题背景:零存整取的保险利率求解

问题假设:因为不清楚真实的保险金额计算过程,所以假定为每年存入一定金额everyyear,在连续购买nbought年之后,再保障nwork-nbought年。在nwork年之内对被保险人有保障,(nbought<=nwork)。nwork年之后返还总金额totalmoney。

现在已知,nwork年后保险的返还总金额totalmoney和上述变量值,求解年化利率(当年的本金为上一年度本金与利息之和)。

问题求解:当然是二分查找了,在某一个给定的区间去搜索一个符合精度要求的利率,复杂度为O(log2(n))。

代码中的数据都是真实值,起初看到总的回报率超过了200%,我以为这真的是搞金融的良心发现了。得到计算结果后,我的心凉了一半,因为模拟得到的年化利率只有20%多,并不是非常高。况且考虑到货币贬值的影响,这种投资连抵消通货膨胀的作用都没有达到。

心塞~想去做金融

public class Main{
public static void main(String args[]){
double everyyear=480;
double totalmoney=20000;
int nbought=16;
int nwork=20;
double lilv=computelilv(everyyear,totalmoney,nbought,nwork);
System.out.println("年化:"+lilv);
}
static double computelilv(double everyyear,double totalmoney,int nbought,int nwork)
{
Double lixi=0.0;	//初始的利息与本金和为零
Double lilv=0.5;	//初始年化利率为0.5
double lowlimit=0,highlimit=1;	//利率上下界
do{
lixi=0.0;
for(int i=0;i<nbought;i++){
lixi+=(lixi+everyyear)*lilv;
}//在购买年限内,每年都投入本金,以复利方式计算利息
for(int i=0;i<(nwork-nbought);i++){
lixi+=lixi*lilv;
}//在保障年限内,不追加本金,复利计算利息
System.out.printf("%f %.8f\n", lixi,lilv);

if(lixi>totalmoney){
//根据二分法调整利率
highlimit=lilv;
lilv=(highlimit+lowlimit)/2;
}else{
lowlimit=lilv;
lilv=(highlimit+lowlimit)/2;
}
}while(Math.abs(lixi-totalmoney)>0.01);
//当真实的总金额与以猜测的利率生成的总金额的绝对差小于阈值时,停止迭代
return lilv;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分法 模拟近似