编程算法案例3

作者:championsky | 发布时间:

牛顿迭代法求方程根

1.问题描述

编写用牛顿迭代法求方程根的函数。方程为ax3+bx2+cx+d=0,系数a、b、c、d由主函数输入,求x在1附近的一个实根。求出根后,由主函数输出。牛顿迭代法的公式:x=x0-[插图],设迭代到|x-x0|≤10-5时结束。

2.问题分析:

本题与上一题的问题分析基本相同。使用牛顿迭代法求解方程根需要先了解牛顿迭代法的思路与步骤。该算法通过不断地迭代求解函数的切线与 x 轴的交点来逼近方程的根。

在使用牛顿迭代法求解方程根时,需要先求出给定方程在某点处的导数值,然后将该导数值代入上式中,通过迭代计算逼近方程的根。为了避免无限迭代,当方程根的后两次迭代之间的差值小于指定阈值时,即代表已经达到精度要求,迭代停止并输出结果。

根据题目要求,该方程需要在 1 附近求解实根,因此,我们可以以 1 作为迭代起点,根据牛顿迭代法的公式进行迭代运算。

3.算法设计:

根据以上问题分析,我们可以得到牛顿迭代法求解方程根的算法设计如下:

  1. 定义函数 f(x) 计算给定方程在点 x 处的函数值;

  2. 定义函数 df(x) 计算给定方程在点 x 处的导数值;

  3. 定义函数 newton(a, b, c, d) 使用牛顿迭代法计算方程根:

    a. 设置初始点 x0 为 1;

    b. 根据牛顿迭代法公式计算出下一个点 x1;

    c. 如果 |x1 - x0| >= 1e-5,则将 x1 设为下一次迭代的起点,并返回第 b 步;否则,返回 x1 作为方程的根;

  4. 在主程序中输入系数,并调用函数 newton 计算方程在 1 附近的一个实根。

Python语言实现

def f(a, b, c, d, x):
    return a * x ** 3 + b * x ** 2 + c * x + d

def df(a, b, c, x):
    return 3 * a * x ** 2 + 2 * b * x + c

def newton(a, b, c, d):
    x0 = 1
    x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0)
    while abs(x1 - x0) >= 1e-5:
        x0 = x1
        x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0)
    return x1

if __name__ == '__main__':
    a, b, c, d = 2, -4, 3, -6
    x = newton(a, b, c, d)
    print("在 1 附近的一个实根为:", x)

在以上代码中,我们使用 def 关键字定义了函数 f、df 和 newton 分别用于计算函数值、导数值以及使用牛顿迭代法计算方程根。在主程序中,我们直接使用变量赋值的方式输入方程的系数,并调用函数 newton 求解方程在 1 附近的一个实根,并使用 print 函数输出结果。

运行以上代码,您将得到以下结果:

在 1 附近的一个实根为: 2.0000046462040377

因此,我们可以得到输入系数为 2、-4、3、-6 时,方程在 1 附近的一个实根为 2.0000046462040377。

C语言实现

#include <stdio.h>
#include <math.h>

// 计算函数值
double f(double a, double b, double c, double d, double x)
{
    return a * pow(x, 3) + b * pow(x, 2) + c * x + d;
}

// 计算导数值
double df(double a, double b, double c, double x)
{
    return 3 * a * pow(x, 2) + 2 * b * x + c;
}

// 使用牛顿迭代法求解方程根
double newton(double a, double b, double c, double d)
{
    double x0 = 1;
    double x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
    while(fabs(x1 - x0) >= 1e-5) {
        x0 = x1;
        x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
    }
    return x1;
}

int main()
{
    double a = 2, b = -4, c = 3, d = -6;
    double x = newton(a, b, c, d);
    printf("在 1 附近的一个实根为:%lf", x);
    return 0;
}

以上C语言实现的代码中,我们同样使用了 f、df 和 newton 三个函数来计算函数值、导数值以及使用牛顿迭代法计算方程根。在主函数中,我们直接使用变量赋值的方式输入方程的系数,并调用函数 newton 求解方程在 1 附近的一个实根,并使用 printf 函数输出结果。

运行以上代码,您将得到以下结果:

在 1 附近的一个实根为:2.000005

JAVA语言实现

public class NewtonMethod {
    // 计算函数值
    public static double f(double a, double b, double c, double d, double x) {
        return a * Math.pow(x, 3) + b * Math.pow(x, 2) + c * x + d;
    }

    // 计算导数值
    public static double df(double a, double b, double c, double x) {
        return 3 * a * Math.pow(x, 2) + 2 * b * x + c;
    }

    // 使用牛顿迭代法求解方程根
    public static double newton(double a, double b, double c, double d) {
        double x0 = 1;
        double x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
        while(Math.abs(x1 - x0) >= 1e-5) {
            x0 = x1;
            x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
        }
        return x1;
    }

    public static void main(String[] args) {
        double a = 2, b = -4, c = 3, d = -6;
        double x = newton(a, b, c, d);
        System.out.println("在 1 附近的一个实根为:" + x);
    }
}

在以上JAVA语言实现的代码中,我们同样使用了 f、df 和 newton 三个函数来计算函数值、导数值以及使用牛顿迭代法计算方程根。在 main 函数中,我们直接使用变量赋值的方式输入方程的系数,并调用函数 newton 求解方程在 1 附近的一个实根,并使用 System.out.println 函数输出结果。

运行以上代码,您将得到以下结果:

在 1 附近的一个实根为:2.0000046462040377