用盛金公式求解一元三次方程
解一元三次方程一般用盛金公式求解,算法高效且求出来的解精确。
百度百科关于盛金公式有如下解释:
盛金公式
Shengjin's Formulas
一元三次方程aX^3+bX^2+cX+d=0,(a,b,c,d∈R,且a≠0)。
重根判别式:A=b^2-3ac;B=bc-9ad;C=c^2-3bd,
总判别式:Δ=B^2-4AC。
当A=B=0时,盛金公式①:
X⑴=X⑵=X⑶=-b/(3a)=-c/b=-3d/c。
当Δ=B^2-4AC>0时,盛金公式②:
X⑴=(-b-Y⑴^(1/3)-Y⑵^(1/3))/(3a);
X(2,3)=(-2b+Y⑴^(1/3)+Y⑵^(1/3))/(6a)±i3^(1/2)(Y⑴^(1/3)-Y⑵^(1/3))/(6a),
其中Y(1, 2)=Ab+3a(-B±(B^2-4AC)^(1/2))/2,i^2=-1。
当Δ=B^2-4AC=0时,盛金公式③:
X⑴=-b/a+K;X⑵=X⑶=-K/2,
其中K=B/A,(A≠0)。
当Δ=B^2-4AC<0时,盛金公式④:
X⑴=(-b-2A^(1/2)cos(θ/3))/(3a);
X(2,3)=(-b+A^(1/2)(cos(θ/3)±3^(1/2)sin(θ/3)))/(3a),
其中θ=arccosT,T=(2Ab-3aB)/(2A^(3/2)),(A>0,-1<T<1)。
盛金判别法
Shengjin's Distinguishing Means
①:当A=B=0时,方程有一个三重实根;
②:当Δ=B^2-4AC>0时,方程有一个实根和一对共轭复根;
③:当Δ=B^2-4AC=0时,方程有三个实根,其中有一个两重根;
④:当Δ=B^2-4AC<0时,方程有三个不相等的实根。
个人实现的代码实现如下:
#include <cmath>
using namespace std;
#define ZERO 1e-6
#define ISZERO(Value) ((-1.0f * ZERO < (Value)) && ((Value) < 1.0f * ZERO))
#define LESSTHANZERO(Value) ((Value) < ZERO)
#define GREATERTHANZERO(Value) (ZERO < (Value))
#define ISBETWEEN(Value, Value1, Value2) (GREATERTHAN(Value, MIN(Value1, Value2)) && LESSTHAN(Value, MAX(Value1, Value2)))
typedef double RealNum;
typedef struct tagComplex
{
RealNum real;
RealNum image;
}Complex;
//rA * (X ^3) + rB * (X ^ 2) + rC * (X) + rD = 0
int Shengjin(RealNum rA, RealNum rB, RealNum rC, RealNum rD, RealNum* rX1, RealNum* rX2, RealNum* rX3)
{
RealNum fDA = rB * rB - 3.0f * rA * rC;
RealNum fDB = rB * rC - 9.0f * rA * rD;
RealNum fDC = rC * rC - 3.0f * rB * rD;
RealNum rTempA = ABSZERO;
RealNum rTempB = ABSZERO;
RealNum fDelta = fDB * fDB - 4.0f * fDA * fDC;
if (ISZERO(fDA) && ISZERO(fDB))
{
if (!ISZERO(rA))
{
*rX1 = -1.0f * rB / (3.0f * rA);
}
else if (!ISZERO(rB))
{
*rX1 = -1.0f * rC / rB;
}
else if (!ISZERO(rC))
{
*rX1 = -1.0f * rD / rC;
}
else// if (!ISZERO(rD))
{
return 0;
}
*rX2 = *rX1;
*rX3 = *rX1;
return 1;
}
if (GREATERTHANZERO(fDelta))
{
RealNum rY1 = fDA * rB + 3.0f * rA * (0.5f * (-1.0f * fDB + sqrtf(fDelta) ));
RealNum rY2 = fDA * rB + 3.0f * rA * (0.5f * (-1.0f * fDB - sqrtf(fDelta) ));
if (GREATERTHANZERO(rY1))
{
rTempA = powf(rY1, 1.0f / 3.0f);
}
else
{
rTempA = -1.0f * powf(-1.0f * rY1, 1.0f / 3.0f);
}
if (GREATERTHANZERO(rY2))
{
rTempB = powf(rY2, 1.0f / 3.0f);
}
else
{
rTempB = -1.0f * powf(-1.0f * rY2, 1.0f / 3.0f);
}
*rX1 = -1.0f * (rB + rTempA + rTempB) * (1.0f / (3.0f * rA));
Complex cX2;
cX2.real = (1.0f / (6.0f * rA)) * (-2.0f * rB + rTempA + rTempB);
cX2.image = (1.0f / (6.0f * rA)) * sqrtf(3.0f) * (rTempA -rTempB);
Complex cX3;
cX3.real = cX2.real;
cX3.image = -1.0f * cX2.image;
return 1;
}
else if (ISZERO(fDelta))
{
if (ISZERO(fDA))
{
return 0;
}
RealNum rK = fDB / fDA;
*rX1 = -1.0f * rB / rA + rK;
*rX2 = -0.5f * rK;
*rX3 = *rX2;
return 2;
}
else
{
if (LESSTHANZERO(fDA))
{
return 0;
}
if (GREATERTHANZERO(fDA))
{
rTempA = powf(fDA, 3.0f);
}
else
{
rTempA = -1.0f * powf(-1.0f * fDA, 3.0f);
}
RealNum rT = (2.0f * fDA * rB - 3.0f * rA * fDB) / (2.0f * sqrtf(rTempA));
if (!ISBETWEEN(rT, -1.0f, 1.0f))
{
return 0;
}
RealNum rTheta = acosf(rT);
*rX1 = -1.0f * (rB + 2.0f * sqrtf(fDA) * cos(rTheta / 3.0f)) * (1.0f / (3.0f * rA));
*rX2 = (-1.0f * rB + sqrtf(fDA) * (cos(rTheta / 3.0f) + sqrtf(3.0f) * sin(rTheta / 3.0f))) * (1.0f / (3.0f * rA));
*rX3 = (-1.0f * rB + sqrtf(fDA) * (cos(rTheta / 3.0f) - sqrtf(3.0f) * sin(rTheta / 3.0f))) * (1.0f / (3.0f * rA));
return 3;
}
return 0;
}
转载于:https://www.cnblogs.com/menggucaoyuan/archive/2011/08/20/2147409.html
用盛金公式求解一元三次方程相关推荐
- C# 盛金公式 求解一元三次方程
class dd2{private static readonly double dsr3 = Math.Sqrt(3);// <summary>/// 盛金公式求解一元三次方程,ax^3 ...
- 盛金公式解一元三次方程_盛金公式解一元三次方程
Module Shengjin_mod Implicit None contains Function Cubic_equation(Co) Result (X) !盛金公式求解一元三次方程 !默认浮 ...
- 盛金公式解一元三次方程_【国际数学竞赛】高次方程求根
对于一元二次方程 ,我们由求根公式可得: . 对于一元三次方程 ,我们有 卡尔丹公式法和盛金公式法.不过公式比较冗长.不易计算,但我们还是有方法计算的,那么如果是一元四次.一元五次甚至更高呢? 遇到高 ...
- 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)
卡尔丹公式法 特殊型一元三次方程 X^3+pX+q=0 (p.q∈R) 判别式Δ=(q/2)2+(p/3)3 卡尔丹公式 X1=(Y1)(1/3)+(Y2)(1/3) X2= (Y1)(1/3)ω+( ...
- 盛金公式(一元三次方程的解)
- 一元三次方程-盛金公式求解
原理参考-百度百科(http://baike.baidu.com/link?url=eA-bEvbcOBM2XmA4rzIG-lgci4MQdQcr7lCzCHBW-qG-qcPaDNovXp_jYx ...
- MATLAB实现一元三次方程求解/盛金公式
MATLAB实现一元三次方程求解/盛金公式 一元三次方程求解中,1945年卡尔丹诺把冯塔纳的三次方程求根公式发表出来,但该公式形式比较复杂,直观性也较差.1989年范盛金对一元三次方程求解进行了深入的 ...
- 一元三次方程求解(盛金公式)
一元三次方程求解(盛金公式) #include<iostream> #include<cmath> #include<iomanip> using namespac ...
- NOIP 2001 一元三次方程求解(二分||盛金公式)
题目描述 有形如:ax3+bx2+cx+d=0这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝 ...
最新文章
- python科学计数法转换_对比Python学习Go 基本数据结构
- Keil 5出现Error: L6218E: Undefined symbol解决方法
- Hive应用:外部分区表
- 【Android 应用开发】 Android 相关代码规范 更新中 ...
- LOAD_TYPE_VERSION_MISMATCH与TYPELOAD_NEW_VERSION错误分析
- java的object如何转为具体的类_佛山个体户如何转为公司?
- Universal-Image-Loader(UIL)图片载入框架使用简介
- 1096: 字符逆序
- 时间复杂度O(n^2)和O(nlog n)差距有多大?
- NSIS:强制结束软件进程
- ASP.NET基于donetCHARTING的自动报表
- Java数组快速排序
- Pigx官方文档地址
- Dell Inspiron 5576 显卡驱动程序无法安装或不认识显卡
- 869计算机难不难,北京科技大学
- 【Java进阶营】Java面试题收集
- 基于 WeDataSphere Prophecis 与 KubeSphere 构建云原生机器学习平台
- Unity:看不到Flash未来 终止支持Flash
- redis:redis-cli使用
- 异形滚动轮播图---jquery实现
热门文章
- intellij连接真实的flink集群
- Saleor出现 Make sure you've added storefront address to ALLOWED_CLIENT_HOSTS
- genymotion无法安装apk的问题
- TypeError: only integer scalar arrays can be converted to a scalar index一例
- Ubuntu16.04下面的vs code出现Unable to activate CppCheck analyzer
- 3皮卡丘眨眼代码_眨眼检测调研以及活体检测应用
- Java正则表达式实现计算器_用java编写win7计算器
- 学校计算机教学演示,案例演示在计算机基础教学中的运用
- Kubernetes从懵圈到熟练:认证与调度
- 用Scrutor来简化ASP.NET Core的DI注册