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

牛顿法求解一元二次方程根时如何确定初始值x0及Java实现

牛顿法求解二次方程根问题解答

1. 牛顿法初始值x0的确定方法

  • 针对你当前求解的二次方程a*x² + b*x + c = 0场景,优先选择离真实根较近的数值:如果提前知道根的大致取值范围,在范围内任选数值即可;如果不知道范围,可以先用二次方程求根公式的近似值作为初始值,也可以选择抛物线顶点位置偏移一定数值的点,比如 (-b)/(2*a) + 0.1,避开导数为0的顶点位置。
  • 核心避坑规则:不能选择导数f'(x)=0的点作为初始值,否则会出现除以0的运算错误;如果方程没有实根,牛顿法迭代会发散,迭代前可先判断判别式b*b - 4*a*c >= 0,确认有实根后再执行迭代逻辑。
  • 牛顿法本身具备二次收敛特性,只要初始值距离真实根足够近,收敛速度非常快,满足上述避坑条件的前提下,初始值的选择容错率很高。

2. 迭代逻辑实现与方法调用

首先修正你现有代码的一个小bug:你将x0定义为double类型,但用sc.nextInt()读取输入,会丢失精度且无法识别小数输入,需要改为sc.nextDouble()。
完整的迭代逻辑代码如下,直接在你现有main方法的输入逻辑后补充即可:

// 初始化当前迭代值为输入的初始值x0
double currentX = sc.nextDouble();
// 执行n次迭代
for (int i = 0; i < n; i++) {
    // 调用已定义的静态方法获取当前点的函数值和导数值
    double fx = function(a, b, c, currentX);
    double dfx = derivativeOfFunction(a, b, currentX);
    // 导数接近0时终止迭代,避免除以0异常
    if (Math.abs(dfx) < 1e-12) {
        System.out.println("当前迭代点导数接近0,无法继续执行迭代");
        return;
    }
    // 用牛顿迭代公式更新当前x值
    currentX = currentX - fx / dfx;
}
// 输出迭代n次后的结果
System.out.printf("迭代%d次后的根近似值为:%.6f", n, currentX);
// 关闭Scanner资源
sc.close();

调用逻辑说明:每次迭代时直接将a、b、c以及当前迭代的x值作为参数传入两个已定义的静态方法,即可拿到对应点的函数值和导数值,代入牛顿迭代公式完成x的更新即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:03