Python实现Rosenbrock函数最速下降法遇收敛问题求排查
问题分析与修复
你的代码存在两个关键问题,直接导致无法收敛和数值溢出:
固定海森矩阵的错误
你将H固定为初始点[0,0]处的海森矩阵,但公式中要求的H是当前迭代点x对应的海森矩阵。固定H会让步长alpha的计算完全脱离当前函数的曲率,无法引导x向极小值点收敛。迭代计数的语法错误
代码里的iter_count =+ 1是将iter_count赋值为1,而非累加计数。这会导致循环永远达不到iter_count < 10000的终止条件,最终因迭代次数过多触发数值溢出。
额外说明:你使用的步长公式(g^T g)/(g^T H g)属于牛顿法的步长形式,并非最速下降法的标准精确线搜索。如果要实现标准最速下降法,应该通过极小化一维函数来求解最优步长。
修复后的代码
方案1:修正海森矩阵与迭代计数(保留你的步长公式)
import numpy as np from scipy.optimize import rosen, rosen_der, rosen_hess x = np.array([-2, 2], dtype=np.float64) # 转为numpy数组,避免列表运算的类型问题 g = rosen_der(x) iter_count = 0 while np.linalg.norm(g) > 1e-10 and iter_count < 10000: H = rosen_hess(x) # 每次迭代获取当前点的海森矩阵 alpha = (g @ g) / (g @ H @ g) x = x - alpha * g g = rosen_der(x) iter_count += 1 # 正确累加迭代次数 print(f"收敛点:{x}") print(f"迭代次数:{iter_count}")
方案2:标准最速下降法(精确线搜索)
import numpy as np from scipy.optimize import rosen, rosen_der, minimize_scalar x = np.array([-2, 2], dtype=np.float64) g = rosen_der(x) iter_count = 0 while np.linalg.norm(g) > 1e-10 and iter_count < 10000: # 定义一维目标函数:寻找使f(x - alpha*g)最小的alpha def line_search_func(alpha): return rosen(x - alpha * g) # 用一维优化求解最优步长 search_result = minimize_scalar(line_search_func) alpha_opt = search_result.x x = x - alpha_opt * g g = rosen_der(x) iter_count += 1 print(f"收敛点:{x}") print(f"迭代次数:{iter_count}")
内容的提问来源于stack exchange,提问作者RookieJa
相关产品推荐
相关产品推荐

