数值分析二分法做题

最近开启了研一阶段,在上数值分析的课。

课后习题需要用二分法求解近似值,以满足最大允许误差。

计算过程就想到用python偷个懒,不过我的代码质量是真的low,好久没用py好多知识都忘光了,不过亲测可用。

代码如下:

import math
import pprint

# 题目为用二分法求 x**3-2*x-5 在区间[2,3]上的根,要求误差不超过0.5/1000
# f(x) = pow(x,3) - 2*x - 5

a = 2  # 区间上限
b = 3  # 区间下限
e = 0.5 / 1000  # 允许误差


def jisuancishu(a1, b1, e1):
    err = math.log(e1, math.e)
    x = math.log(b1 - a1, math.e)
    t = math.log(2, math.e)
    m = (x - err) / t - 1
    if (m % 1 == 0): # 由于是误差可以取等号,考虑刚好相等的情况
        return int(m)
    else:
        return int(m) + 1


def sim(x):
    return pow(x,3) - 2*x - 5


num = jisuancishu(a, b, e)
print(num)
qujian = []
for i in range(1, num + 2):
    if i == 1:
        s1 = a
        s2 = b
        s3 = (s1 + s2) / 2
        qujian.append(f"{i},{s1, s2},{s3}")
    else:
        # 异号取前
        if sim(s3) * sim(s1) < 0:
            s2 = s3
            s3 = (s1 + s3) / 2
            # qujian.append(f"{i},{s1, s2},{s3},{s2 - s3}")
            qujian.append(f"{i},{s1, s2},{s3},{sim(s3)},{s2 - s3}")
        # 同号取后
        elif sim(s3) * sim(s1) > 0:
            s1 = s3
            s3 = (s2 + s3) / 2
            # qujian.append(f"{i},{s1, s2},{s3},{s2 - s3}")
            qujian.append(f"{i},{s1, s2},{s3},{sim(s3)},{s2 - s3}")
        elif sim(s3) == 0:
            # qujian.append(f"{i},{s1, s2},{s3},{s2 - s3}")
            qujian.append(f"{i},{s1, s2},{s3},{sim(s3)},{s2 - s3}")
            break


pprint.pprint(qujian)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值