非线性方程的解法1-1,1-2(python)

一. 二分法

【问题描述】如果在240个月内每月付款300美元,使用二分法在利率区间[a,b] 内,求能够满足在这240个月之后使本金和利息的总值达到50万美元的利率值,精确到小数点后第d位。

【输入形式】在屏幕上输入3个数,依次为利率区间左端点值a、右端点值b和精确到小数点后d位。各数间都以一个空格分隔。测试用例的输入满足:b>a>0, 1<=d<=8, d为正整数。

【输出形式】输出两行数据,第一行为迭代次数,第二行为求得的利率,保留d位小数。

【样例输入】

0.15 0.16 8

【样例输出】

20

0.15753931

【样例说明】输入:左端点值为0.15,右端点值为0.16,求得的利率精确到小数点后8位。输出:表示经 20 次迭代,求得满足条件的利率值为 0.15753931。

【评分标准】根据输入得到的输出准确

在这里插入代码片
import math
def f(x):
    P = 300
    N = 240
    A = 12*P/x*((1+x/12)**N-1)-500000
    return A
def bisect(a, b, acc):
    #二分法求根,a为区间左值b为右值,acc为小数点后的位数
    delta = 0.5 * 10 ** (-acc)
    #精度要求
    n = math.floor((math.log(b - a) - math.log(delta)) * 1.0 / math.log(2))
     #math.floor() np.floor() 向下取整
     #math.log() np.log() 求ln
    print(n)
    #输出迭代次数
    for k in range(n): # for k in range(10000)
        c = (a + b) / 2
        if f(c) == 0:
            break
        elif f(a) * f(c) < 0:
        # elif python语法
            b = c
            c = (a + b) / 2
        else:
            a = c
            c = (a + b) / 2
        temp = abs(b - a) / 2
        if temp < delta: #二分终止条件
            break
    return round(c, acc )
    # c保留acc位小数
def main():
    l, r, acc = input().split()
    l = float(l)
    r = float(r)
    acc = int(acc)
    ans =  bisect(l, r, acc)
    """
    arr = input().split()
    arr = np.array(arr, dtype=float) #列表转化array
    ans = bisect(l, r, acc)
    """
    print(ans)
if __name__ == '__main__':
    main()

二. 试值法

【问题描述】如果在240个月内每月付款300美元,使用试值法在利率区间[a,b] 内,求能够满足在这240个月之后使本金和利息的总值达到50万美元(允许误差范围为0.0001美元)的利率值,精确到小数点后第d位。

【输入形式】在屏幕上输入3个数,依次为利率区间左端点值a、右端点值b和精确到小数点后d位。各数间都以一个空格分隔。测试用例的输入满足:b>a>0, 1<=d<=8, d为正整数。

【输出形式】输出两行数据,第一行为迭代次数,第二行为求得的利率,保留d位小数。

【样例输入】

0.15 0.16 8

【样例输出】

5

0.15753931

【样例说明】输入:左端点值为0.15,右端点值为0.16,求得的利率精确到小数点后8位。输出:表示经5次迭代,求得满足条件的利率值为0.15753931。

【评分标准】根据输入得到的输出准确

import math
import numpy as np 
def f(x):
    P = 300
    N = 240
    A = 12*P/x*((1+x/12)**N-1)-500000
    return A
def false_position(a, b, acc):
    #a为区间左值b为右值,acc为小数点后的位数
    delta = 0.5 * 10 ** (-acc)
    #精度要求
    n = 0 #迭代次数
    err = 100000
    while ( (b-a) > delta and err > 0.0001 ):
    # python中用 and or, 而不是&& ||   
        c = b - f(b) * (b - a) / (f(b) - f(a))
        if f(c) == 0:
            break
        elif f(a) * f(c) < 0:
            b = c
            c = b - f(b) * (b - a) / (f(b) - f(a))
        else:
            a = c
            c = b - f(b) * (b - a) / (f(b) - f(a))
        err = abs(f(c))
        n=n+1
    print(n)
    return round(c, acc)
def main():
    l, r, acc = input().split()
    l = float(l)
    r = float(r)
    acc = int(acc)
    ans = false_position(l, r, acc)
    """
    arr = input().split()
    arr = np.array(arr, dtype=float) #列表转化array
    ans = bisect(l, r, acc)
    """
    print(ans)
if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值