洛谷 U658601 - 四次方程 题解
前置知识(题目背景)
本题需要的前置知识如下:
1. 一元四次方程,是指含有一个未知数,未知数的最高次数为 4 的方程。通常形式为。
2. 对于函数,求其导数函数过程如下:
取 多项式的每一项,如果该项为常数,导数为;否则,对于项,其导数为。求出多项式每一项的导数后,将各项导数相加,即是多项式函数的导数,通常用 表示。这一过程称为“求导”。
例如,对 求导,首先对其每一项求导,得到、 和,再将各项相加,得到其导数函数为。
3. 牛顿迭代法,又称牛顿—哈弗森方法,其求解方程 的根的步骤为:
令 为 的导数,选取一个适当的初始值,以以下公式进行迭代:
持续不断,直到(在编程中可以认为是二者之差的绝对值小于某个误差值),则 为方程 的一个根。
题面
根据题目背景中的知识介绍,用牛顿迭代法实现一元四次方程 的解。你只需要使用牛顿迭代法求出一个解即可。有如下约定:
1. 保证所求出方程的根是 (包含两端)之间的实数。
2. 保证给出的方程左侧部分函数连续可导,并能使用牛顿迭代法求解。
3. 在使用牛顿迭代法的过程中,初始值 统一从 1 开始。
4. 保证不存在。如遇导数为 0 的情况,直接终止输出即可,不必考虑是否为正解。
5. 当 时,认为 是方程的根。
分析
本题是一道较简单的模拟题。只需理解牛顿迭代法的过程,从 1 开始迭代求解即可。
注意过程中要备份一份原来的 ,再计算新的 ,这样才能够将两者作差进行比较。
代码
#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;
}