Пример «Комплексные числа»
Файлы:
- Прикладные задачи
- Комплексные числа.перфо
Пример программы на языке программирования Перфо:
//Эта программа написана на языке Перфо
//для демонстрации манипуляций с комплексными числами
//====== ОПРЕДЕЛЕНИЯ ======
//Определим операции с комплексными числами как функции
//--- создание комплексного числа ---
//Создать комплексное число
//с вещественной и мнимой частями
(Функция (КоВещМним ВещественаяЧасть МнимаяЧасть)
(СЭЛ ВещественаяЧасть МнимаяЧасть)
)
//Создать комплексное число
//по модулю и углу
(Функция (КоМодУгл Модуль Угол)
(СЭЛ (* Модуль (Косинус Угол)) (* Модуль (Синус Угол)))
)
//--- извлечение частей комплексного числа ---
//Получить вещественную часть комплексного числа
(Функция (ВещЧастьКо Ко) (ПЭЛ Ко 0))
//Получить мнимую часть комплексного числа
(Функция (МнимЧастьКо Ко) (ПЭЛ Ко 1))
//Получить модуль комплексного числа
(Функция (МодульКо Ко)
(Корень (+ (^ (ВещЧастьКо Ко) 2)
(^ (МнимЧастьКо Ко) 2)
)
)
)
//Получить угол комплексного числа
(Функция (УголКо Ко)
(ATan2 (МнимЧастьКо Ко) (ВещЧастьКо Ко))
)
//--- вспомогательные функции ---
//Функция ATanYX аналог ATan2, использовалась, когда функции ATan2 ещё не было в языке Перфо.
//Вычисляет корректно угол в любом квадранте комплексной плоскости
(Функция (ATanYX Y X)
(Перем ПИ 3.14159265358979)
(Если (> X 0)
(ATan (/ Y X))
(Если (< X 0)
(Если (>= Y 0)
(+ (ATan (/ Y X)) ПИ)
(- (ATan (/ Y X)) ПИ)
)
(Если (= Y 0)
0
(Если (> Y 0)
(/ ПИ 2)
(- (/ ПИ 2))
)
)
)
)
)
//Функция форматирует комплексное число в строку
//Позволяет указать разрядность округления частей комплексного числа
(Функция (ФорматКо Ко Разрядность)
(&
(Строка:Окр (ВещЧастьКо Ко) Разрядность)
(Если (< (МнимЧастьКо Ко) 0) "" "+")
(Строка:Окр (МнимЧастьКо Ко) Разрядность)
"i"
)
)
//--- определение арифметических операций ---
//сложение комплексных чисел
(Функция (+ко Ко1 Ко2)
(КоВещМним
(+ (ВещЧастьКо Ко1) (ВещЧастьКо Ко2))
(+ (МнимЧастьКо Ко1) (МнимЧастьКо Ко2))
)
)
//вычитание комплексных чисел
(Функция (-ко Ко1 Ко2)
(КоВещМним
(- (ВещЧастьКо Ко1) (ВещЧастьКо Ко2))
(- (МнимЧастьКо Ко1) (МнимЧастьКо Ко2))
)
)
//умножение комплексных чисел
//умножение через вещественную и мнимую части
(Функция (*ко Ко1 Ко2)
// Извлекаем компоненты
(Перем А (ВещЧастьКо Ко1))
(Перем Б (МнимЧастьКо Ко1))
(Перем В (ВещЧастьКо Ко2))
(Перем Г (МнимЧастьКо Ко2))
// Правила умножения: (А + Бi)(В + Гi) = (АВ - БГ) + (АГ + БВ)i
(Перем РеальнаяЧасть (- (* А В) (* Б Г)))
(Перем МнимаяЧасть (+ (* А Г) (* Б В)))
(КоВещМним РеальнаяЧасть МнимаяЧасть)
)
//умножение через модуль и угол
(Функция (*коугл Ко1 Ко2)
// Вычисляем модули и углы обоих комплексных чисел
(Перем М1 (МодульКо Ко1))
(Перем М2 (МодульКо Ко2))
(Перем У1 (УголКо Ко1))
(Перем У2 (УголКо Ко2))
// Перемножаем модули, складываем углы
(Перем НовыйМодуль (* М1 М2))
(Перем НовыйУгол (+ У1 У2))
// Формируем новое комплексное число
(КоМодУгл НовыйМодуль НовыйУгол)
)
//деление комплексных чисел
//умножение через вещественную и мнимую части
(Функция (/ко Ко1 Ко2)
(Перем А (ВещЧастьКо Ко1))
(Перем Б (МнимЧастьКо Ко1))
(Перем В (ВещЧастьКо Ко2))
(Перем Г (МнимЧастьКо Ко2))
(Перем Знаменатель (+ (^ В 2) (^ Г 2)))
(Перем РеальнаяЧасть (/ (+ (* А В) (* Б Г)) Знаменатель))
(Перем МнимаяЧасть (/ (- (* Б В) (* А Г)) Знаменатель))
(КоВещМним РеальнаяЧасть МнимаяЧасть)
)
//деление через модуль и угол
(Функция (/коугл Ко1 Ко2)
(КоМодУгл
(/ (МодульКо Ко1) (МодульКо Ко2))
(- (УголКо Ко1) (УголКо Ко2))
)
)
//====== ТЕСТЫ ======
//Сложение
//Найти сумму комплексных чисел z1 = 5 ? 6i и z2 = ?3 + 2i.
(Перем Ко (+ко (КоВещМним 5 -6) (КоВещМним -3 2)))
(Вывод "Сложение = " (ФорматКо Ко 0) пс)
//Ответ: 2?4i
//Вычитание
//Выполнить вычитание комплексных чисел (5 + 9i) ? (3 + 24i)
(Перем Ко (-ко (КоВещМним 5 9) (КоВещМним 3 24)))
(Вывод "Вычитание = " (ФорматКо Ко 0) пс)
//Ответ: 2?15i
//Умножение
//Найти произведение комплексных чисел z1 = 2 + 3i и z2 = ?1 + i.
(Перем Ко (*ко (КоВещМним 2 3) (КоВещМним -1 1)))
(Вывод "Умножение = " (ФорматКо Ко 0) пс)
(Уст Ко (*коугл (КоВещМним 2 3) (КоВещМним -1 1)))
(Вывод "Умножение (угл) = " (ФорматКо Ко 0) пс)
//Ответ: -5?1i
//Деление
//Найти частное (2 + 3i) / (5 ? 7i).
(Перем Ко (/ко (КоВещМним 2 3) (КоВещМним 5 -7)))
(Вывод "Деление = " (ФорматКо Ко 3) пс)
(Уст Ко (/коугл (КоВещМним 2 3) (КоВещМним 5 -7)))
(Вывод "Деление (угл) = " (ФорматКо Ко 3) пс)
//Ответ: -0,149+0,392i
//тест функции ATanYX
(Вывод пс "Тест функции ATanYX:" пс)
(Функция (ПроверитьATanYX)
(Перем Тесты
(Список
// Каждая пара: [X Y]
(Список 1 1) // 1 квадрант
(Список -1 1) // 2 квадрант
(Список -1 -1) // 3 квадрант
(Список 1 -1) // 4 квадрант
(Список 0 1) // вверх
(Список 0 -1) // вниз
(Список 1 0) // вправо
(Список -1 0) // влево
(Список 0 0) // ноль
)
)
(Для (Инд 0 (- Тесты.Количество 1))
(Перем Пара (ПЭЛ Тесты Инд))
(Перем X (ПЭЛ Пара 0))
(Перем Y (ПЭЛ Пара 1))
(Перем Угол (ATanYX Y X))
(Вывод "X = " X ", Y = " Y ", Угол = " Угол пс)
)
)
(ПроверитьATanYX)
К началу статьи
Вернуться в раздел:
Примеры по языку Перфо
Перейти в раздел:
Примеры