Вчера я создал эту часть кода, который мог вычислить 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.
Спасибо.
Рассмотрим комплексное число такое, что .
Таким образом, полярная форма = , где:
Как только вы это сделаете, вы можете использовать теорему ДеМуавра для вычисления следующим образом:
или, проще говоря,
Для получения дополнительной информации прочтите полярную форму комплексного числа .
Прежде всего, у него может быть несколько решений. См. Википедия: Комплексное число / возведение в степень .
Подобные соображения показывают, что мы можем определить рациональные действительные степени так же, как и для вещественных чисел, поэтому z 1 / n - это n : корень -й степени из z . Корни не уникальны, поэтому уже ясно, что сложные полномочия многозначны, поэтому требуется осторожное обращение с полномочиями; например (8 1/3 ) 4 ≠ 16, так как есть три кубических корня из 8, поэтому данное выражение часто сокращается до 8 4/3 , является самым простым из возможных.
Я думаю, вам следует разбить это на полярную нотацию и продолжить.
Я не очень хорошо разбираюсь в математике, поэтому, возможно, я неправильно понял вашу задачу. Но насколько я понял - 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
a ^ n неправильно определено, если n не является целым числом, а a не является положительным числом.
Если z - комплексное число, вы все равно можете придать значение z ^ a = exp (a log z), но вы должны выяснить, что означает log z, когда z не является положительным числом.
И нет однозначного выбора .