一元三次方程求解

2021-09-28 18:25:56 字數 2097 閱讀 6054

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...