2010-06-23 62 views
4

昨天我創建了這段可以計算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 2 n,並且知道是不是每個學期當作取決於虛數的功率實或虛數。

我想要做的是能夠計算z^n,其中n是任何正實數(分數)。我知道二項式定理可以用於不是整數的冪,但我不確定如何處理複數。因爲i^0.1有一個實數和虛數分量,所以我不能把它分類成一個實數或虛數變量,我甚至不知道如何編程一些可以計算它的東西。

有沒有人知道一種算法可以幫助我實現這一點,或者甚至可以有更好的方式來處理複雜的數字,這將使這成爲可能?

哦,我正在使用java。

謝謝。

回答

4

考慮一個複數z,例如z = x + iy

因此,z極座標的形式是= re^itheta,其中:

  • rz,或sqrt(x2+y2)幅度,和
  • thetaatan y over x

一旦你這樣做,你可以使用DeMoivre's Theorem計算z^n像這樣:

z^n = r^n e^i n theta

或者更簡單地稱爲

z^n = r^n (cos (n theta) + i sin(n theta))

欲瞭解更多信息,請閱讀polar form of a complex number

+0

謝謝,這就是我一直在尋找的。 我上學期在學校裏實際學到了DeMoivre的定理,所以我覺得有點傻,因爲不想用它。 – Bumzur 2010-06-23 07:26:49

+0

另請參閱'public Complex pow(double e)'http://jscience.org/api/org/jscience/mathematics/number/Complex.html – trashgod 2010-06-23 15:40:28

+0

「z = r * e * i * theta」在第三行應該是「z = r * e ^(i * theta)」我會自己改變它,但我還沒有那個代表。 – andand 2010-06-23 16:20:27

0

我不擅長數學,所以我可能理解你的錯誤。但據我得到了它 - 阿帕奇百科全書數學可以幫助你: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 
7

首先,它可能有多種解決方案。見Wikipedia: Complex number/exponentiation

類似的考慮顯示,我們可以定義合理的實權只是作爲一個實數,所以ž1/Nñ:日ž的根源。根並不是獨一無二的,所以複雜的權力是多元化的,這已經很清楚了,因此需要謹慎對待權力。例如(8 1/3)≠16,因爲存在三個8的立方根,所以給定的表達式通常縮短爲8 4/3是最簡單的可能。

我想你應該把它分解爲極座標法並從那裏出發。

+0

除了上面的鏈接之外,請查看http://en.wikipedia.org/wiki/De_Moivre%27s_formula#Failure_for_non-integer_powers以及http://www.suitcaseofdreams.net/De_Moivre_formula中的第12.1.1節.htm – 2010-06-23 07:06:17

+0

謝謝,我沒有想到這一點。 極座標法應該使它有點整齊。 – Bumzur 2010-06-23 07:08:23

+3

+1提多個值。 – 2010-06-23 12:35:35

0

當n不是一個整數並且a不是一個正數時,a^n是不確定的。

如果z是一個複數,你仍然可以給z^a = exp(a log z)一個含義,但是當z不是正數時,你必須弄清楚z是什麼意思。

而且有no unique choice