Комплексные числа: интерактивный калькулятор

Пять операций над комплексными числами с разбором алгебраической, тригонометрической и показательной форм, а также геометрическая интерпретация.

struct complex Формула Муавра Геометрический смысл

Исходные числа

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), как в примере выше.

Задание

  1. Вычислите z₁ · z₂ вручную, затем сверьте с результатом калькулятора.
  2. Проверьте: |z₁ · z₂| должно равняться |z₁| · |z₂|, а arg(z₁ · z₂) = arg z₁ + arg z₂. Убедитесь в этом по значениям модуля и аргумента.
  3. Возведите z = 1 + i в степени 1, 2, 3, 4. Что происходит с модулем и аргументом?
  4. Почему деление на z = 0 невозможно? Как в C++ обработать эту ситуацию?
  5. Реализуйте класс Complex с перегруженными операторами +, -, *, /.