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

如何用梯度下降法求二次方程的根?已实现argmin求解存困惑

从二次函数的最小值点(argmin)求方程根的方法

你的代码通过梯度下降找到的是二次函数 f(x) = x² + 5x + 6 的最小值点(顶点)的x坐标,对于二次函数来说,我们可以利用顶点的信息反推方程 f(x)=0 的根,具体步骤如下:

原理说明

对于一般形式的二次函数 f(x) = ax² + bx + c:

  1. 梯度下降得到的最小值点记为 h(即你的代码返回的x),这是顶点的x坐标,满足 h = -b/(2a)
  2. 计算顶点处的函数值 k = f(h),也就是顶点的y坐标
  3. 二次函数的顶点式为 f(x) = a(x-h)² + k,令 f(x)=0,解方程可得:
    a(x-h)² + k = 0 → (x-h)² = -k/a → x = h ± √(-k/a)
    
    这两个x就是方程的根。

结合你的代码实现

在你的现有代码基础上,添加计算根的逻辑:

# x**2 + 5 * x + 6 = 0   roots: -3, -2

def grad(x):
    return 2 * x + 5

def grad_desc():
    x_old = float('inf')
    epsilon = 0.000001
    lr = 0.01
    x_new = 0
    while abs(x_new - x_old) > epsilon:
        x_old = x_new
        x_new -= lr * grad(x_new)
    return x_new

# 获取最小值点h
h = grad_desc()
# 定义原函数
def f(x):
    return x**2 +5*x +6
# 计算顶点处的函数值k
k = f(h)
# 二次项系数a
a = 1
# 计算根
sqrt_term = (-k / a)**0.5
root1 = h + sqrt_term
root2 = h - sqrt_term

print(f"近似根1: {root1}, 近似根2: {root2}")

运行这段代码后,会得到接近-2和-3的结果,梯度下降的精度越高(比如调小epsilon),根的近似值越准确。

注意事项

  • 只有当二次函数与x轴有交点时(即判别式 b²-4ac ≥0),这种方法才有实数根
  • 梯度下降得到的h是近似值,因此最终的根也是近似值,若需要更高精度,可以调整梯度下降的学习率、迭代终止条件,或者对得到的根用牛顿法进一步迭代优化

内容的提问来源于stack exchange,提问作者nameisnoname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:34:53