首页 > 学院 > 开发设计 > 正文

二分搜索求利率近似解

2019-11-08 02:27:34
字体:
来源:转载
供稿:网友

问题背景:零存整取的保险利率求解

问题假设:因为不清楚真实的保险金额计算过程,所以假定为每年存入一定金额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;	}}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表