题目描述
有形如:ax^3+bx^2+cx^1+dx^0=0ax3+bx2+cx1+dx0=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,da,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100−100至100100之间),且根与根之差的绝对值\ge 1≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后22位。
提示:记方程f(x)=0f(x)=0,若存在22个数x_1x1和x_2x2,且x_1<x_2x1<x2,f(x_1) \times f(x_2)<0f(x1)×f(x2)<0,则在(x_1,x_2)(x1,x2)之间一定有一个根。
输入输出格式
输入格式:
一行,3个实数A,B,C,D。
输入格式:
一行,3个实根,并精确到小数点后22位。
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
double a, b, c, d;
double fun(double x)
{
double res = x*(x * (a * x + b) + c) + d;
return res;
}
double daofun(double x)//导数
{
double res = 3*a*x*x + 2 * b * x + c;
return res;
}
double solve(double x)//牛顿迭代
{
double x0;
double x1 = x;
do
{
x0 = x1;
x1 = x0 - fun(x0)/daofun(x0);
}while(fabs(x1 - x0) >= 1e-6);
return x1;
}
int main()
{
cin>>a>>b>>c>>d;
for(int i = -100; i <= 100; i++)
{
double left = i;
double right = i + 1;//lef和right选择长度为1的区间
if(fun (left ) == 0)
{
printf("%.2f ", left);
}
else if(fun(left ) * fun( right) < 0)
{
double jie = solve(right);//迭代的初始点从右端开始
printf("%.2f ", jie);
}
}
//system("pause");
}