一、切割法Python实现
def secant_method(f, x0, x1, tol=1e-6, max_iter=100):
"""
割线法求解方程 f(x) = 0 的根
参数:
f: 目标函数
x0, x1: 初始猜测值
tol: 容差,默认1e-6
max_iter: 最大迭代次数,默认100
返回:
root: 方程的近似根
iterations: 迭代次数
"""
# 检查初始值是否已经满足条件
if abs(f(x0)) < tol:
return x0, 0
if abs(f(x1)) < tol:
return x1, 0
# 开始迭代
for i in range(max_iter):
# 计算函数值
f0 = f(x0)
f1 = f(x1)
# 避免除零错误
if abs(f1 - f0) < tol:
raise ValueError("函数值差异过小,可能导致除零错误")
# 割线法迭代公式
x2 = x1 - f1 * (x1 - x0) / (f1 - f0)
# 检查是否收敛
if abs(x2 - x1) < tol or abs(f(x2)) < tol:
return x2, i + 1
# 更新迭代点
x0, x1 = x1, x2
# 如果达到最大迭代次数仍未收敛
raise ValueError(f"在 {max_iter} 次迭代后未收敛")
# 示例:求解方程 x^3 - x - 1 = 0
def example_function(x):
return x**3 - x - 1
# 使用割线法求解
try:
root, iterations = secant_method(example_function, 1.0, 2.0)
print(f"方程的根为: {root:.6f}")
print(f"迭代次数: {iterations}")
print(f"函数值 f(root) = {example_function(root):.6e}")
except ValueError as e:
print(e)
二、二分法
2437

被折叠的 条评论
为什么被折叠?



