一元二次、一元三次、一元四次方程的求根公式

代码用python写的。

一元二次方程:

def Quadratic(args):
    a,b,c=args
    D = cmath.sqrt(b**2-4*a*c)
    x1 = (-b+D)/(2*a)
    x2 = (-b-D)/(2*a)
    roots = [x1,x2]
    return roots

一元三次方程:

 

 

复制代码
def Cubic(args):
    a,b,c,d = args
    p = c/a-b**2/(3*a**2)
    q = d/a+2*b**3/(27*a**3)-b*c/(3*a**2)
    w = complex(-0.5,(3**0.5)/2)
    ww = complex(-0.5,-(3**0.5)/2)
    A = cmath.sqrt((q/2)**2+(p/3)**3)
    B = ThreeSquare(-q/2+A)
    C = ThreeSquare(-q/2-A)
    y1 = B+C
    y2 = w*B+ww*C
    y3 = ww*B+w*C
    D = b/(3*a)
    roots=[RoundAns(y1-D,6),RoundAns(y2-D,6),RoundAns(y3-D,6)]
    return roots
复制代码

一元四次方程:

 

 

for k=0,1,2,计算m

 如果三个m的值都为0,则

 否则的话,取|m|最大的那个k,并计算

 

复制代码
def Quartic(args):
    a,b,c,d,e = args
    P = (c**2+12*a*e-3*b*d)/9
    Q = (27*a*d**2+2*c**3+27*b**2*e-72*a*c*e-9*b*c*d)/54
    D = cmath.sqrt(Q**2-P**3)
    u = ThreeSquare(Q+D) if abs(Q+D)>=abs(Q-D) else ThreeSquare(Q-D)
    v = 0 if u==0 else P/u
    w = complex(-0.5,3**0.5/2)
    m = []
    M = []
    flag = 0
    roots = []
    for i in range(3):
        x = cmath.sqrt(b**2-8*a*c/3+4*a*(w**i*u+w**(3-i)*v))
        m.append(x)
        M.append(abs(x))
        if m == 0:
            flag=flag+1
    if flag == 3:
        mm = 0
        S = b**2-8*a*c/3
        T = 0
    else:
        t = M.index(max(M))
        mm = m[t]
        S = 2*b**2-16*a*c/3-4*a*(w**t*u+w**(3-t)*v)
        T = (8*a*b*c-16*a**2*d-2*b**3)/mm
    x1=(-b-mm+cmath.sqrt(S-T))/(4*a)
    x2=(-b-mm-cmath.sqrt(S-T))/(4*a)
    x3=(-b+mm+cmath.sqrt(S+T))/(4*a)
    x4=(-b+mm-cmath.sqrt(S+T))/(4*a)
    roots.append(x1)
    roots.append(x2)
    roots.append(x3)
    roots.append(x4)
</span><span style="color: #0000ff;">return</span> roots</pre>
复制代码

完整代码见:

https://github.com/Larissa1990/Solve-cubic-and-quartic-equations-with-one-unknown/blob/master/README.md

 

补充内容:

1.一元三次方程的求根公式的推导过程

标准的一元三次方程如式1所示

ax3+bx2+cx+d=0 (1)

y=xb3a,则可以将式1变换成如式2所示的缺项形式

y3+py+q=0 (2)

其中,p=cab23a2, q=da+2b327a3bc3a2。式2具有两个自由度,因此猜测方程一个根的形式如式3所示

y=u3+v3 (3)

令,A=u3,B=v3,则将该根带入式2可得

A3+B3+3AB(A+B)+p(A+B)+q=0 (4)

进而转换为如下方程组

{p=3ABq=(A3+B3)

根据这个方程组求A,B的时候,会得到一个以A3或者B3为变量的一元二次方程,进而可以得到A,B的值如式5所示

A,B=±(q2)2+(p3)3q23 (5)

因此,得到了式2的一个根,如式6所示

y1=(q2)2+(p3)3q23+(q2)2+(p3)3q23 (6)

我们知道,式2也可以写成的形式(yy1)(y2+Ey+F)=0,那么已经求出了y1,剩下两个根只需要解一个一元二次方程就可以了。求出了式2的三个根,再根据y=xb3a变换回去,就得到了一元三次方程标准形式的根。

posted @   南风小斯  阅读(12620)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示