二分搜索求利率近似解

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

问题假设:因为不清楚真实的保险金额计算过程,所以假定为每年存入一定金额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;itotalmoney){
				//根据二分法调整利率
				highlimit=lilv;
				lilv=(highlimit+lowlimit)/2;
			}else{
				lowlimit=lilv;
				lilv=(highlimit+lowlimit)/2;
			}
		}while(Math.abs(lixi-totalmoney)>0.01);
		//当真实的总金额与以猜测的利率生成的总金额的绝对差小于阈值时,停止迭代
		return lilv;
	}
}


你可能感兴趣的:(模拟求值)