如何在JavaScript中计算复数?

28

最近,我正在尝试使用一些包含虚数i的方程式进行计算。然而,与eπ不同,没有任何方法或原生函数可以返回虚数i。在谷歌上进行快速搜索也没有得到答案。有什么想法可以实现吗?

function imaginary(){
    return {
        rational: this,
        imaginary: "2i"  //magic code that does this
    };
};
Number.prototype.imaginary = imaginary;

4
请看这里:http://janhartigan.com/articles/creating-a-javascript-complex-number-class - Brandon
第一个结果似乎有很好的信息... - elclanrs
(5+2i)*(9+5i) = newValuee^(i*pi) - Derek 朕會功夫
4
上面贴出的链接已失效。不过,通过Wayback Machine,这里有一个复制版本:https://web.archive.org/web/20131012072444/http://janhartigan.com/articles/creating-a-javascript-complex-number-class - Avatar
1
祝福 Wayback Machine。 - Will Brickner
显示剩余2条评论
4个回答

25

math.js库支持复数、矩阵等,且与JavaScript内置的Math库兼容,因此易于使用。

http://mathjs.org

你只需要像这样做:

math.i;                         // i
math.sqrt(-4)                   // 2i
var a = math.complex('2 + 3i'); // 2 + 3i
var b = math.complex(4, 5);     // 4 + 5i
math.add(a, b);                 // 6 + 8i
math.multiply(a, b);            // -7 + 22i
math.eval('e^(pi*i) + 1');      // ~0
// etc...

编辑:注意,math.js带有表达式解析器,这使得使用复数和数学表达式更加方便:

math.eval('(2 + 3i) * (4 + 5i)'); // -7 + 22i

2
mathjs不支持将复数转换为或从极坐标转换,这与大多数其他语言中的复数库不同。如果您需要这个功能,请考虑使用https://npmjs.org/package/Complex。 - MkV
8
mathjs现在支持从极坐标中创建和转换复数,参见文档 - Jos de Jong
当我尝试运行 math.eval('e^(pi*i) + 1') 时,我得到了 1.2246467991473532e-16 的结果。不过这是在手机上使用 termux 应用程序的 node REPL 中进行的。 - trysis
3
这是数值舍入误差,参见文档:http://mathjs.org/docs/datatypes/numbers.html#roundoff-errors。 - Jos de Jong
1
你好,有没有用于计算这种事情的JS库?你输入f(z)=(1−z)/(1+z),它会给出u=(1−x2−y2)/((1+x)+y2)和v=−2y/((1+x)2+y2)。https://math.stackexchange.com/questions/2909044/separate-fz-into-real-and-imaginary-parts - Ch'nycos

13
假设您真正需要复数,而不仅仅是虚部:
我会像建模2D点一样建模复数,即一对数字。
就像一个点有x和y组件一样,一个复数有实部和虚部。 两个组件都可以用普通的数字类型(int、float等)来建模。
但是,你需要为所有数学运算定义新功能。
复数的加减法与点的加减法相同-将单独的组件相加,不要混合它们。例如:
(3+2i)+(5+4i) = (8+6i)
乘法的工作方式就像你在代数中学习的那样,当乘(a+b)*(c+d) = (ac+ad+bc+bd)。
除了现在你还要记住i*i = -1。所以:
(a+bi)*(c+di) = (ac+adi+bci+bdii) = (ac-bd) + (ad+bc)i
对于除法和指数,请参见http://en.wikipedia.org/wiki/Complex_number

6

3
虽然这些链接可能会回答问题,但最好在此处包含回答的基本部分,并提供链接以供参考。仅有链接的答案可能会因为链接页面的更改而失效。 - Donald Duck

0

你其实不需要一个特别的JS库:

function convert2Rectangle(polarReal, polarAngle){
    var real = Math.cos(polarAngle*Math.PI/180)*polarReal
    var imag = Math.sin(polarAngle*Math.PI/180)*polarReal
    var RectNumber = {'real':real,'imag':imag}
    return RectNumber
}

function convert2Polar(rectReal, rectImag){
    var real = Math.sqrt(rectReal*rectReal + rectImag*rectImag) 
    var angle = Math.atan( real/rectReal )* (180/Math.PI)
    var PolarNumber = {'real':real,'angle':angle}
    return PolarNumber
}

var myPolar = convert2Polar(3,30)
console.log(myPolar.real)
console.log(myPolar.angle)

var myRect = convert2Rectangle(30.1496,84.317)
console.log(myRect.real)
console.log(myRect.imag)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接