解析求解三次方程的函数
Function to solve cubic equation analytically
我需要解析和实数求解一个三次方程(a x^3 + b x^2 + c*x + d = 0),最好是纯javascript(没有库)。由于可能有 1 到 3 个根,我认为数字数组是一种合理的结果类型。
附言下面提供了我自己的解决方案,希望它会有用。
你去吧。包括处理退化案例。主要算法主要来自维基百科文章。
function cuberoot(x) {
var y = Math.pow(Math.abs(x), 1/3);
return x < 0 ? -y : y;
}
function solveCubic(a, b, c, d) {
if (Math.abs(a) < 1e-8) { // Quadratic case, ax^2+bx+c=0
a = b; b = c; c = d;
if (Math.abs(a) < 1e-8) { // Linear case, ax+b=0
a = b; b = c;
if (Math.abs(a) < 1e-8) // Degenerate case
return [];
return [-b/a];
}
var D = b*b - 4*a*c;
if (Math.abs(D) < 1e-8)
return [-b/(2*a)];
else if (D > 0)
return [(-b+Math.sqrt(D))/(2*a), (-b-Math.sqrt(D))/(2*a)];
return [];
}
// Convert to depressed cubic t^3+pt+q = 0 (subst x = t - b/3a)
var p = (3*a*c - b*b)/(3*a*a);
var q = (2*b*b*b - 9*a*b*c + 27*a*a*d)/(27*a*a*a);
var roots;
if (Math.abs(p) < 1e-8) { // p = 0 -> t^3 = -q -> t = -q^1/3
roots = [cuberoot(-q)];
} else if (Math.abs(q) < 1e-8) { // q = 0 -> t^3 + pt = 0 -> t(t^2+p)=0
roots = [0].concat(p < 0 ? [Math.sqrt(-p), -Math.sqrt(-p)] : []);
} else {
var D = q*q/4 + p*p*p/27;
if (Math.abs(D) < 1e-8) { // D = 0 -> two roots
roots = [-1.5*q/p, 3*q/p];
} else if (D > 0) { // Only one real root
var u = cuberoot(-q/2 - Math.sqrt(D));
roots = [u - p/(3*u)];
} else { // D < 0, three roots, but needs to use complex numbers/trigonometric solution
var u = 2*Math.sqrt(-p/3);
var t = Math.acos(3*q/p/u)/3; // D < 0 implies p < 0 and acos argument in [-1..1]
var k = 2*Math.PI/3;
roots = [u*Math.cos(t), u*Math.cos(t-k), u*Math.cos(t-2*k)];
}
}
// Convert back from depressed cubic
for (var i = 0; i < roots.length; i++)
roots[i] -= b/(3*a);
return roots;
}
相关文章:
- socket.io发射三次
- SVG实现的单调三次插值没有像d3这样的库
- readyState=4三次.Ajax-由警报引起
- Raphael悬停事件和调整大小框在第三次鼠标悬停后发生故障
- Javascript拉斐尔奇怪的闪烁发生在我鼠标悬停的第三次
- Ajax请求三次都不起作用,然后就起作用了
- 弹出循环:添加数据时停止重复/三次应用/X
- 如何让onclick第三次做一些不同的事情
- 在第三次onPageClick事件后,使用twbspagination插件和AJAX更新JS分页
- ajax表单在第二次提交时提交了两次,在第三次提交时又提交了三次,等等
- 使插值双三次函数在ie9中工作
- 为什么$scope成员被访问三次
- 了解三次插值的实现
- 火狐:三次点击的段落选择会产生我所期望的行为
- 当我在火狐扩展中使用页面模组添加内容脚本时.内容脚本函数执行三次
- 如何在三次单击html5 / javascript / css时将表格单元格颜色更改为默认值
- 解析求解三次方程的函数
- 在动态创建的元素上触发三次单击事件
- 帮助形成一个三次缓和方程
- 在javascript中找到一个三次方程,适合两个给定斜率的点