MATLAB实现一元三次方程求解/盛金公式

一元三次方程求解中,1945年卡尔丹诺把冯塔纳的三次方程求根公式发表出来,但该公式形式比较复杂,直观性也较差。1989年范盛金对一元三次方程求解进行了深入的研究和探索,提出了更加简洁实用的求解公式-盛金公式。这里对盛金公式进行简要的介绍,并给出MATLAB实现的具体代码和部分算例。参考资料:百度百科-卡尔丹公式;百度百科-盛金公式

一元三次方程求解–盛金公式

一元三次方程 ax3+bx2+cx+d=0ax^3 +bx^2+cx+d=0ax3+bx2+cx+d=0 重根判别式令A=b2−3acA=b^2-3acA=b2−3ac,B=bc−9adB=bc-9adB=bc−9ad,C=c2−3bdC=c^2-3bdC=c2−3bd总判别式Δ=B2−4AC\Delta=B^2-4ACΔ=B2−4AC

下面给出盛金判别法的结论

条件1 当A=B=0A=B=0A=B=0时:x1=x2=x3=−b3a=−cb=−3dcx1=x2=x3= \frac{-b}{3a}= \frac{-c}{b}= \frac{-3d}{c}x1=x2=x3=3a−b​=b−c​=c−3d​
条件2 当Δ=B2−4AC>0\Delta=B^2-4AC>0Δ=B2−4AC>0时:x1=−b−(Y13+Y23)3ax1= \frac{-b-(\sqrt[3]{Y1}+\sqrt[3]{Y2})}{3a}x1=3a−b−(3Y1​+3Y2​)​ x2=−b+0.5(Y13+Y23)+0.53(Y13−Y23)i3ax2=\frac{-b+0.5(\sqrt[3]{Y1}+\sqrt[3]{Y2})+ 0.5{\sqrt{3}} (\sqrt[3]{Y1}-\sqrt[3]{Y2})i}{3a}x2=3a−b+0.5(3Y1​+3Y2​)+0.53​(3Y1​−3Y2​)i​ x3=−b+0.5(Y13+Y23)−0.53(Y13−Y23)i3ax3=\frac{-b+0.5(\sqrt[3]{Y1}+\sqrt[3]{Y2})- 0.5{\sqrt{3}} (\sqrt[3]{Y1}-\sqrt[3]{Y2})i}{3a}x3=3a−b+0.5(3Y1​+3Y2​)−0.53​(3Y1​−3Y2​)i​其中,Y1=Ab+1.5a(−B+B2−4AC)Y1=Ab+1.5a({-B+\sqrt{B^2-4AC}})Y1=Ab+1.5a(−B+B2−4AC​),Y2=Ab+1.5a(−B−B2−4AC)Y2=Ab+1.5a({-B-\sqrt{B^2-4AC}})Y2=Ab+1.5a(−B−B2−4AC​)。
条件3 当Δ=B2−4AC=0\Delta=B^2-4AC=0Δ=B2−4AC=0时:x1=BA−bax1= \frac{B}{A}- \frac{b}{a}x1=AB​−ab​ x2=x3=−B2Ax2= x3= -\frac{B}{2A}x2=x3=−2AB​
条件4 当Δ=B2−4AC&lt;0\Delta=B^2-4AC&lt;0Δ=B2−4AC<0时:x1=−b−2Acosθ33ax1= \frac{-b-2\sqrt{A}cos{\frac{\theta}{3}}}{3a}x1=3a−b−2A​cos3θ​​ x2=−b+A(cosθ3+3sinθ3)3ax2= \frac{-b+\sqrt{A}(cos{\frac{\theta}{3}}+\sqrt{3}sin{\frac{\theta}{3}}) }{3a}x2=3a−b+A​(cos3θ​+3​sin3θ​)​ x3=−b+A(cosθ3−3sinθ3)3ax3= \frac{-b+\sqrt{A}(cos{\frac{\theta}{3}}-\sqrt{3}sin{\frac{\theta}{3}}) }{3a}x3=3a−b+A​(cos3θ​−3​sin3θ​)​ 其中,θ=arccos⁡T\theta=\arccos{T}θ=arccosT,T=2Ab−3aB2AAT=\frac{2Ab-3aB}{2A\sqrt{A}}T=2AA​2Ab−3aB​。
此外,推导得到的盛金定理表明任意实系数的一元三次方程都可以运用盛金公式解算
通过上述4个条件即可求得一元三次方程的所有根(实根和虚根)。

MATLAB代码-盛金公式

function x = Solve3Polynomial(a, b, c, d)
% 范盛金. 一元三次方程的新求根公式与新判别法[J]. 海南师范学院学报,1989,2(2):91-98.
A = b*b - 3*a*c;   if abs(A) < 1e-14;    A = 0;  end
B = b*c - 9*a*d;   if abs(B) < 1e-14;    B = 0;  end
C = c*c - 3*b*d;   if abs(C) < 1e-14;    C = 0;  end
DET = B*B - 4*A*C; if abs(DET) < 1e-14;  DET = 0;  end
if (A == 0) && (B == 0)x1 = -c/b;      x2 = x1 ;    x3 = x1;
end
if DET > 0Y1 = A*b + 1.5*a*(-B + sqrt(DET));Y2 = A*b + 1.5*a*(-B - sqrt(DET));y1 = nthroot(Y1,3);  y2 = nthroot(Y2,3);x1 = (-b-y1-y2)/(3*a);vec1 = (-b + 0.5*(y1 + y2))/(3*a);  vec2 = 0.5*sqrt(3)*(y1 - y2)/(3*a);x2 = complex(vec1, vec2);x3 = complex(vec1, -vec2);clear Y1 Y2 y1 y2 vec1 vec2;
end
if DET == 0 && (A ~= 0) && (B ~= 0)K = (b*c-9*a*d)/(b*b - 3*a*c); K = round(K,14);x1 = -b/a + K;   x2 = -0.5*K;   x3 = x2;
end
if DET < 0sqA = sqrt(A);T = (A*b - 1.5*a*B)/(A*sqA);theta = acos(T);csth  = cos(theta/3);sn3th = sqrt(3)*sin(theta/3);x1 = (-b - 2*sqA*csth)/(3*a);x2 = (-b + sqA*(csth + sn3th))/(3*a);x3 = (-b + sqA*(csth - sn3th))/(3*a);clear sqA T theta csth sn3th;
end
x = [x1;  x2;  x3];
end

值得说明的是:当得到的3个解中至少存在一个复数根时,matlab会将实数结果显示为a+0.0000000ia+0.0000000ia+0.0000000i的形式。

算例验证

算例1: x3+5.4x2+9.72x+5.832=0x^3+5.4x^2+9.72x+5.832=0x3+5.4x2+9.72x+5.832=0

参考值:x1=x2=x3=1.8x1=x2=x3=1.8x1=x2=x3=1.8

算例2: 2x3+11x2+182x+255=02x^3+11x^2+182x+255=02x3+11x2+182x+255=0

参考值:x1=−1.5;x2=−2+9i;x3=−2−9ix1=-1.5; x2=-2+9i;x3=-2-9ix1=−1.5;x2=−2+9i;x3=−2−9i

算例3: x3+5.5x2+9.92x+5.888=0x^3+5.5x^2+9.92x+5.888=0x3+5.5x2+9.92x+5.888=0

参考值:x1=−2.3;x2=x3=−1.6x1=-2.3; x2=x3=-1.6x1=−2.3;x2=x3=−1.6

算例4: 100x3−420x2+467x−105=0100x^3-420x^2+467x-105=0100x3−420x2+467x−105=0

参考值:x1=0.3;x2=2.5;x3=1.4x1=0.3; x2=2.5; x3=1.4x1=0.3;x2=2.5;x3=1.4

上述4个算例可以看出,MATLAB实现过程中基本无误。

MATLAB实现一元三次方程求解/盛金公式相关推荐

  1. 盛金公式解一元三次方程_盛金公式解一元三次方程

    Module Shengjin_mod Implicit None contains Function Cubic_equation(Co) Result (X) !盛金公式求解一元三次方程 !默认浮 ...

  2. 用盛金公式求解一元三次方程

    解一元三次方程一般用盛金公式求解,算法高效且求出来的解精确.     百度百科关于盛金公式有如下解释: 盛金公式 Shengjin's Formulas 一元三次方程aX^3+bX^2+cX+d=0, ...

  3. C# 盛金公式 求解一元三次方程

    class dd2{private static readonly double dsr3 = Math.Sqrt(3);// <summary>/// 盛金公式求解一元三次方程,ax^3 ...

  4. 一元三次方程求解(盛金公式)

    一元三次方程求解(盛金公式) #include<iostream> #include<cmath> #include<iomanip> using namespac ...

  5. NOIP 2001 一元三次方程求解(二分||盛金公式)

    题目描述 有形如:ax3+bx2+cx+d=0这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝 ...

  6. P1024 一元三次方程求解 牛顿迭代+盛金公式+二分+勘根定理

    P1024 一元三次方程求解 传送门 题目描述 有形如:ax^3+bx^2+cx^1+dx^0=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实 ...

  7. 洛谷 P1024 一元三次方程求解 (暴力 or 二分 or 盛金公式)

    P1024 一元三次方程求解 题意 有形如:ax3+bx2+cx+d=0ax^3+bx^2+cx+d=0ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,da, ...

  8. 有缺陷的一元三次方程求解设计(盛金公式)

    先放代码: #include <cmath> #include <iostream> //cube_sqrt.h double abs(double x) { if(x< ...

  9. 盛金公式解一元三次方程_【国际数学竞赛】高次方程求根

    对于一元二次方程 ,我们由求根公式可得: . 对于一元三次方程 ,我们有 卡尔丹公式法和盛金公式法.不过公式比较冗长.不易计算,但我们还是有方法计算的,那么如果是一元四次.一元五次甚至更高呢? 遇到高 ...

最新文章

  1. linux命令查看cpu负载,Linux下使用w命令和uptime命令查看系统负载
  2. 如何实现自由复制知乎文章?【1分钟掌握】
  3. 二维数组离散程度matlab,(十八)数据分析中的一些概念
  4. 清华王兴再抛神论:为什么教育决定着中国餐饮业质量?
  5. Golang笔记——go使用Redis
  6. Spring之数据源整理
  7. PHP+Mysql高并发解决方案
  8. 区块链技术从入门到精通教程
  9. Leftist Heaps 习题解
  10. Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足
  11. 【Pygame小游戏】真香~这款百万销量万人追捧大富翁游戏终于出现了~(赶紧来玩儿)
  12. 一个简单的马尔可夫过程例子
  13. AutoCAD中凸度的概念以及求圆弧的凸度
  14. 龙族幻想东京机器人一次_龙族幻想凌晨四点的东京机器人坐标-机器人刷新点_6137游戏网...
  15. Qt cef3 无边框程序最小化之后,再打开 hover 状态失效
  16. 原生JS 日期格式化 (形如yyyMMdd hh:mm:ss等)
  17. VS2008中开发手持终端程序(PDA软件)总结
  18. 让eclipse的主题变成黑色
  19. JavaScript学习总结(思维导图篇)
  20. 【设计模式之美 设计原则与思想:设计原则】23 | 实战一(上):针对业务系统的开发,如何做需求分析和设计?

热门文章

  1. excel数据核对技巧:如何用函数公式标识输入正误
  2. 从0到1:微信小程序自选股项目回忆录
  3. C# 数字转汉字(一二三)
  4. k8s 二进制集群部署
  5. 【python】HTTP压力测试过程中遇到的问题与解决方案
  6. 论文分享:大数据智能决策,《自动化学报》
  7. DaoCloud道客:云原生多云应用利器–Karmada总览篇
  8. Opencv实战(二) 文字区域的提取 (VS2013 + C++)
  9. 电容笔和Apple pencil的区别?适合ipad画画的电容笔推荐
  10. 涂鸦蓝牙SDK开发系列教程——8.Board API 说明