Исходные числа
z₁ =
+
· i
—
z₂ =
+
· i
—
Операция
Результат в алгебраической форме
—
Тригонометрическая форма
—
Показательная форма
—
Модуль и аргумент результата
|z| = —
arg z = — рад ≈ —°
Геометрическая интерпретация
Красный вектор — z₁, синий — z₂, зелёный — результат
Что показывает вектор
Комплексное число z = a + b·i соответствует точке (a, b) на
комплексной плоскости. Модуль |z| — длина вектора от начала координат,
аргумент arg z — угол между вектором и положительным направлением
действительной оси.
Сложение векторов — геометрическое сложение по правилу параллелограмма.
Умножение — это растяжение вектора в
|z₂| раз и
поворот на угол arg z₂. Формула Муавра обобщает это на степень.
История операций
Ещё не выполнено ни одной операции.
Ключевой код
Структура и базовые операции
struct complex1 {
double Re; // действительная часть
double Im; // мнимая часть
};
complex1 plus1(complex1 a, complex1 b) {
complex1 t;
t.Re = a.Re + b.Re;
t.Im = a.Im + b.Im;
return t;
}
complex1 mult1(complex1 a, complex1 b) {
complex1 t;
t.Re = a.Re * b.Re - a.Im * b.Im;
t.Im = a.Im * b.Re + a.Re * b.Im;
return t;
}
complex1 divide1(complex1 a, complex1 b) {
complex1 t;
double d = b.Re * b.Re + b.Im * b.Im;
t.Re = (a.Re * b.Re + a.Im * b.Im) / d;
t.Im = (a.Im * b.Re - a.Re * b.Im) / d;
return t;
}
Формула Муавра для возведения в степень
// z = r·(cos φ + i·sin φ)
// zⁿ = rⁿ·(cos(nφ) + i·sin(nφ))
complex1 pow1(complex1 z, int n) {
double r = sqrt(z.Re * z.Re + z.Im * z.Im);
double phi = atan2(z.Im, z.Re);
complex1 t;
t.Re = pow(r, n) * cos(n * phi);
t.Im = pow(r, n) * sin(n * phi);
return t;
}
Главное значение аргумента. Функция
atan(y/x) теряет информацию
о четверти. Для корректного вычисления аргумента во всех четвертях используют
atan2(y, x), как в примере выше.
Задание
- Вычислите
z₁ · z₂вручную, затем сверьте с результатом калькулятора. - Проверьте:
|z₁ · z₂|должно равняться|z₁| · |z₂|, аarg(z₁ · z₂) = arg z₁ + arg z₂. Убедитесь в этом по значениям модуля и аргумента. - Возведите
z = 1 + iв степени 1, 2, 3, 4. Что происходит с модулем и аргументом? - Почему деление на
z = 0невозможно? Как в C++ обработать эту ситуацию? - Реализуйте класс
Complexс перегруженными операторами+,-,*,/.