通用求根公式①
计算公式与步骤
a
x
3
+
b
x
3
+
c
x
+
d
=
0
ax^3+bx^3+cx+d =0
ax3+bx3+cx+d=0
① 计算
u
u
u和
v
v
v
u
=
9
a
b
c
−
27
a
2
d
−
2
n
3
54
a
3
u =\frac {9abc-27a^2d-2n3} {54a^3}
u=54a39abc−27a2d−2n3
v
=
3
(
4
a
c
3
−
b
2
c
2
−
18
a
b
c
d
+
27
a
2
d
2
+
4
b
3
d
)
18
a
2
v =\frac{\sqrt{3(4ac^3-b^2c^2-18abcd+27a^2d^2+4b^3d)}} {18a^2}
v=18a23(4ac3−b2c2−18abcd+27a2d2+4b3d)
② 计算
m
m
m
当
∣
u
+
v
∣
≥
∣
u
−
v
∣
|u+v|\ge|u-v|
∣u+v∣≥∣u−v∣时
m
=
u
+
v
3
m=\sqrt[3]{u+v}
m=3u+v
当
∣
u
+
v
∣
<
∣
u
−
v
∣
|u+v|<|u-v|
∣u+v∣<∣u−v∣时
m
=
u
−
v
3
m=\sqrt[3]{u-v}
m=3u−v
③ 计算
n
n
n
当
∣
m
∣
≠
0
|m|\ne0
∣m∣=0时
n
=
b
2
−
3
a
c
9
a
2
m
n=\frac{b^2-3ac}{9a^2m}
n=9a2mb2−3ac
当
∣
m
∣
=
0
|m|=0
∣m∣=0时
n
=
0
n=0
n=0
④计算根
其中:
w
=
−
1
2
+
3
2
i
w=-\frac{1}{2} + \frac{\sqrt{3}}{2} i
w=−21+23i
w
2
=
−
1
2
−
3
2
i
w^2=-\frac{1}{2} - \frac{\sqrt{3}}{2} i
w2=−21−23i
那么根为:
x
1
=
m
+
n
−
b
3
a
x_1=m+n-\frac{b}{3a}
x1=m+n−3ab
x
2
=
w
m
+
w
2
n
−
b
3
a
x_2=wm+w^2n-\frac{b}{3a}
x2=wm+w2n−3ab
x
3
=
w
2
m
+
w
n
−
b
3
a
x_3=w^2m+wn-\frac{b}{3a}
x3=w2m+wn−3ab
C#代码
using System;
namespace SEUC
{
class Program
{
static void Main(string[] args)
{
double? x1 = 0;
double? x2 = 0;
double? x3 = 0;
double? x2i = 0;
double? x3i = 0;
SolveEquation.unaryCubic(1,-3,2,-1000,out x1,out x2,out x2i,out x3,out x3i);
Console.WriteLine($"x1={x1}");
string symbol2 = x2i > 0 ? "+" : "";
Console.WriteLine($"x2={x2}{symbol2}{x2i}i");
string symbol3 = x3i > 0 ? "+" : "";
Console.WriteLine($"x3={x3}{symbol3}{x3i}i");
Console.ReadLine();
}
}
/// <summary>
/// 通用求根公式
/// </summary>
class SolveEquation
{
/// <summary>
/// 三元一次方程
/// ax^3+bx^2+cx+d=0
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="c"></param>
/// <param name="d"></param>
/// <param name="x1">第一个根</param>
/// <param name="x2">第二个根实数部分</param>
/// <param name="x2i">第二个根虚数部分</param>
/// <param name="x3">第三个根实数部分</param>
/// <param name="x3i">第三个根虚数部分</param>
public static void unaryCubic(double a, double b, double c, double d, out double? x1, out double? x2, out double? x2i, out double? x3, out double? x3i)
{
x1 = null;
x2 = null;
x3 = null;
double uu = 9.0 * a * b * c -27.0 * a * a * d - 2.0 * b * b * b;
double ud = 54.0*a*a*a;
double u = uu / ud;
double vup = 3.0 * (4.0 * a * c * c * c - b * b * c * c - 18.0 * a * b * c * d + 27.0 * a * d * a * d + 4.0 * b * b * b * d);
double vd = 18.0 * a * a;
double vu = Math.Sqrt(vup);
double v = vu / vd;
double m = 0;
if (Math.Abs(u+v)>= Math.Abs(u - v))
{
m = Math.Pow(u + v, 1.0/3.0);
}
else
{
m = Math.Pow(u - v, 1.0/3.0);
}
double n = 0;
if (m!=0)
{
double nu = b*b - 3.0*a* c;
double nd = 9.0*a*a*m;
n = nu / nd;
}
else
{
n = 0;
}
double t = -b / (3.0 * a);
double aa = 1.0 / 2.0;
double bb = Math.Sqrt(3.0) / 2.0;
x1 = m + n + t;
x2 = -aa * m - aa * n + t;
x2i = bb * m - bb * n;
x3 = -aa * m - aa * n + t;
x3i = -bb * m + bb * n;
}
}
}
示例
例如: x ( x − 1 ) ( x − 2 ) = 1000 x(x-1)(x-2)=1000 x(x−1)(x−2)=1000 展开 x 3 − 3 x 2 + 2 x − 1000 = 1000 x^3-3x^2+2x-1000=1000 x3−3x2+2x−1000=1000
- a = 1 a=1 a=1
- b = − 3 b=-3 b=−3
- c = 2 c=2 c=2
-
d
=
−
1000
d=-1000
d=−1000
计算结果如下:
x1=11.03333321028806
x2=-4.01666660514403+8.631386417111793i
x3=-4.01666660514403-8.631386417111793i
一般的一元三次方程求解②
计算公式与步骤
a
x
3
+
b
x
3
+
c
x
+
d
=
0
ax^3+bx^3+cx+d =0
ax3+bx3+cx+d=0
① 计算
p
p
p和
q
q
q
p
=
3
a
c
−
b
2
3
a
2
p =\frac {3ac-b^2} {3a^2}
p=3a23ac−b2
q
=
27
a
2
d
−
9
a
b
c
+
2
b
3
27
a
3
q =\frac{27a^2d-9abc+2b^3} {27a^3}
q=27a327a2d−9abc+2b3
② 计算
Δ
\Delta
Δ
Δ = q 2 4 + p 3 27 \Delta = \frac{q^2}{4} + \frac{p^3}{27} Δ=4q2+27p3
- 当 Δ > 0 \Delta>0 Δ>0时有一个实根和两个共轭虚根
- 当 Δ = 0 \Delta=0 Δ=0时有三个实根。如果 q = q = 0 q=q=0 q=q=0,三个实根都相等;否则三个实根中有两个相等。
- 当 Δ < 0 \Delta<0 Δ<0时有三个不相等的实根
③ 计算
p
1
p_1
p1、
p
2
p_2
p2、
p
3
p_3
p3
p
1
=
−
b
3
a
p_1 = -\frac{b}{3a}
p1=−3ab
p
2
=
−
q
2
+
Δ
3
p_2 = \sqrt[3]{-\frac{q}{2}+\sqrt{\Delta}}
p2=3−2q+Δ
p
3
=
−
q
2
−
Δ
3
p_3 = \sqrt[3]{-\frac{q}{2}-\sqrt{\Delta}}
p3=3−2q−Δ
④ 计算根
其中:
w
=
−
1
+
3
i
2
w=\frac{-1+\sqrt{3}i}{2}
w=2−1+3i
w
2
=
−
1
−
3
i
2
w^2=\frac{-1-\sqrt{3}i}{2}
w2=2−1−3i
那么根为:
x
1
=
p
1
+
p
2
+
p
3
x_1=p_1 +p_2+p_3
x1=p1+p2+p3
x
2
=
p
1
+
w
p
2
+
w
2
p
3
x_2=p_1 +wp_2+w^2p_3
x2=p1+wp2+w2p3
x
3
=
p
1
+
w
2
p
2
+
w
p
3
x_3=p_1 +w^2p_2+wp_3
x3=p1+w2p2+wp3
C#代码
using System;
namespace SEUC
{
class Program
{
static void Main(string[] args)
{
double? x1 = 0;
double? x2 = 0;
double? x3 = 0;
double? x2i = 0;
double? x3i = 0;
SolveEquation.unaryCubic(1,-3,2,-1000,out x1,out x2,out x2i,out x3,out x3i);
Console.WriteLine($"x1={x1}");
string symbol2 = x2i > 0 ? "+" : "";
Console.WriteLine($"x2={x2}{symbol2}{x2i}i");
string symbol3 = x3i > 0 ? "+" : "";
Console.WriteLine($"x3={x3}{symbol3}{x3i}i");
Console.ReadLine();
}
}
/// <summary>
/// 通用求根公式
/// </summary>
public class SolveEquation
{
/// <summary>
/// 三元一次方程
/// ax^3+bx^2+cx+d=0
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="c"></param>
/// <param name="d"></param>
/// <param name="x1">第一个根</param>
/// <param name="x2">第二个根实数部分</param>
/// <param name="x2i">第二个根虚数部分</param>
/// <param name="x3">第三个根实数部分</param>
/// <param name="x3i">第三个根虚数部分</param>
public static void unaryCubic(double a, double b, double c, double d, out double? x1, out double? x2, out double? x2i, out double? x3, out double? x3i)
{
x1 = null;
x2 = null;
x3 = null;
double pu = 3 * a * c - b * b;
double pd = 3 * a * a;
double p = pu / pd;
double qu = 27 * a * a * d - 9 * a * b * c + 2 * b * b * b; ;
double qd = 27 * a * a * a; ;
double q = qu/qd;
double p1 = - b / (3.0 * a);
double delta = (q * q) / 4.0 + (p * p * p) / 27.0;
double delta2 = Math.Sqrt(delta);
//if (p2p3sqrt>0) //实根和两个共轭虚根。
//{
// p2p3 = Math.Pow(p2p3sqrt, 0.5);
//}
//else if (p2p3sqrt == 0) //有三个实根
//{
// p2p3 = 0;
//}
//else //有三个不相等的实根
//{
// p2p3 = Math.Pow(p2p3sqrt,0.5);
//}
double p2Sqrt3 = -q / 2.0 + delta2;
double p3Sqrt3 = -q / 2.0 - delta2;
double p2 = Math.Pow(p2Sqrt3, 1.0/3.0);
double p3 = Math.Pow(p3Sqrt3, 1.0/3.0);
double w1 = -1.0 / 2.0;
double w1i = Math.Sqrt(3.0) / 2.0;
// 1-3-2sqrt 3
double w2 = -1 / 2.0;
double w2i = - Math.Sqrt(3.0) / 2.0;
x1 = p1 + p2 + p3;
x2 = p1 + w1 * p2 + w2 * p3;
x2i = w1i * p2 + w2i * p3;
x3 = p1 + w2 * p2 + w1 * p3;
x3i = w2i * p2 + w1i * p3;
}
}
}
示例
例如: x ( x − 1 ) ( x − 2 ) = 1000 x(x-1)(x-2)=1000 x(x−1)(x−2)=1000 展开 x 3 − 3 x 2 + 2 x − 1000 = 1000 x^3-3x^2+2x-1000=1000 x3−3x2+2x−1000=1000
- a = 1 a=1 a=1
- b = − 3 b=-3 b=−3
- c = 2 c=2 c=2
-
d
=
−
1000
d=-1000
d=−1000
计算结果如下:
x1=11.033333210284283
x2=-4.016666605142142+8.631386417115063i
x3=-4.016666605142142-8.631386417115063i