Skip to main content
Original186 words1 min

题解:AT_past202203_g 方程式

Summary

求五次方程 a 乘 x 的五次方加 b 乘 x 加 c 等于 0 在区间 (1,2) 内的唯一实根。由 a、b 均不小于 1 可推出导数恒大于 0,故函数严格单调递增,根左侧函数值为负、右侧为正。据此在 (1,2) 上二分,按中点处函数值的正负收缩区间,直到区间长度小于给定精度即得答案。

题意简述​

求解方程 ax5+bx+c=0ax^5+bx+c=0 在区间 (1,2)(1,2) 内的唯一解。

解题思路​

设函数 f(x)=ax5+bx+cf(x)=ax^5+bx+c,求导得 f′(x)=5ax4+bf'(x)=5ax^4+b。

由于题目中保证 a,b≥1a,b\ge 1,并且 x4≥0x^4\ge 0,因此可以得出 f′(x)>0f'(x)>0,说明 f(x)f(x) 是严格单调递增的函数。

设方程的根为 x0x_0,即满足 f(x0)=0f(x_0)=0,基于函数单调递增的性质,可以得到以下结论:

  • 若 f(x1)>0f(x_1)>0,则 x1>x0x_1>x_0;
  • 若 f(x1)<0f(x_1)<0,则 x1<x0x_1<x_0。

因此,可以使用二分法计算出答案。

参考代码​

377 Bcpp
#include <bits/stdc++.h>
using namespace std;

using ll=long long;
const double eps=1e-12;
ll a,b,c;
double f(double x)
{
return a*x*x*x*x*x+b*x+c;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>a>>b>>c;
double l=1,r=2;
while(r-l>eps)
{
double mid=(l+r)/2;
if(f(mid)>0)r=mid;
else l=mid;
}
cout<<fixed<<setprecision(12)<<l<<'\n';
return 0;
}