Вычисление комплексных чисел с рациональными экспонентами

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

Спасибо.

5
задан kiamlaluno 17 January 2013 в 07:04
поделиться

4 ответа

Рассмотрим комплексное число 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))

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

5
ответ дан 18 December 2019 в 16:36
поделиться

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

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

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

7
ответ дан 18 December 2019 в 16:36
поделиться

Я не очень хорошо разбираюсь в математике, поэтому, возможно, я неправильно понял вашу задачу. Но насколько я понял - apache commons math может вам помочь: http://commons.apache.org/math/userguide/complex.html

Example:

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
0
ответ дан 18 December 2019 в 16:36
поделиться

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

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

И нет однозначного выбора .

0
ответ дан 18 December 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: