Вычисление комплексных чисел с рациональными показателями - PullRequest
5 голосов
/ 23 июня 2010

Вчера я создал этот фрагмент кода, который может вычислять 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.

Спасибо.

Ответы [ 4 ]

7 голосов
/ 23 июня 2010

Прежде всего, он может иметь несколько решений. См. Википедия: Комплексное число / возведение в степень .

Подобные соображения показывают, что мы можем определить рациональные реальные силы так же, как и для действительных, поэтому z 1 / n является n : th корнем 1012 * г . Корни не уникальны, поэтому уже ясно, что сложные силы многозначны, поэтому необходимо бережное отношение к силам; например (8 1/3 ) 4 ≠ 16, поскольку существует три кубических корня из 8, поэтому данное выражение, часто сокращенное до 8 4/3 , является самым простым из возможных.

Я думаю, вы должны разбить его на полярную запись и перейти оттуда.

5 голосов
/ 23 июня 2010

Рассмотрим комплексное число z такое, что z = x + iy.

Таким образом, полярная форма z равна = re^itheta, где:

  • r - это величина z, или sqrt(x2+y2), и
  • theta - это atan y over x.

Как только вы это сделаете, вы можете использовать Теорема Демовра для вычисления z^n следующим образом:

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

или более просто как

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

Для получения дополнительной информации прочитайте о полярной форме комплексного числа .

0 голосов
/ 23 июня 2010

a ^ n определено неправильно, когда n не является целым числом, а a не является положительным числом.

Если z является комплексным числом, вы все равно можете задать значение z ^ a = exp (alog z), но вы должны выяснить, что означает log z, когда z не является положительным числом.

И нет уникального выбора .

0 голосов
/ 23 июня 2010

Я не очень хорош в математике, так что, вероятно, я неправильно понял вашу задачу. Но, насколько я понял, математика apache commons может вам помочь: 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
...