【数学公式】一元三次方程求解

通用求根公式①

计算公式与步骤

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=54a39abc27a2d2n3
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(4ac3b2c218abcd+27a2d2+4b3d)
② 计算 m m m
∣ u + v ∣ ≥ ∣ u − v ∣ |u+v|\ge|u-v| u+vuv m = u + v 3 m=\sqrt[3]{u+v} m=3u+v
∣ u + v ∣ < ∣ u − v ∣ |u+v|<|u-v| u+v<uv m = u − v 3 m=\sqrt[3]{u-v} m=3uv

③ 计算 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=9a2mb23ac
∣ 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+23 i
w 2 = − 1 2 − 3 2 i w^2=-\frac{1}{2} - \frac{\sqrt{3}}{2} i w2=2123 i
那么根为:
x 1 = m + n − b 3 a x_1=m+n-\frac{b}{3a} x1=m+n3ab
x 2 = w m + w 2 n − b 3 a x_2=wm+w^2n-\frac{b}{3a} x2=wm+w2n3ab
x 3 = w 2 m + w n − b 3 a x_3=w^2m+wn-\frac{b}{3a} x3=w2m+wn3ab

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(x1)(x2)=1000 展开 x 3 − 3 x 2 + 2 x − 1000 = 1000 x^3-3x^2+2x-1000=1000 x33x2+2x1000=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=3a23acb2
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=27a327a2d9abc+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=32q+Δ
p 3 = − q 2 − Δ 3 p_3 = \sqrt[3]{-\frac{q}{2}-\sqrt{\Delta}} p3=32qΔ
④ 计算根
其中:
w = − 1 + 3 i 2 w=\frac{-1+\sqrt{3}i}{2} w=21+3 i
w 2 = − 1 − 3 i 2 w^2=\frac{-1-\sqrt{3}i}{2} w2=213 i
那么根为:

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(x1)(x2)=1000 展开 x 3 − 3 x 2 + 2 x − 1000 = 1000 x^3-3x^2+2x-1000=1000 x33x2+2x1000=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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值