P1024 [NOIP2001 提高组] 一元三次方程求解

#include
using namespace std;
 
double a, b, c, d;
double x1, x2, x3,p,q;
double f(double x) { return a * x * x * x + b * x * x + c * x + d; }
double df(double x) { return 3 * a * x * x + 2 * b * x + c; }
//切线方程为y=f'(x0)(x-x0)+f(x0);
//令y=0 ——>x = x0 - f(x0) / f'(x0)
 
void bs(double l, double r)
{
    double x=0, x0 = (l + r) / 2;//牛顿迭代法中,x0任意取,作为初始近似值,每次求出切线和此切线与x轴的交点,对此点(x,f(x))继续求切线,不断迭代。
    while (fabs(x0 - x) > 1e-4)
        x = x0 - f(x0) / df(x0), swap(x0, x);
        //x0为上一次切线与X轴交点的横坐标
        //x是由x0迭代求出的横坐标。每次swap,不断更新x0和x。不断迭代。
    printf("%.2f ", x);
}
 
int main(){
    
    cin >> a >> b >> c >> d;
    p = (-b - sqrt(b * b - 3 * a * c)) / 3*a;//较小的极值点
    q= (-b +sqrt(b * b - 3 * a * c)) / 3*a;//较大的极值点
    bs(-100, p);
    bs(p, q);
    bs(q, 100);
    return 0;
}

你可能感兴趣的:(c++)