算法---使用牛顿迭代法求极值

def newtons(f, df, x0, e):
    """
    使用牛顿迭代法寻找函数f的零点
    参数:
    f: 目标函数,即要求零点的函数
    df: 目标函数f的导数函数
    x0: 迭代的初始值
    e: 误差容忍度,当计算得到的函数值与0的差值绝对值小于该值时,认为找到近似零点
    返回值:
    返回满足精度要求的近似零点对应的x值
    """
    # 检查初始值和误差容忍度是否合法
    if not isinstance(x0, (int, float)) or not isinstance(e, (int, float)):
        raise ValueError("初始值x0和误差容忍度e必须是数值类型")
    if e < 0:
        raise ValueError("误差容忍度e不能为负数")
    xn = float(x0)
    e_tmp = e + 1
    loop = 1
    while e_tmp > e:
        print('########loop' + str(loop))
        k = df(xn)
        xm = f(xn)
        print('xn=' + str(xn) + ',k=' + str(k) + ',y=' + str(xm))

        # 防止除数为0的情况,如果导数为0则无法继续迭代,这里做简单处理退出循环并返回当前xn
        if k == 0:
            print("导数为0,无法继续迭代,返回当前值")
            return xn
        q = xm / k
        xn = xn - q
        e_tmp = abs(0 - f(xn))
        print('new xn=' + str(xn) + ',e=' + str(e_tmp) + ',q=' + str(q))
        loop = loop + 1
    return xn
def f(x):
    """
    定义目标函数,这里是一个二次函数示例:f(x) = x ** 2 + 2 * x
    """
    return x ** 2 + 2 * x
def df(x):
    """
    定义目标函数f的导数函数,对于f(x) = x ** 2 + 2 * x,其导数为df(x) = 2 * x + 2
    """
    return 2 * x + 2
# 使用示例,调用newtons函数进行牛顿迭代计算
x = newtons(f, df, 3, 0.01)
print('the point you find is' + str(x))

返回结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luky!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值