0

我有这段代码可以计算复数的复幂:

var ss = a.re*a.re + a.im*a.im;
var arg1 = math.arg(a);
var mag = Math.pow(ss,b.re/2) * Math.exp(-b.im*arg1);
var arg = b.re*arg1 + (b.im * Math.log(ss))/2;
return math.complex(mag*Math.cos(arg), mag*Math.sin(arg));

(复数看起来像 {re: 1, im: 1},math.arg 只给出 Math.atan2(n.im.n.re)。math.complex 是复数的构造函数)

它并不是特别复杂,而且我并不精通效率/准确性分析。

我想得到更好的结果,特别是复数的整数幂,因为这可以通过二项式展开更准确地完成。在我开始自己制作之前,有没有人已经用javascript编写过类似的东西?我不太担心速度,更担心准确性。

4

2 回答 2

0

如果您只关心整数幂,最准确的方法是将它们相乘:

var Re = 0, Im = 1;
var newRe = 1, newIm = 0;
var retRe = 1, retIm = 0;
for(var i = 0; i < n; i++)
{
    newRe = retRe * Re - retIm * Im;
    newIm = retRe * Im + retIm * Re;
    retRe = newRe;
    retIm = newIm;
}
于 2012-04-27T08:08:35.230 回答
0

因此,您的代码将复数转换为极坐标形式,然后应用基本指数规则。

您声称您更喜欢 (a+bi)^n = [anth degree polynomial expansion]

你说你担心准确性。

我能想到的不准确的三个来源

  • javascript numbers:如果您使用的是 javascript,那么担心准确性是很危险的。整数实际上是浮点数,因此如果您使用非常大的数字,则整数可能会出现精度错误。被警告。
  • 数学函数:Math.pow 和 Math.atan2 计算结果的准确度。如果需要,您可以对此进行研究。
  • 舍入误差:如果您执行大量操作以扩展与域/原像相关的操作范围/图像,则可能会加剧舍入误差。

还有一个低效率的来源需要关注:用多项式展开计算 z^n 将花费 O(n) 时间和 O(n) 空间,这绝对是可怕的。

您可以通过分解指数使其花费 O(log(n)) 时间和 O(1) 或 O(log(n)) 空间(与之前的 O(1) 时间和空间相比,仍然很糟糕) n 转换成它的二进制表示。

最后,您仍在计算浮点表示。当您可以(基本上)执行一个操作时,没有理由执行一长串操作来计算它;除非该操作非常不准确,否则您应该期望您执行的操作越少,您的错误就越少。

对准确性产生更深远影响的是您期望使用的数字的分布(非常小,非常大,两者等)和表示的选择(例如,如果您选择以极坐标或笛卡尔形式自然地表示它们)。例如,如果您计划进行大量的加减运算,您可能会得到更少的舍入误差和更快的笛卡尔运算速度。如果您计划进行大量的乘法、除法和取幂运算,或者在指数尺度上工作,您可能会获得更少的舍入误差和更快的极坐标。

于 2012-04-26T11:14:01.630 回答