You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:30:54