Разработка программного обеспечения для реализации арифметических операций над комплексными числами
Разработка программного обеспечения для реализации арифметических операций над комплексными числами
СОДЕРЖАНИЕ Введение 1. Постановка задачи - 2. Математические и алгоритмические основы решения задачи
- 2.1 Понятие о комплексных числах
- 2.2 Действия с комплексными числами
- 2.2.1 Сложение комплексных чисел
- 2.2.2 Вычитание комплексных чисел
- 2.2.3 Произведение комплексных чисел
- 2.2.4 Деление комплексных чисел
- 3. Программная реализация решения задачи
- 4. Пример выполнения программы
- Заключение
- Список использованных источников и литературы
ВВЕДЕНИЕ Решение многих задач физики и техники приводит к квадратным уравнениям с отрицательным дискриминантом. Эти уравнения не имеют решения в области действительных чисел. Но решение многих таких задач имеет вполне определенный физический смысл. Значение величин, получающихся в результате решения указанных уравнений, назвали комплексными числами. Комплексные числа широко использовал отец русской авиации Н.Е. Жуковский (1847 - 1921) при разработке теории крыла, автором которой он является. Комплексные числа и функции от комплексного переменного находят применение во многих вопросах науки и техники. Цель настоящей курсовой работы: разработка программного обеспечения для реализации арифметических операций над комплексными числами. 1. Постановка задачи Требуется разработать программу, реализующую арифметические операции над комплексными числами, опираясь на следующие правила выполнения операций: 1) Сложение: . 2) Вычитание: . 3) Умножение: . 4) Деление: . Пример 1. Выполнить сложение двух комплексных чисел: и . . Ответ: . Пример 2. Выполнить вычитания двух комплексных чисел: и . . Ответ: . Пример 3. Выполнить умножение двух комплексных чисел: и . . Ответ: . Пример 4. Выполнить деление двух комплексных чисел: и . . Ответ: i. 2. Математические и алгоритмические основы решения задачи 2.1 Понятие о комплексных числах Для решения алгебраических уравнений недостаточно действительных чисел. Поэтому естественно стремление сделать эти уравнения разрешимыми, что в свою очередь приводит к расширению понятия числа. Например, для того чтобы любое уравнение x+a=b имело корни, положительных чисел недостаточно и поэтому возникает потребность ввести отрицательные числа и нуль. Древнегреческие математики считали, что a=c и b=а только натуральные числа, но в практических расчетах за два тысячелетия до нашей эры в Древнем Египте и Древнем Вавилоне уже применялись дроби. Следующим важным этапом в развитии понятия о числе было введение отрицательных чисел - это было сделано китайскими математиками за 2 века до нашей эры. Отрицательные числа применял в 3 веке нашей эры древнегреческий математик Диофант, знавший уже правила действий над ними, а в 7 веке нашей эры эти числа подробно изучили индийские ученые, которые сравнивали такие числа с долгом. С помощью отрицательных чисел можно было единым образом описывать изменение величин. Уже в 8 веке нашей эры было установлено, что квадратный корень из положительного числа имеет два значение - положительное и отрицательное, а из отрицательных чисел квадратные корни извлечь нельзя: нет такого числа х, чтобы х2 = -9. В 16 веке в связи с изучением кубических уравнений оказалось необходимым извлекать квадратные корни из отрицательных чисел. В формуле для решения кубических уравнений содержатся кубические и квадратные корни. Эта формула безотказно действует в случае, когда уравнение имеет один действительный корень (например, для уравнения х3+3х-4=0), а если оно имело 3 действительных корня (например, х3-7х+6=0), то под знаком квадратного корня оказывалось отрицательное число. Получалось, что путь к этим 3 корням уравнения ведет через невозможную операцию извлечения квадратного корня из отрицательного числа. Чтобы объяснить получившийся парадокс, итальянский алгебраист Дж. Кардано в 1545 предложил ввести числа новой природы. Он показал, что система уравнений х+у=10, ху=40 не имеющая решений в множестве действительных чисел, имеет решение всегда , , нужно только условиться действовать над такими выражениями по правилам обычной алгебры и считать, что . Кардано называл такие величины «чисто отрицательными» и даже «софистически отрицательными», считая их бесполезными и стремился не применять их. В самом деле, с помощью таких чисел нельзя выразить ни результат измерения какой-нибудь величины, ни изменение этой величины. Но уже в 1572 г. вышла книга итальянского алгебраиста Р. Бомбелли, в котором были установлены первые правила арифметических операций над такими числами, вплоть до извлечения из них кубических корней. Название «мнимые числа» ввел в 1637г. французский математик и философ Р. Декарт, а в 1777г. один из крупнейших математиков VIII века Х. Эйлер предложил использовать первую букву французского числа (мнимой единицы), этот символ вошел во всеобщее употребление благодаря К. Гауссу (1831г). В течение 17 века продолжалось обсуждение арифметической природы мнимостей, возможности дать им геометрическое истолкование. Постепенно развивалась техника операций над комплексными числами. На рубеже 17-18 веков была построена общая теория корней n-й степени сначала из отрицательных, а впоследствии и из любых комплексных чисел. В конце 18 века французский математик Ж. Лагранж смог сказать, что математический анализ уже не затрудняют мнимые величины. С помощью комплексных чисел научились выражать решения линейных дифференциальных уравнений с постоянным коэффициентом. Такие уравнения встречаются, например, в теории колебаний материальной точки в сопротивляющейся среде. Я. Бернулли применил комплексные числа для вычисления интегралов. Хотя в течении 18 века с помощью комплексных чисел были решены многие вопросы, в том числе и прикладные задачи, связанные с картографией, гидродинамикой и т. д., однако еще не было строго логического обоснования теории этих чисел. Поэтому французский ученый П. Лаплас считал, что результаты, получаемые с помощью мнимых чисел, - только наведение, приобретающие характер настоящих истин лишь после подтверждения прямыми доказательствами. В конце 18- начале 19 веков было получено геометрическое истолкование комплексных чисел. Датчанин Г. Вессель, француз Ж. Арган и немец К. Гаусс независимо друг от друга предложили изображать комплексное число точкой М(а,b) на координатной плоскости. Позднее оказалось, что еще удобнее изображать число не самой точкой М, а вектором ОМ, идущим в эту точку из начала координат. При таком истолковании сложению и вычитанию комплексных чисел соответствуют эти же операции над векторами. Геометрические истолкования комплексных чисел позволили определить многие понятия, связанные с функциями комплексного переменного, расширило область их применения. Стало ясно, что комплексные числа полезны во многих вопросах, где имеют дело с величинами, которые изображаются векторами на плоскости: при изучении течения жидкости, задач теории упругости, в теоретической электротехнике. 2.2 Действия с комплексными числами Рассмотрим решение квадратного уравнения х2 +1 = 0. Отсюда х2 = -1. Число х, квадрат которого равен -1, называется мнимой единицей и обозначается i. Таким образом , i2 = -1, откуда . Решение квадратного уравнения, например, х2 - 8х + 25 = 0, можно записать следующим образом: . Числа вида 4+3i и 4-3i называют комплексными числами. В общем виде комплексное число записывается а + bi, где a и b- действительные числа, а i - мнимая единица. Число а называется действительной частью комплексного числа, bi-мнимой частью этого числа, b- коэффициентом мнимой части комплексного числа. 2.2.1 Сложение комплексных чисел Суммой двух комплексных чисел z1 = a + bi и z2 = c + di называется комплексное число z = (a+c) + (b+d)i Числа a + bi и a-bi называются сопряженными. Их сумма равна действительному числу 2а, (а+bi) + (а-bi) = 2а. Числа а+bi и -a-bi называются противоположными. Их сумма равна нулю. Комплексные числа равны, если равны их действительные части и коэффициенты мнимых частей: а+bi = c+di, если a = c, b = d. Комплексное число равно нулю тогда, когда его действительная часть и коэффициент мнимой части равны нулю, т.е. z=a + bi = 0, если a=0, b=0. Действительные числа являются частным случаем комплексных чисел. Если b=0, то a+bi=a - действительное число. Если а = 0, , то a + bi = bi - чисто мнимое число. Для комплексных чисел справедливы переместительный и сочетательный законы сложения. Их справедливость следует из того, что сложение комплексных чисел по существу сводится к сложению действительных частей и коэффициентов мнимых частей, а они являются действительными числами, для которых справедливы указанные законы. 2.2.2 Вычитание комплексных чисел Вычитание комплексных чисел определяется как действие, обратное сложению: разностью двух комплексных чисел a + bi и с + di называется комплексное число х + уi, которое в сумме с вычитаемым дает уменьшаемое. Отсюда, исходя из определения сложения и равенства комплексных чисел получим два уравнения, из которых найдем, что х = а-с, у = b-d. Значит, (а+bi) - (c+di) = (a-c) + (b-d)i. 2.2.3 Произведение комплексных чисел Произведение комплексных чисел z1=a+bi и z2=c+di называется комплексное число z =(ac-bd) + (ad + bc)i, z1z2 = (a + bi)(c + di) = (ac - bd) + (ad + bc)i. Легко проверить, что умножение комплексных чисел можно выполнять как умножение многочленов с заменой i2 на -1. Для умножения комплексных чисел также справедливы переместительный и сочетательный законы, а также распределительный закон умножения по отношению к сложению. Из определения умножения получим, что произведение сопряженных комплексных чисел равно действительному числу: (a + bi)(a - bi) = a2 + b2 2.2.4 Деление комплексных чисел Деление комплексных чисел, кроме деления на нуль, определяется как действие, обратное умножению. Конкретное правило деления получим, записав частное в виде дроби и умножив числитель и знаменатель этой дроби на число, сопряженное со знаменателем: . 3. Программная реализация решения задачи Файл UComplex.h //--------------------------------------------------------------------------- #ifndef UComplexH #define UComplexH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include "HandTuning.h" #include <ExtCtrls.hpp> #include <Menus.hpp> //--------------------------------------------------------------------------- class TfrmComplex : public TForm { __published:// IDE-managed Components TButton *btnCalc; THandTuning *Real1; THandTuning *Img1; TLabel *Label1; TLabel *Label2; THandTuning *Real2; THandTuning *Img2; TLabel *Label3; TRadioGroup *rgrOperation; TLabel *Label4; THandTuning *resReal; THandTuning *resImg; TLabel *Label5; TLabel *Label6; TLabel *Label7; TButton *btnExit; TButton *btnClear; TLabel *Label8; TLabel *Label9; TMainMenu *MainMenu1; TMenuItem *N1; TMenuItem *N2; TMenuItem *N3; TMenuItem *N4; TMenuItem *N5; TMenuItem *N6; TMenuItem *N7; void __fastcall btnCalcClick(TObject *Sender); void __fastcall btnExitClick(TObject *Sender); void __fastcall btnClearClick(TObject *Sender); void __fastcall NClick(TObject *Sender); private:// User declarations void __fastcall Sum(double r1, double img1, double r2, double img2, double &r, double &img); void __fastcall Subtr(double r1, double img1, double r2, double img2, double &r, double &img); void __fastcall Mult(double r1, double img1, double r2, double img2, double &r, double &img); void __fastcall Div(double r1, double img1, double r2, double img2, double &r, double &img); public:// User declarations __fastcall TfrmComplex(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TfrmComplex *frmComplex; //--------------------------------------------------------------------------- #endif Файл UComplex.cpp //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "UComplex.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "HandTuning" #pragma resource "*.dfm" TfrmComplex *frmComplex; //--------------------------------------------------------------------------- void __fastcall TfrmComplex::Sum(double r1, double img1, double r2, double img2, double &r, double &img) { r = r1 + r2; img = img1 + img2; } //--------------------------------------------------------------------------- void __fastcall TfrmComplex::Subtr(double r1, double img1, double r2, double img2, double &r, double &img) { r = r1 - r2; img = img1 - img2; } //--------------------------------------------------------------------------- void __fastcall TfrmComplex::Mult(double r1, double img1, double r2, double img2, double &r, double &img) { r = r1 * r2 - img1 * img2; img = r1 * img2 + img1 * r2; } //--------------------------------------------------------------------------- void __fastcall TfrmComplex::Div(double r1, double img1, double r2, double img2, double &r, double &img) { if((r2 * r2 + img2 * img2) == 0) { Application->MessageBoxA(L"При выполнении операции деления \nвозникла ошибка: деление на ноль. \nПроверьте числа.", L"Ошибка", MB_OK + MB_ICONERROR); return; } r = (r1 * r2 + img1 * img2) / (r2 * r2 + img2 * img2); img = (r2 * img1 - r1 * img2) / (r2 * r2 + img2 * img2); } //--------------------------------------------------------------------------- __fastcall TfrmComplex::TfrmComplex(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TfrmComplex::btnCalcClick(TObject *Sender) { double r1 = Real1->Value; double img1 = Img1->Value; double r2 = Real2->Value; double img2 = Img2->Value; double real = 0; double img = 0; switch(rgrOperation->ItemIndex) { case 0: Sum(r1, img1, r2, img2, real, img); break; case 1: Subtr(r1, img1, r2, img2, real, img); break; case 2: Mult(r1, img1, r2, img2, real, img); break; case 3: Div(r1, img1, r2, img2, real, img); break; } resReal->Value = real; resImg->Value = img; } //--------------------------------------------------------------------------- void __fastcall TfrmComplex::btnExitClick(TObject *Sender) { this->Close(); } //--------------------------------------------------------------------------- void __fastcall TfrmComplex::btnClearClick(TObject *Sender) { Real1->Value = 0; Img1->Value = 0; Real2->Value = 0; Img2->Value = 0; resReal->Value = 0; resImg->Value = 0; } //--------------------------------------------------------------------------- void __fastcall TfrmComplex::NClick(TObject *Sender) { rgrOperation->ItemIndex = ((TMenuItem*)Sender)->Tag; btnCalc->Click(); } //--------------------------------------------------------------------------- 4. Пример выполнения программы Пример 1 Рисунок 1 - Входные данные Пример 2 Рисунок 2 - Выходные данные Пример 3 Рисунок 3 - Входные данные Пример 4 Рисунок 4 - Входные данные Пример 5 Рисунок 5 - Входные данные Пример 6 Рисунок 6 - Входные данные Пример 7 Рисунок 7 - Входные данные Пример 8 Рисунок 8 - Входные данные ЗАКЛЮЧЕНИЕ Применение комплексных чисел позволяет удобно и компактно сформулировать многие математические модели, применяемые в математической физике и в естественных науках - электротехнике, гидродинамике, картографии, квантовой механике, теории колебаний и многих других. Итогом работы можно считать созданную программу для реализации арифметических операций над комплексными числами. Созданный алгоритм и его программная реализация могут служить органической частью решения более сложных задач. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ и литературы Архангельский А.Я. Программирование в С++ Builder 6. [Текст] / А.Я.Архангельский. - М.: Бином, 2003. С. 1154. Ахо А.. Построение и анализ вычислительных алгоритмов [Электронный ресурс] / А. Ахо, Дж. Хопкрофт, Дж. Ульман. - М.: Мир. 1999. С. 143. Выгодский М.Я. Справочник по элементарной математике. [Текст] / М.Я. Выгодский - М.: АСТ: Астрель, 2006. С. 509. Дадаян А.А. Алгебра и геометрия. [Текст] / А.А Дадаян, В.А. Дударенко. - М.: Минск, 1999. С. 342. Камалян Р.З. Высшая математика. [Текст] / Р.З. Камалян. - М.: ИМСИТ, 2004. С.310. Комплексное число [Электронный ресурс] - Режим доступа: http://ru.wikipedia.org/wiki/Комплексное_число. Мейерс С. Наиболее эффективное использование С++. [Электронный ресурс] / С. Мейерс. - М.: ДМК Пресс, 2000. С. 304. Эккель Б. Введение в стандартный С++. [Электронный ресурс] / Б. Эккель. - М.:Питер, 2004. С. 572.
|