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)) 返回结果: