• 不会出错的，用matlabsolve('x^4-13*x^2-5*sqrt(2)*x 36=0')ans =x1=1/6*3^(1/2)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 1/6*3^(1/2)*((52*...
不会出错的，用matlabsolve('x^4-13*x^2-5*sqrt(2)*x 36=0')ans =x1=1/6*3^(1/2)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 1/6*3^(1/2)*((52*(15326 15*79131^(1/2))^(1/3)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)-((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)*(15326 15*79131^(1/2))^(2/3)-601*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 30*2^(1/2)*3^(1/2)*(15326 15*79131^(1/2))^(1/3))/(15326 15*79131^(1/2))^(1/3)/((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2))^(1/2)x2=1/6*3^(1/2)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)-1/6*3^(1/2)*((52*(15326 15*79131^(1/2))^(1/3)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)-((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)*(15326 15*79131^(1/2))^(2/3)-601*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 30*2^(1/2)*3^(1/2)*(15326 15*79131^(1/2))^(1/3))/(15326 15*79131^(1/2))^(1/3)/((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2))^(1/2)x3=-1/6*3^(1/2)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 1/6*i*((-156*(15326 15*79131^(1/2))^(1/3)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 3*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)*(15326 15*79131^(1/2))^(2/3) 1803*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 90*2^(1/2)*3^(1/2)*(15326 15*79131^(1/2))^(1/3))/(15326 15*79131^(1/2))^(1/3)/((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2))^(1/2)x4=-1/6*3^(1/2)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)-1/6*i*((-156*(15326 15*79131^(1/2))^(1/3)*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 3*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2)*(15326 15*79131^(1/2))^(2/3) 1803*((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2) 90*2^(1/2)*3^(1/2)*(15326 15*79131^(1/2))^(1/3))/(15326 15*79131^(1/2))^(1/3)/((26*(15326 15*79131^(1/2))^(1/3) (15326 15*79131^(1/2))^(2/3) 601)/(15326 15*79131^(1/2))^(1/3))^(1/2))^(1/2)。全部
展开全文
• 使用VC++编写求解一元四次方程的程序
• 一元四次方程的求解0....要是直接放入C++中，通过解析来实时求它的甚至会比求解一元四次方程花费的时间更多。于是另谋出路，查阅资料如何求解一元四次方程。 1.方法一 Ferrari方法，这也是最容易Googl...
一元四次方程的求解0.引言1.方法一2.方法二3.结论
0.引言
在学习过程中需要求解一个一元四次方程。
由于带有未知参数，本想使用MATLAB求解出它的解析解然后写入C++进行计算。后来发现求解出来的解太长。

要是直接放入C++中，通过解析解来实时求它的解甚至会比求解一元四次方程花费的时间更多。于是另谋出路，查阅资料如何求解一元四次方程。
1.方法一

wiki

Ferrari.cpp
#include <math.h>
#include <float.h>
#include <complex>
#include <iostream>
/******************************************************************************\
对一个复数 x 开 n 次方
\******************************************************************************/
std::complex<double>  sqrtn(const std::complex<double>&x,double n)
{
double r = hypot(x.real(),x.imag()); //模
if(r > 0.0)
{
double a = atan2(x.imag(),x.real()); //辐角
n = 1.0 / n;
r = pow(r,n);
a *= n;
return std::complex<double>(r * cos(a),r * sin(a));
}
return std::complex<double>();
}
/******************************************************************************\
使用费拉里法求解一元四次方程 a*x^4 + b*x^3 + c*x^2 + d*x + e = 0
\******************************************************************************/
std::complex<double> Ferrari(std::complex<double> x[4]
,std::complex<double> a
,std::complex<double> b
,std::complex<double> c
,std::complex<double> d
,std::complex<double> e)
{
a = 1.0 / a;
b *= a;
c *= a;
d *= a;
e *= a;
std::complex<double> P = (c * c + 12.0 * e - 3.0 * b * d) / 9.0;
std::complex<double> Q = (27.0 * d * d + 2.0 * c * c * c + 27.0 * b * b * e - 72.0 * c * e - 9.0 * b * c * d) / 54.0;
std::complex<double> D = sqrtn(Q * Q - P * P * P,2.0);
std::complex<double> u = Q + D;
std::complex<double> v = Q - D;
if(v.real() * v.real() + v.imag() * v.imag() > u.real() * u.real() + u.imag() * u.imag())
{
u = sqrtn(v,3.0);
}
else
{
u = sqrtn(u,3.0);
}
std::complex<double> y;
if(u.real() * u.real() + u.imag() * u.imag() > 0.0)
{
v = P / u;
std::complex<double> o1(-0.5,+0.86602540378443864676372317075294);
std::complex<double> o2(-0.5,-0.86602540378443864676372317075294);
std::complex<double>&yMax = x[0];
double m2 = 0.0;
double m2Max = 0.0;
int iMax = -1;
for(int i = 0;i < 3;++i)
{
y = u + v + c / 3.0;
u *= o1;
v *= o2;
a = b * b + 4.0 * (y - c);
m2 = a.real() * a.real() + a.imag() * a.imag();
if(0 == i || m2Max < m2)
{
m2Max = m2;
yMax = y;
iMax = i;
}
}
y = yMax;
}
else
{//一元三次方程，三重根
y = c / 3.0;
}
std::complex<double> m = sqrtn(b * b + 4.0 * (y - c),2.0);
if(m.real() * m.real() + m.imag() * m.imag() >= DBL_MIN)
{
std::complex<double> n = (b * y - 2.0 * d) / m;
a = sqrtn((b + m) * (b + m) - 8.0 * (y + n),2.0);
x[0] = (-(b + m) + a) / 4.0;
x[1] = (-(b + m) - a) / 4.0;
a = sqrtn((b - m) * (b - m) - 8.0 * (y - n),2.0);
x[2] = (-(b - m) + a) / 4.0;
x[3] = (-(b - m) - a) / 4.0;
}
else
{
a = sqrtn(b * b - 8.0 * y,2.0);
x[0] =
x[1] = (-b + a) / 4.0;
x[2] =
x[3] = (-b - a) / 4.0;
}
return x[4];
}

int main()
{
std::complex<double> x[4];
x[4] = Ferrari(x,1,2,3,4,5); //验证费拉里法
std::cout<<"root1: "<<x[0]<<std::endl<<"root2: "<<x[1]<<std::endl<<"root3: "<<x[2]<<std::endl<<"root4: "<<x[3]<<std::endl;
return true;
}

测试系数：1,2,3,4,5

确保结果正确，使用matlab验证一下：
p = [1 2 3 4 5];
x = roots(p)


结果一致，OK。
2.方法二
使用多项式的伴随矩阵进行求解。

ref

对于多项式：$P(x) = x^n+c_{n-1}x^{n-1}+c_{n-2}x^{n-2}+\cdots+c_1x+c_0$
其伴随矩阵：
$M_x = \left[\begin{array}{ccccc} 0 & {0} & {...} & {0} & {-c_0} \\ 1 &0 & {...} & {0} & {-c_1} \\ {0} & {1} & {...} & {0} & {-c_2} \\ { ...} & {...} & {...} & {...} & {...} \\ {0} & {0} & {...} & {1} & {-c_{n-1}} \end{array}\right]$
的特征值就是$P(x)$的根。
于是使用Eigen进行多项式的求解：
#include <iostream>
#include <Eigen/Core>
// 稠密矩阵的代数运算（逆，特征值等）
#include <Eigen/Dense>
using namespace std;

int main( int argc, char** argv )
{

Eigen::Matrix<double, 4, 4> matrix_44;
//复数动态矩阵
Eigen::Matrix<complex<double>, Eigen::Dynamic, Eigen::Dynamic> matrix_eigenvalues;
//同样测试 12345
matrix_44 << 0, 0, 0, -5,
1, 0, 0, -4,
0, 1, 0, -3,
0, 0, 1, -2;

std::cout<<"matrix_44: "<<std::endl<<matrix_44<<std::endl<<std::endl;

matrix_eigenvalues = matrix_44.eigenvalues();
//std::cout<<"matrix_44.eigenvalues: "<<std::endl<<matrix_44.eigenvalues()<<std::endl;
std::cout<<"matrix_eigenvalues: "<<std::endl<<matrix_eigenvalues<<std::endl;
return 0;
}


结果与上面同样一致：

3.结论
数学功底越深厚，代码复杂度越低！！


展开全文
• 应用降次的方法求取一元四次方程的根（这里只求取了正实根）
• 一元四次方程求根公式

求解一元四次方程 VC++ 代码链接如下： https://github.com/hanford77/SolveEquation
展开全文
• 用于求解一元四次方程的类的头文件， //pr[5]分别表示一元四次方程的5个参数，pr[0] * x^4 + pr[1] * x^3 + pr[2] * x^2 + pr[3] * x^1 + pr[4] = 0 //使用EquationSolver MyES; double prs = {1,1,1,1,1}; MyES....
• 一元四次方程求解方法的思考与研究 一元四次方程求解的基本思路是降次，它可以由二次、三次方程的求解得到启示.
• ## 一元四次方程的求根公式

千次阅读 热门讨论 2019-07-10 14:05:41
对于一元四次方程： ax4+bx3+cx2+dx+e=0\Large a x^{4}+b x^{3}+c x^{2}+d x+e=0ax4+bx3+cx2+dx+e=0 记： {Δ1=c2−3bd+12aeΔ2=2c3−9bcd+27ad2+27b2e−72ace\Large \begin{cases} \Delta_{1}=c^{2}-3 b d+12 a e \...
对于一元四次方程：
$\Large a x^{4}+b x^{3}+c x^{2}+d x+e=0(a\ne0)$
记：
$\Large \begin{cases} \Delta_{1}=c^{2}-3 b d+12 a e \\ \Delta_{2}=2 c^{3}-9 b c d+27 a d^{2}+27 b^{2} e-72 a c e \end{cases}$
并记:
$\Large\Delta=\frac{\sqrt[3]{2} \Delta_{1}}{3 a \sqrt[3]{\Delta_{2}+\sqrt{-4 \Delta_{1}^{3}+\Delta_{2}^{2}}}}+\frac{\sqrt[3]{\Delta_{2}+\sqrt{-4 \Delta_{1}^{3}+\Delta_{2}^{2}}}}{3 \sqrt[3]{2} a}$
则有：
$\Large\begin{cases} x_{1}=-\frac{b}{4 a}-\frac{1}{2} \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta}-\frac{1}{2} \sqrt{\frac{b^{2}}{2 a^{2}}-\frac{4 c}{3 a}-\Delta-\frac{-\frac{b^{3}}{a^{3}}+\frac{4 b c}{a^{2}}-\frac{8 d}{a}}{4 \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta}}}\\ x_{2}=-\frac{b}{4 a}-\frac{1}{2} \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta}+\frac{1}{2} \sqrt{\frac{b^{2}}{2 a^{2}}-\frac{4 c}{3 a}-\Delta-\frac{-\frac{b^{3}}{a^{3}}+\frac{4 b c}{a^{2}}-\frac{8 d}{a}}{4 \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta}}}\\ x_{3}=-\frac{b}{4 a}+\frac{1}{2} \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta}-\frac{1}{2} \sqrt{\frac{b^{2}}{2 a^{2}}-\frac{4 c}{3 a}-\Delta+\frac{-\frac{b^{3}}{a^{3}}+\frac{4 b c}{a^{2}}-\frac{8 d}{a}}{4 \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta }}}\\ x_{4}=-\frac{b}{4 a}+\frac{1}{2} \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta}+\frac{1}{2} \sqrt{\frac{b^{2}}{2 a^{2}}-\frac{4 c}{3 a}-\Delta+\frac{-\frac{b^{3}}{a^{3}}+\frac{4 b c}{a^{2}}-\frac{8 d}{a}}{4 \sqrt{\frac{b^{2}}{4 a^{2}}-\frac{2 c}{3 a}+\Delta}}} \end{cases}$


展开全文
• 从初中接触函数和方程开始，我们就经常和一元二次方程打交道，几乎不会遇到需要求解一元三次方程或一元四次方程的问题。前段时间我看到一篇涉及到解一元四次方程的文献，我这么厉害，肯定要自己去它一。后来发现...
• 一元四次方程（VC++）(quartic_equation.rar)
• 大家都已经知道一元二次方程和一元三次方程公式的求法了，那么一元四次方程呢？就让翀仔向大家介绍一下卡当的学生--费拉利的方法吧！ 和一元三次方程的技巧，我们都要把方程降次方来。下面就是费拉里降次的方法...
• 正文开始 我们考虑标准一元四次方程这里a≠0，我们第一个想到的应该是配方法，我们令a=1（这样不失一般性），也就是移项一下得到左边配方得到那这样我们还是没有办法出这个方程的，我们引入巧妙的一步，如果我们在...
• 2007-12-28七年级一元次方程应用题类型归纳1、应用题的一般思维表述方式应用题的关键是：找等量关系，才能设出未知数，列出方程，剩余的解题任务相应的就比较轻松。2、应用题的类型及思维策略(1)应用题分类在...
• 一元高次方程数值解法C程序实现探? 一元高次方程作为方程的一部分，对我们...文我们了解了系数在有理数域且只有有理根的一元高次方程的解法技巧一元二次方程根式的推敲了一元三次、四次方程的根式；最后介绍了...
•   已知一元四次方程ax4+bx3+cx2+dx+e=0(a≠0)ax^4 + bx^3 + cx^2+dx+e = 0(a\neq0)ax4+bx3+cx2+dx+e=0(a​=0)，求方程的实数根。笔者用C语言实现了费拉里法求解一元四次方程高精度的实数根。一元四次方程实数根...
• 编写求解一元次方程，要求如下： 1）至少包括一元一次、一元二次、一元次方程 2) 至少设计两个接口 3）必须用到内部类和包 4）写出详细的编译运行过程
• 有形如：ax3+bx2+cx+d=0 这样的一个一元次方程。给出该方程中各项的系数(a，b，c，d 均为实数)，并约定该方程存在三个不同实根(根的范围在-100至100之间)，且根与根之差的绝对值 ≥ 1。要求由小到大依次在同一行...
• 使用 VC++ 编写一元四次方程求解的核心代码，生成动态库、静态库、COM组件、.NET组件，然后使用 vb、vc、c#、excel、html 调用。
• 其中，方程根的解法更是一元次方程的重中之重，下面就给大家分析一下一元次方程在初中学习中常见的方程的解法：[1]求解一元次方程求解一元次方程方程常见的有三种方法：（1）公式法：将一元次方程化为一般...
• 用到了一元次方程,一元次方程的求解. class QuarticRealPolynomial { public:  static Number computeDiscriminant(Number a, Number b, Number c, Number d, Number e);  static std::vector ...
• ** 一元次方程的解法 ** 一、知识要点： 一元次方程一元次方程都是整式方程，它是初中数学的一个重点内容，也是今后学习数学的基 础。 ...一元次方程种解法： 1、直接开平方...
• 这两个解法都是基于构造性的...拉格朗日提出了一个统一的办法解决n次方程的问题，但发现对于五次方程不可。 后来阿贝尔提出了一个充要条件。最终由天才数学家伽罗瓦解决，并产生群论。这些将在伽罗瓦理论中仔细阐明
• 转载： https://blog.csdn.net/fb_941219/article/details/102984587
• 计算一元一次二次三次四次方程，很好的计算器

...