【问题描述】如果在240个月内每月付款300美元,求解满足全部年金A为500000美元的利率I的近似值(精确到小数点后10位)
【输入形式】在屏幕上输入3个数,分别表示左端点值、右端点值和精确到小数点后的位数。各数间都以一个空格分隔。
【输出形式】第一行输出迭代次数,第二行输出利率(精确到小数点后11位)
【样例输入】
0.15 0.16 10
【样例输出】
27
0.15753931027
【样例说明】输入:左端点值为0.15,右端点值为0.16,求得的利率精确到小数点后10位。输出:第一行为迭代次数27次,第二行为求得的利率为0.15753931027
【评分标准】根据输入得到的输出准确
# -*- coding: utf-8 -*-
# 第一次作业 - 二分法求利率(非线性方程求解)
import math
def f(x):
p=300
n=240
A=12*p*((1+x/12)**n-1)/x-500000
return A
def regula(a, b, accuracy):
delta = 0.5 * 10**(-accuracy)
n = math.floor( (math.log(b-a) - math.log(delta))*1.0 / math.log(2) )
if f(a) * f(b) > 0 :
print("ya,yb are not suitable ")
return
for k in range(1000000):
c = (a + b) / 2
if f(c) == 0:
break
elif f(a)*f(c) < 0:
b = c
c = (a + b) / 2
else:
a = c
c = (a + b) / 2
err = abs(b - a) / 2
if err < delta:
break
# print(k+1)
return (n, round(c, accuracy+1))
def main():
left, right, accuracy = input().split()
left = float(left)
right = float(right)
accuracy = int(accuracy)
result = regula(left, right, accuracy)
print(result[0])
print(result[1])
if __name__ == '__main__':
main()