如何用梯度下降法求二次方程的根?已实现argmin求解存困惑
从二次函数的最小值点(argmin)求方程根的方法
你的代码通过梯度下降找到的是二次函数 f(x) = x² + 5x + 6 的最小值点(顶点)的x坐标,对于二次函数来说,我们可以利用顶点的信息反推方程 f(x)=0 的根,具体步骤如下:
原理说明
对于一般形式的二次函数 f(x) = ax² + bx + c:
- 梯度下降得到的最小值点记为
h(即你的代码返回的x),这是顶点的x坐标,满足h = -b/(2a) - 计算顶点处的函数值
k = f(h),也就是顶点的y坐标 - 二次函数的顶点式为
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
相关产品推荐
相关产品推荐

