Комплексные числа

Комплексные числа широко используются в современной радиотехнике для расчета различных схем и устройств по переменному току.

Комплексным числом называется выражение вида a + jb, где a и b – любые действительные числа, j2 = –1, j – это специальная величина, называемая мнимой единицей.

Рис. 1.1. Геометрическая интерпретация
комплексного числа

Комплексные числа часто обозначают одной буквой, например, z = a + jb. Число a называется действительной частью комплексного числа z (Re z), а число b – мнимой частью этого числа z (Im z). Комплексные числа вида a + j · 0 называют действительными. Числа вида 0 + jb называются чисто мнимыми. Геометрическими интерпретациями комплексного числа являются вектор или точка на комплексной плоскости рис. 1.1. Комплексной называется плоскость, когда по оси ординат откладывается мнимая часть комплексного числа, а по оси абсцисс – действительная.

Модулем комплексного числа называется длина вектора, соответствующего этому числу:

Аргументом комплексного числа z = a + jb (z ≠ 0) называется величина угла между положительным направлением действительной оси и вектором, обозначается обычно φ = arg(z) = arctg(b/a). Существует три формы записи комплексного числа:

алгебраическая z =a + bj;

тригонометрическая ;

показательная .

В С++ для работы с комплексными числами предусмотрен класс сomplex.Для его использования нужно включить заголовочный файл: #include<complex>.В стандартную библиотеку C++ включены три специализированные версии класса complex для типов float, double и long double.

Инициализация комплексной переменной

// Чисто мнимое число: 0 + 7j

complex< double > purei( 0, 7 );

// Мнимая часть равна 0: 3 + 0j

complex< float > real_num( 3 );

// И вещественная, и мнимая части равны 0: 0 + 0j

complex< long double > zero;

// Инициализация одного комплексного числа другим

complex< double > purei2( purei );

//Инициализация комплексного числа арифметическим типом

complex< double > w;

double h=3.14159;

w = h;

Приведение типов

При операциях с комплексными числами, так же как и с вещественными, происходит преобразование типов – их приведение. Приведение может быть без потери информации – безопасное приведение и рискованное (опасное), когда такая потеря может происходить. Здесь много подводных камней. Поэтому надо запомнить, что безопасным является приведение complex<float> в complex <double>, оно может быть задано неявно. Остальные приведения надо задавать явно. Кроме того, лучше не использовать комплексные числа целого типа, так как в явном и неявном виде они не преобразуются в complex с типом float или double.

сomplex<float> cf;

complex<double> cd;

complex<double> cdL(cf); // OK: явное приведение

complex<float> cd2 = cd; // OK: безопасное приведение

complex<int> ci;

complex<double> cd4 = ci; // ОШИБКА: небезопасное приведение

complex<double> cd5(ci); // ОШИБКА: нет явного приведения

Вывод и ввод комплексных чисел

В С++ поддерживается и ввод/вывод комплексных чисел. Оператор вывода печатает действительную и мнимую части через запятую в круглых скобках. Например, результат выполнения оператора вывода

complex< double > z( 3.14159, -2.171 );

cout << z << endl;

выглядит так:

( 3.14159, –2.171 )

Оператор ввода понимает любой из следующих форматов:

// Допустимые форматы для ввода комплексного числа

// 3.14159 ==> complex( 3.14159 );

// ( 3.14159 ) ==> complex( 3.14159 );

// ( 3.14, –1.0 ) ==> complex( 3.14, 1.0 );

// может быть считано как

cin >> a >> b >> с;

// где a, b, с – комплексные числа

Значит, если вы введете вещественное число (в круглых скобках или без них) на место комплексных переменных a или b, то это интерпретируется как комплексная переменная с нулевой мнимой частью. Для ввода же переменной с = 3.14 1.0j, необходимо в круглых скобках через запятую ввести отдельно действительную и мнимую части.

Операторы класса complex

Комплексные числа можно складывать, вычитать, умножать, делить, сравнивать,

#include <complex>.

complex< double > a;

complex< double > b;

complex< double > с = a * b + a / b;

Комплексные и арифметические типы разрешается смешивать в одном выражении:

complex< double > a;

complex< double > d = a + 3.14159;

Внимание! В правой части приведенного оператора происходит суммировние комплексной переменной и вещественной константы. Тип этих объектов должен быть одинаковым, в данном случае – это double, так как константа с десятичной точкой в Visual C++ имеет по умолчанию тип double. Если же типы этих объектов не совпадут, то компилятор выдаст ошибку:

complex< float > a;

complex< double > d = a + 3.14159;//ОШИБКА

Устраним эту ошибку

complex< float > a;

complex< double > d = a + 3.14159f; //OK

Буква f в конце числа сообщает компилятору, что тип числа – float.

Класс комплексных чисел поддерживает четыре составных оператора присваивания: +=, -=, *= и /=. Таким образом, если

complex <float>a,d;

то можно записать

a+=d;

Функции для работы с комплексными числами

Класс complex имеет две функции, возвращающие соответственно вещественную и мнимую части. Мы можем обращаться к ним, используя синтаксис доступа к членам класса:

complex<double> z;

double re = z.real();

double im = z.imag();

или эквивалентный синтаксис вызова функции:

double re = real(z);

double im = imag(z);

Кроме того, для работы с комплексными числами имеются следующие функции: abs(), arg(), conj(), polar(), sqrt(), sin(), cos(), tan(), exp(), log(), log10() и pow(). Функция polar() по модулю и аргументу комплексного числа находит его действительную и мнимую части, функция conj(z) возвращает комплексно сопряженное число к числу z.