我正在尝试在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);
};
答案 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.7884
与X3
一样?