a*x^3+b*x^2+c*x+d=0
#include#include#includeusing namespace std;
const double pi = acos(-1.0);
double a,b,c,d;
double r,m;
double f(double x)
//解一元三次方程組 a*x^3+b*x^2+c*x+d=0 ,解的上下界為min_ans,max_ans
①:當a=b=0時,方程有乙個三重實根;
②:當δ=b2-4ac>0時,方程有乙個實根和一對共軛虛根;
③:當δ=b2-4ac=0時,方程有三個實根,其中有乙個兩重根;
④:當δ=b2-4ac<0時,方程有三個不相等的實根。
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define clear(x) memset(x,0,sizeof(x))
#define fup(i,a,b) for(int i=a;ib;i--)
#define rfdn(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const int maxn = 1e+2;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1.0);
const double eps = 1e-3;
double a,b,c,d;
/**盛金公式*/
int main()
else if(del==0)else if(del<0)
printf("%.2lf %.2lf %.2lf\n",x1,x2,x3);
return 0;
}
首先 f(x)=ax3+bx2+cx+d 求導得到 df/dx=3ax2+2bx+c
求這個導數的零點(就是二次函式求根公式了)得到f(x)的最值點
最值點組成的三個區間一定各有乙個f(x)零點,使用牛頓迭代法求得這個零點即可
牛頓迭代法就是不停的用乙個點的切線擬合曲線,那個點的導數就是切線斜率
依次類推,可以得到求高次函式零點的一種迭代法:
求n次函式零點,需要極值點來劃分區間,也就需要求其導數(n-1次函式)的零點,依次迭代到n=2直接通過公式(當然n=3或4也可以)
最後的複雜度依賴於求零點演算法的複雜讀
#include #include #include #include #include using namespace std;
const double eps=1e-3;
double a,b,c,d;
inline double f(double x)
inline double df(double x)
double sol(double l,double r)
return x;
}int main(int argc, const char * ar**)
由代數基本定理加上數學歸納法可推出其能分解成a(x-x1)(x-x2)(x-x3)的形式(x1,x2,x3∈複數域)
x1x2x3=-(d/a)
x1x2+x2x3+x1x3=c/a
x1+x2+x3=-b/a
這就是三次方程時的韋達定理
一元三次方程求解
有形如 ax 3 bx 2 cx d 0這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點後2位。輸入有多行測試資料...
一元三次方程求解
問題描述 有形如 ax 3 bx 2 cx d 0 這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d 均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求三個實根。輸入格式 四個實數 a,b,c,d 輸出格式 由小到大依次在同一行輸出這...
一元三次方程求解
有形如 ax3 bx2 cx d 0 這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d 均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點後2位。輸入格式 一行,4...