昨天我创建了一段可以计算z ^ n的代码,其中z是一个复数,n是任何正整数。
--snip--
float real = 0;
float imag = 0;
// d is the power the number is raised to [(x + yi)^d]
for (int n = 0; n <= d; n++) {
if (n == 0) {
real += pow(a, d);
} else { // binomial theorem
switch (n % 4) {
case 1: // i
imag += bCo(d, n) * pow(a, d - n) * pow(b, n);
break;
case 2: // -1
real -= bCo(d, n) * pow(a, d - n) * pow(b, n);
break;
case 3: // -i
imag -= bCo(d, n) * pow(a, d - n) * pow(b, n);
break;
case 0: // 1
real += bCo(d, n) * pow(a, d - n) * pow(b, n);
break;
}
}
}
--snip--
int factorial(int n) {
int total = 1;
for (int i = n; i > 1; i--) { total *= i; }
return total;
}
// binomial cofactor
float bCo(int n, int k) {
return (factorial(n)/(factorial(k) * factorial(n - k)));
}
我使用二项式定理来扩展z ^ n,并知道是否将每个项视为实数或虚数,具体取决于虚数的幂。
我想要做的是能够计算z ^ n,其中n是任何正实数(分数)。我知道二项式定理可以用于不是整数的幂,但我不确定如何处理复数。因为i ^ 0.1有一个实部和虚部,我不能把它分成实数或虚数变量,我甚至不知道如何编程可以计算它的东西。
有没有人知道一种可以帮助我实现这一目标的算法,或者甚至是一种更好的方法来处理能够实现这一目标的复数?
哦,我正在使用java。
感谢。
答案 0 :(得分:7)
首先,它可能有多种解决方案。请参阅Wikipedia: Complex number / exponentiation。
类似的考虑表明,我们可以像实数一样定义有理实数,因此 z 1 / n 是 n :th z 的根。根源并不是唯一的,因此很明显复杂的权力是多元的,因此需要谨慎对待权力;例如(8 1/3 ) 4 ≠16,因为有三个立方根为8,所以给定的表达式,通常缩短为8 4/3 ,是最简单的。
我认为你应该把它分解为极坐标并从那里开始。
答案 1 :(得分:5)
考虑一个复数,使。
因此,的极坐标形式为= ,其中:
完成后,您可以使用DeMoivre's Theorem计算,如下所示:
或更简单地作为
有关详细信息,请参阅polar form of a complex number。
答案 2 :(得分:0)
我不擅长数学,所以我可能理解你的任务错了。但据我所知 - apache commons math可以帮助你:http://commons.apache.org/math/userguide/complex.html
示例:
Complex first = new Complex(1.0, 3.0);
Complex second = new Complex(2.0, 5.0);
Complex answer = first.log(); // natural logarithm.
answer = first.cos(); // cosine
answer = first.pow(second); // first raised to the power of second
答案 3 :(得分:0)
a ^ n定义不正确。
如果z是一个复数,你仍然可以给出z ^ a = exp(一个log z)的含义,但你必须弄清楚当z不是正数时log z的含义。