洛谷 U658601 - 四次方程 题解

发表于
更新于
27 1.8~2.3 分钟 788

题目:U658601 四次方程 - 洛谷

前置知识(题目背景)

本题需要的前置知识如下:

1. 一元四次方程,是指含有一个未知数,未知数的最高次数为 4 的方程。通常形式为ax4+bx3+cx2+dx+e=0ax^4 + bx^3 + cx^2 + dx + e = 0

2. 对于函数f(x)f(x),求其导数函数过程如下:

f(x)f(x) 多项式的每一项,如果该项为常数,导数为00;否则,对于项axbax^b,其导数为baxb1bax^{b-1}。求出多项式每一项的导数后,将各项导数相加,即是多项式函数的导数,通常用f(x)f'(x) 表示。这一过程称为“求导”。

例如,对f(x)=3x2+2x+1f(x)=3x^2+2x+1 求导,首先对其每一项求导,得到6x6x2200,再将各项相加,得到其导数函数为f(x)=6x+2f'(x) = 6x + 2

3. 牛顿迭代法,又称牛顿—哈弗森方法,其求解方程f(x)=0f(x) = 0 的根的步骤为:

f(x)f'(x)f(x)f(x) 的导数,选取一个适当的初始值x0x_0,以以下公式进行迭代:

xn+1=xnf(xn)f(xn) x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

持续不断,直到xn=xn1x_{n} = x_{n-1} (在编程中可以认为是二者之差的绝对值小于某个误差值),则xnx_n 为方程f(x)=0f(x) = 0 的一个根。

题面

根据题目背景中的知识介绍,用牛顿迭代法实现一元四次方程ax4+bx3+cx2+dx+e=0ax^4 + bx^3 + cx^2 + dx + e = 0 的解。你只需要使用牛顿迭代法求出一个解即可。有如下约定:

1. 保证所求出方程的根是100100 -100 \sim 100 (包含两端)之间的实数。

2. 保证给出的方程左侧部分函数连续可导,并能使用牛顿迭代法求解。

3. 在使用牛顿迭代法的过程中,初始值x0x_0 统一从 1 开始。

4. 保证不存在e=0e = 0。如遇导数为 0 的情况,直接终止输出即可,不必考虑是否为正解。

5. 当xnxn1108|x_n - x_{n-1}| \leq 10^{-8} 时,认为xnx_n 是方程的根。

分析

本题是一道较简单的模拟题。只需理解牛顿迭代法的过程,从 1 开始迭代求解即可。

注意过程中要备份一份原来的 xx,再计算新的 xx,这样才能够将两者作差进行比较。

代码

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;

int main() {
    int a, b, c, d, e;
    scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
    double x = 1.0;
    double prev;
    do {
        prev = x;
        double f = a*x*x*x*x + b*x*x*x + c*x*x + d*x + e;
        double fp = 4*a*x*x*x + 3*b*x*x + 2*c*x + d;
        if (fp == 0) {
            break;
        }
        x = x - f / fp;
    } while (fabs(x - prev) > 1e-8);
    printf("%.3f\n", x);
    return 0;
}