一、实验目的
1)初步掌握Python的应用
2)强化对迭代法的理解
3)掌握应用迭代法求解方程
的方法
二、实验内容
1)分析问题,确定迭代法应用中的初始条件和结束条件
2)用数学方法建立迭代关系式,并编写代码实现求解方程
3)用爬山法建立迭代关系式,并编写代码实现求解方程
三、实验原理
1)定点迭代法:
定点迭代法的核心思想是将求解方程 f(x) = 0 的问题,转化为寻找一个函数 g(x) 的不动点问题,即转化为等价形式 x = g(x)。这个不动点就是原方程的根。该方法从一个初始猜测值 x₀开始,通过迭代公式 xₙ₊₁ = g(xₙ) 产生一个序列 {x₀, x₁, x₂, …},如果该序列收敛于某个值a,且函数 g(x) 连续,则a就是方程 x = g(x) 的根,也就是原方程 f(x) = 0 的解。迭代过程需要设定一个结束条件,通常当两次迭代值的绝对误差xₙ₊₁- x或相对误差小于某个预设的精度阈值ε时停止。
该方法成功的关键在于迭代函数 g(x) 的构造。同一个方程 f(x)=0 可以构造出多种不同的 g(x) 形式,但并非所有形式都收敛。根据收敛定理,如果在一个包含根 α 的区间内,迭代函数 g(x) 的一阶导数满足 |g'(x)|< 1,那么迭代过程必定收敛。对于本实验的方程 x⁵ + x⁴+ eˣ – 11x + 1 = 0,可以尝试将其改写为诸如 x = (x⁵ + x⁴+ eˣ + 1)/11 等形式进行迭代。
2)爬山法:
爬山法是一种优化算法,其基本思想类似于通过不断向“更高处”(即函数的最大值)攀登来寻找最优解。
本实验中,我们将求解方程 f(x) = 0 的问题转化为一个优化问题:寻找 x 使得函数 F(x) = -f(x)的值最大。因为当 f(x) 无限接近于 0 时,F(x) 达到最大值。算法从初始点 x₀开始,在当前点的邻域内(如 x₀+ h 和 x₀- h,h为一个小的步长)探测函数值 F(x) 的变化。通过比较这三个点的函数值,判断“上山”的方向。如果 F(x₀+ h) 最大,则下一步移动到x₁= x₀+ h;如果 F(x₀- h) 最大,则移动到 x₁= x₀- h;如果 F(x₀) 最大,则说明可能位于山顶附近,可以缩小步长 h 以提高精度。重复此过程,直到步长 h 小于精度要求 ε,此时的 x 即为方程的近似根。
与需要推导和计算导数的梯度下降法不同,爬山法是一种直接搜索法,它只依赖函数值的比较,实现更简单直观,尤其适用于导数难以求解的情况。但它的收敛速度通常较慢,且参数(如初始步长)的选择对结果有较大影响。
四、实验步骤
1)分析实验要求,设置迭代法的初始点和结束条件
2)用数学方法建立迭代关系式,并编写代码完成方程求解
3)用爬山法建立迭代关系式,并编写代码完成方程求解
4)记录并分析实验结果
代码和执行结果展示:
1)实验核心代码分析如下:
①定点迭代法核心实现:
|
def fixed_point_iteration(x0, max_iter=100, tol=1e-8): x = x0 for i in range(1, max_iter+1): x_new = (x**5 + x**4 + math.exp(x) + 1.0) / 11.0 fx = f(x_new) if abs(x_new – x) < tol: break x = x_new return x_new, i |
定点迭代法通过将非线性方程转化为等价形式x=g(x),实现了高效的数值求解。该实现的核心在于精心设计的迭代公式x = (x⁵ + x⁴+ eˣ + 1)/11,该公式保证了在根附近|g'(x)|<1的收敛条件。收敛判断采用相邻迭代值差值的绝对值小于预设容差10^{-8},确保了高精度解的同时避免了无限迭代。异常处理机制则保证了数值稳定性,防止指数项溢出导致计算失败。
②爬山法核心实现:
|
def hill_climbing(x, f, delta=0.01, max_iter=100): for i in range(1, max_iter+1): current_f = abs(f(x)) right_f = abs(f(x + delta)) left_f = abs(f(x – delta)) if right_f < current_f: x += delta elif left_f < current_f: x -= delta else: break return x, i |
爬山法将方程求解转化为目标函数|f(x)|的最小化问题,采用局部搜索策略实现稳健求解。算法在当前位置向两侧试探,通过比较函数值选择移动方向,这种设计避免了对导数的计算需求,增强了算法的适用性。步长δ=0.01的选择平衡了搜索精度和收敛速度,而最大迭代次数限制则防止了无限循环。该实现特别适合导数难以计算或函数形态复杂的场景,展现了良好的鲁棒性。
③主函数控制逻辑:
|
def main(): initial_values = [-2, 0.5, 1.5] for i, x0 in enumerate(initial_values, 1): root_fp = fixed_point_iteration(x0) root_hc = hill_climbing(x0 + random.uniform(-0.1, 0.1), f) diff = abs(root_fp – root_hc) |
主函数设计了系统的实验框架,通过选择三个不同初始值[-2,0.5,1.5]实现了方程多根的全面搜索。对每种方法都采用相同的初始点进行求解,为方法比较提供了公平基准。特别为爬山法添加随机扰动,有效避免了局部最优陷阱。结果差异分析则通过计算两种方法解的绝对差值,为算法可靠性提供了量化评估依据,体现了严谨的实验设计思想。
2)结果展示如下图:

图 1 方程的解结果图
通过实验结果我们可以进行方法比较分析:
①定点迭代法:
优点: 实现简单,计算量小
缺点: 收敛速度较慢,对初始值敏感
②爬山法:
优点: 稳定性好,适用范围广
缺点: 收敛速度慢,需要选择合适的步长
最后总结可得到实验结论:通过本实验,我们掌握了使用迭代法求解非线性方程的方法。定点迭代法通过建立迭代关系式,逐步逼近方程的解。爬山法通过局部搜索,寻找函数值绝对值最小的点。两种方法都能有效求解非线性方程,但需要根据具体问题选择合适的方法。




