一元四次方程

一元四次方程

只含有一個未知數,並且未知數項的最高次數是4的整式方程叫做一元四次方程。它的一般式為ax^4+bx³+cx²+dx+e=0(a≠0)

滿足條件

一元四次方程 一元四次方程

一元四次方程必須滿足以下三個條件:

①是整式方程,即等號兩邊都是整式;方程中如果有分母,且未知數在分母上,那么這個方程就是分式方程, 不是一元四次方程;方程中如果有根號,且未知數在根號內,那么這個方程也 不是一元四次方程,這點請注意!

②只含有一個未知數;

③未知數項的最高次數是4(即a≠0)。

註:如果方程滿足條件①,化簡後不滿足條件②和③,則該方程 不是一元四次方程

方程形式

一般形式

一元四次方程的四個根(root) 一元四次方程的四個根(root)

通常我們也把它寫成4次項係數為1的形式。

常用解法

費拉里法

一元四次方程 一元四次方程

方程兩邊同時除以最高次項的係數可得 (1)

一元四次方程 一元四次方程

移項可得 x +bx =-cx -dx-e (2) 兩邊同時加上 ,可將(2)式左邊配成完全平方,

一元四次方程 一元四次方程

方程成為 (3)

一元四次方程 一元四次方程

在(3)式兩邊同時加上

可得

一元四次方程 一元四次方程

(4)

(4)式中的y是一個參數。當(4)式中的x為原方程的根時,不論y取什麼值,(4)式都應成立。

一元四次方程 一元四次方程

特別,如果所取的y值使(4)式右邊關於x的二次三項式也能變成一個完全平方式,則對(4)對兩邊同時開方可以得到次數較低的方程。 為了使(4)式右邊關於x的二次三項式也能變成一個完全平方式,只需使它的判別式變成0,即 (5)

這是關於y的一元三次方程,可以通過塔塔利亞公式來求出y應取的實數值。

把由(5)式求出的y值代入(4)式後,(4)式的兩邊都成為完全平方,兩邊開方,可以得到兩個關於x的一元二次方程。

解這兩個一元二次方程,就可以得出原方程的四個根。

費拉里發現的上述解法的創造性及巧妙之處在於:第一次配方得到(3)式後引進參數y,並再次配方把(3)式的左邊配成含有參數y的完全平方,即得到(4)式,再利用(5)式使(4)的右邊也成為完全平方,從而把一個一元四次方程的求解問題化成了一個一元三次方程及兩個一元二次方程的求解問題。 不幸的是,就象塔塔利亞發現的一元三次方程求根公式被誤稱為卡當公式一樣,費拉里發現的一元四次方程求解方法也曾被誤認為是波培拉發現的

笛卡爾法

一般的四次方程還可以待定係數法解,這種方法稱為笛卡爾法,由笛卡爾於1637年提出。

先將四次方程化為x +ax +bx +cx+d=0的形式。

一元四次方程 一元四次方程

令 ,整理後得到y +py +qy+r=0(1)

設y +py +qy+r=(y +ky+t)(y -ky+m)=y +(t+m-k )y +k(m-t)y+tm

比較dy對應項係數,得t+m-k =p,k(m-t)=q,tm=r

一元四次方程 一元四次方程
一元四次方程 一元四次方程

設k≠0,把t和m當作未知數,解前兩個方程,得 ,

一元四次方程 一元四次方程

再代入第三個方程,得 。即k +2pk +(p -4r)k -q =0

解這個方程,設k是它的任意一根,t和m是k=k時t和m的值那么方程(1)就成為

(y +ky+t)(y -ky+m)=0

一元四次方程 一元四次方程

解方程y +ky+t=0和y -ky+m=0就可以得出方程(1)的四個根,各根加上 就可以得出原方程的四個根。

計算公式

費拉里法

一元四次方程 一元四次方程

費拉里法求解一元四次方程 的步驟如下

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

或 (取模較大的數值)

一元四次方程 一元四次方程

(若 u 為零,則 v 也取值為零)

y有三種取值

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

上面兩個公式中, ,

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

將 分別代入 ,就能得到三組(y,m)。請選擇 最大或 的一組作為 y,m 的數值。

若m=0則一元四次方程有兩對重根,計算公式如下:

一元四次方程 一元四次方程
一元四次方程 一元四次方程

若 m 不等於零,則一元四次方程的求根公式如下:

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

算例1:

一元四次方程 一元四次方程

上式中 ,可算得

一元四次方程 一元四次方程
一元四次方程 一元四次方程

y 取 時,m = 0。這個 y 不合適,換一個再試試

一元四次方程 一元四次方程
一元四次方程 一元四次方程

y 取 時, 可算得四個根為

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

算例2: 即

一元四次方程 一元四次方程

上式中 ,可算得

一元四次方程 一元四次方程
一元四次方程 一元四次方程

y 有三重根 ,可算得 m = 0。

因此,一元四次方程有兩對重根,即

一元四次方程 一元四次方程
一元四次方程 一元四次方程

求根公式(費拉里法)

一元四次方程 一元四次方程

對費拉里計算方法整理後,即可得到一元四次方程 的求根公式

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

或 (取模較大的數值)

一元四次方程 一元四次方程

(若 u 為零,則 v 也取值為零)

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

上面三個公式中的 k 可取值1,2,3,用來區別費拉里法中一元三次方程的三個根。請選擇最大的那組(m,S,T)。

一元四次方程 一元四次方程

如果的最大值仍為零,則 m,S,T 的數值按下面三個公式計算

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

一元四次方程的四個根為:

一元四次方程 一元四次方程

求根公式(planetmath)

一元四次方程 一元四次方程

網站planetmath.org上列出了方程的求根公式

查看這個公式,需要非常的耐心和細心。將其分拆後,可以得到如下公式:

一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程
一元四次方程 一元四次方程

四個根為(n = 1,2,3,4)

一元四次方程 一元四次方程

可見,這個公式是“求根公式(費拉里法)”的一個特例。

這個公式不僅複雜,而且有很多問題:

一元四次方程 一元四次方程
一元四次方程 一元四次方程

1、當時 會計算失敗;

一元四次方程 一元四次方程

2、當時,求根計算會失敗。

計算程式代碼

費拉里法(VC++)

#include <math.h> #include <float.h> #include <complex.h> /******************************************************************************\ 對一個複數 x 開 n 次方 \******************************************************************************/ std::complex<double> sqrtn(const std::complex<double>&x,double n) { double r = _hypot(x.real(),x.imag()); //模 if(r > 0.0) { double a = atan2(x.imag(),x.real()); //輻角 n = 1.0 / n; r = pow(r,n); a *= n; return std::complex<double>(r * cos(a),r * sin(a)); } return std::complex<double>(); } /******************************************************************************\ 使用費拉里法求解一元四次方程 a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 \******************************************************************************/ void Ferrari(std::complex<double> x[3] ,std::complex<double> a ,std::complex<double> b ,std::complex<double> c ,std::complex<double> d ,std::complex<double> e) { a = 1.0 / a; b *= a; c *= a; d *= a; e *= a; std::complex<double> P = (c * c + 12.0 * e - 3.0 * b * d) / 9.0; std::complex<double> Q = (27.0 * d * d + 2.0 * c * c * c + 27.0 * b * b * e - 72.0 * c * e - 9.0 * b * c * d) / 54.0; std::complex<double> D = sqrtn(Q * Q - P * P * P,2.0); std::complex<double> u = Q + D; std::complex<double> v = Q - D; if(v.real() * v.real() + v.imag() * v.imag() > u.real() * u.real() + u.imag() * u.imag()) { u = sqrtn(v,3.0); } else { u = sqrtn(u,3.0); } std::complex<double> y; if(u.real() * u.real() + u.imag() * u.imag() > 0.0) { v = P / u; std::complex<double> o1(-0.5,+0.86602540378443864676372317075294); std::complex<double> o2(-0.5,-0.86602540378443864676372317075294); std::complex<double>&yMax = x[0]; double m2 = 0.0; double m2Max = 0.0; int iMax = -1; for(int i = 0;i < 3;++i) { y = u + v + c / 3.0; u *= o1; v *= o2; a = b * b + 4.0 * (y - c); m2 = a.real() * a.real() + a.imag() * a.imag(); if(0 == i || m2Max < m2) { m2Max = m2; yMax = y; iMax = i; } } y = yMax; } else {//一元三次方程,三重根 y = c / 3.0; } std::complex<double> m = sqrtn(b * b + 4.0 * (y - c),2.0); if(m.real() * m.real() + m.imag() * m.imag() >= DBL_MIN) { std::complex<double> n = (b * y - 2.0 * d) / m; a = sqrtn((b + m) * (b + m) - 8.0 * (y + n),2.0); x[0] = (-(b + m) + a) / 4.0; x[1] = (-(b + m) - a) / 4.0; a = sqrtn((b - m) * (b - m) - 8.0 * (y - n),2.0); x[2] = (-(b - m) + a) / 4.0; x[3] = (-(b - m) - a) / 4.0; } else { a = sqrtn(b * b - 8.0 * y,2.0); x[0] = x[1] = (-b + a) / 4.0; x[2] = x[3] = (-b - a) / 4.0; } }

驗算代碼(VC++)

void Test_QuarticEquation() { std::complex<double> x[4]; std::complex<double> x1(2.0,0.0); //隨便填 std::complex<double> x2(2.0,0.0); //隨便填 std::complex<double> x3(2.0,0.0); //隨便填 std::complex<double> x4(2.0,0.0); //隨便填 std::complex<double> a ( 1.0,0.0); //隨便填(不為零即可) std::complex<double> b = a * (-x1-x2-x3-x4); std::complex<double> c = a * (x1 * x2 + x1 * x3 + x1 * x4 + x2 * x3 + x2 * x4 + x3 * x4); std::complex<double> d = a * (-x2 * x3 * x4 - x1 * x3 * x4 - x1 * x2 * x4 - x1 * x2 * x3); std::complex<double> e = a * (x1 * x2 * x3 * x4); Ferrari(x,a,b,c,d,e); //驗證費拉里法 }

相關詞條

相關搜尋

熱門詞條

聯絡我們