Loading

【计算方法】01 - 二分法求利率(非线性方程求解)

【问题描述】如果在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()

 

posted @ 2019-12-27 15:29  江南笑书生  阅读(288)  评论(0编辑  收藏  举报