Javascript中的立方方程

时间:2014-04-19 19:39:13

标签: javascript matlab equation-solving

我正在尝试在Javascript中创建一个“立方方程解析器应用程序”,我在Matlab中有一段代码。它需要使用复数,我知道Javascript本身无法处理这些数字所以我使用MathJS库。我试图将R代码“转换”为Javascript代码,但我没有得到正确的答案。有人可以帮我适当地进行改造吗?

    I try to calculate cubic roots of: "x^3 + -4x^2 - 7x - 10 = 0". 

    Output in Matlab: "X1 = 5,5768 X2 = -0.07884 + 1.0824i X3 = -0.7884  - 1.0824i".

    Output in Javascript: "X1 = 5.5768 X2 = 1.333 - 2.5925i X3 = 1.333 - 2.5925i".

我的错误在哪里? 谢谢你。

MATLAB:

clear
clc
%Equations Coefficients
p=-4; q=-7 r=-10;
k = (3 * q - p^2) / 3;
m = (2 * p^3 - 9 * p * q + 27 * r) /2;
c = m^2/4 + k^3 / 27;
A = (-m/2 + sqrt(c))^1/3;
B = (-m/2 - sqrt(c))^1/3;]
z1 = A + B;
z2 = 0.5 * (-(A+B)+(A-B)*sqrt(-3));
z3 = 0.5 * (-(A+B)-(A-B)*sqrt(-3));
%Equation Roots
x1 = z1 -p/3;
x2 = z2 -p/3;
x3 = z3 -p/3;

JAVASCRIPT:

var mensaje = "";
var mmath = mathjs();
var fields= document.getElementsByClassName('elements');

if (fields.length == 4){
    for (var i = 0; i<fields.length;i++){
        coef[i] = Number(fields[i].value);  
    }
}

if (coef[0] != 0) {
    var p = coef[1] / coef[0];
    var q = coef[2] / coef[0];
    var r = coef[3] / coef[0];
    var k = ((3 * q) - Math.pow(p,2))/3;
    var m = ((2 * Math.pow(p,3)) - (9 * p * q) + (27 * r )) / 27;
    var c1 = (Math.pow(m,2))/4;
    var c2 = (Math.pow(k,3))/27;
    var c = c1 + c2;
    var A1 = mmath.pow((-(m*0.5) + mmath.sqrt(c)),(1/3));
    var B1 = mmath.pow((-(m*0.5) - mmath.sqrt(c)),(1/3));
    var A = mmath.complex(A1);
    var B = mmath.complex(B1);
    var ApB = mmath.add(A,B);
    var AmB = mmath.add(A,-B);
    var sqrt3 = mmath.sqrt(-3);
    var z1 = ApB;
    var z2a = mmath.add(-ApB,AmB);
    var z2b = mmath.multiply(z2a,sqrt3);
    var z2 = mmath.multiply(z2b, 0.5);
    var z3a = mmath.add(-ApB,-AmB);
    var z3b = mmath.multiply(z3a,sqrt3);
    var z3 = mmath.multiply(z2b, 0.5);
    var f = -p/3;
    var x1 = mmath.add(z1,f);
    var x2 = mmath.add(z2,f);
    var x3 = mmath.add(z3,f);
    sol3[0] = "X1: " + x1 + "\n";
    sol3[1] = "X2: " + x2 + "\n";
    sol3[2] = "X3: " + x3 + "\n";

    for (var i = 0; i < 3; i++){
        mensaje+=sol3[i];
    };
    alert(""+mensaje);
};

1 个答案:

答案 0 :(得分:0)

区别在于以下部分:

MATLAB:

z2 = 0.5 * (-(A+B)+(A-B)*sqrt(-3));

JavaScript的:

var z2a = mmath.add(-ApB,AmB);
var z2b = mmath.multiply(z2a,sqrt3);
var z2 = mmath.multiply(z2b, 0.5);

JavaScript将z2a设置为-2 * B(= -(A + B) + (A - B)),z2b设置为-2 * B * sqrt3,然后z2设置为-B * sqrt3 }。

相反,你想要

var z2a = mmath.multiply(AmB, sqrt3);
var z2b = mmath.add(-ApB, z2a);
var z2 = mmath.multiple(z2b, 0.5);

z3的计算同样错误,应该是

var z3a = mmath.multiply(AmB, sqrt3);
var z3b = mmath.subtract(-ApB, z3a);
var z3 = mmath.multiply(z3b, 0.5);

进行这些更改之后,我从JavaScript获得了与您相同的输出,除了X2的实际部分超出10倍。我认为-0.07884应该是相反,-0.7884X3一样?