Пошук рішень системи лінійних рівнянь методом Гауса

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

МІНІСТЕРСТВО АГЕНСТВО ДО ОСВІТИ
Державна освітня установа
Вищої професійної освіти
«Нижегородський державний університет ім. Н.І. Лобачевського »
(ННДУ)
ЕКОНОМІЧНИЙ ФАКУЛЬТЕТ
Кафедра «Економічна інформатика»
Курсова робота
з дисципліни: "Інформатика та
програмування "
на тему:
Пошук рішень системи лінійних рівнянь методом Гауса
(Програмістських і математичним варіантом)
Виконав (ла) студент (ка) II курсу
725-2 групи, очного відділення
(Прізвище та ініціали)
__________
підпис
Науковий керівник:
(Прізвище та ініціали)
____________
підпис
Н. Новгород 2008

ЗМІСТ
1. Введення
2. Постановка завдання
3. Алгоритм рішення.
4. Вихідний текст програми на С + +.
5. Тестування програми
Висновок
Список літератури.

1.Веденіе
Введення в об'єктно-орієнтоване програмування.
Об'єктно-орієнтоване програмування являє собою трохи більше автоматизований спосіб програмування. Об'єктно-орієнтовані програми - це не просто процедурні програми, перекладені на новий синтаксис. Вони повинні будується на новій філософії розробки. Для них потрібна нова стратегія програмування, яку часто буває важко освоїти.
Основна ідея ООП: програма складається з групи об'єктів, часто пов'язаних між собою. У С + + об'єкти описуються за допомогою нового типу даних class. Клас включає в себе набір змінних (даних) та операцій (методів або функцій-членів), які діють на ці змінні. Отриманими об'єктами можна керувати за допомогою повідомлень. У ООП об'єкти включають в себе не тільки дані (дані-члени), а й методи (функції-члени) впливу на ці дані. Ці дві частини в поєднанні утворюють функціональну одиницю програми. Іншими словами, об'єкти містять дані і методи роботи з цими даними. Нижче наведено три основні переваги об'єктно-орієнтованих програм в порівнянні з еквівалентними програмами, розробленими зверху вниз.
Супровід програми. Програми простіше читати і розуміти, ООП дозволяє управляти складністю програми, залишаючи видимими програмісту лише суттєві деталі.
Модифікація програми (додавання або виключення можливостей). Ви можете часто робити доповнення або виключення в програмі, наприклад при роботі з базою даних, просто додаючи і виключаючи об'єкти. Нові об'єкти можуть успадковувати всі властивості базових об'єктів, необхідно тільки додати або прибрати відрізняються властивості. Повторне використання. Можна зберегти грамотно розроблений об'єкт в наборі корисних програм і потім вставити його в нову програму з невеликими змінами чи без змін.
ООП повністю належить до світу С + +, оскільки в З немає основного ядра - абстрактного типу даних class Тому переписати процедурно-орієнтовану програму як об'єктно-орієнтовану набагато складніше, ніж просто підставити замість одного ключового слова інше.
ООП представляє собою техніку програмування, яка дозволяє розглядати основні ідеї як безліч об'єктів. Використовуючи об'єкти, можна уявити завдання, які необхідно виконати, їх взаємодію і будь-які задані умови, які повинні бути дотримані. Структура даних часто утворює основи об'єктів; таким чином в С або С + + тип struct може утворювати елементарний об'єкт. Зв'язок з об'єктом можна організувати за допомогою повідомлень. Використання повідомлень схоже на виклик функцій в процедурно-орієнтованої програмі. Коли людина отримує повідомлення, вступають в дію методи, що містяться в об'єкті. Методи (їх іноді називають фунції-членами) аналогічні функціям процедурно-орієнтованого програмування. Тим не менш метод є частиною об'єкта, а не чимось окремим, як було б у процедурному аналогу.
Основні терміни і положення ООП.
Інкапсуляція даних.
Цей термін включає в себе логічне зв'язування даних з конкретною операцією. Вона так само означає, що вони є не-глобальними доступними всій програмі, а локальними - доступними тільки малої її частини. Інкапсуляція також автоматично має на увазі захист даних. Саме для цього призначена структура class в С + +. У класі управління функціональними деталями об'єкта здійснюється за допомогою специфікатором private, public, protected.
Ієрархія класів.
У загальному випадку можна уявити собі ієрархію класів як родовід в генеалогічному древі, де клас С + + являє собою шаблон для створення класів-нащадків. Об'єкти, отримані з опису класу, називають екземплярами цього класу. Можна створити ієрархію класів з класом-батьком і декількома класами-нащадками. Основою для цього є похідні класи.
Успадкування.
Успадкування в ООП дозволяє класу отримувати властивості іншого класу об'єктів. Батьківський клас є шаблоном для похідного класу; цей шаблон можна змінювати різними способами. Спадкування є важливим положенням, оскільки воно дозволяє повторно використовувати визначення класу без значних змін у коді.
Поліморфізм.
Будується на описаній вище концепції наслідування. Програма посилає одне і теж повідомлення як об'єкту батьківського класу, так і всім об'єктам похідних класів. І батьківський клас, і класи-нащадки дадуть відповідь на повідомлення відповідним чином. Поліморфізм дає можливість доповнювати вже існуючі частини програми.
Віртуальні функції.
Віртуальні функції визначаються у батьківському класі, а в похідних класах відбувається довизначення цих функцій і для них створюються нові реалізації. При роботі з віртуальними функціями повідомлення передаються як покажчики, які вказують на об'єкт замість прямої передачі об'єкту. Віртуальні функції використовують таблицю для адресної інформації. Ця таблиця ініціалізується під час виконання за допомогою конструктора. Конструктор викликається кожного разу, коли створюється об'єкт його класу. Завдання конструктора в даному випадку полягає у зв'язуванні віртуальної функції з таблицею адресної інформації. Під час компіляції адресу віртуальної функції невідомий; замість цього їй відводиться позиція в таблиці адрес.

2.Постановка завдання
С + +-мову предметно-орієнтованого програмування. Мова С + + підтримує процедурну і об'єктно-орієнтовану парадигми програмування.
Об'єктно-орієнтоване програмування - це новий спосіб підходу до програмування. Таке програмування, узявши кращі риси структурного програмування, доповнює його новими ідеями, які переводять в нову якість підхід до створення програм.
Найбільш важливе поняття мов об'єктно-орієнтованого програмування - це поняття об'єкта (object). Об'єкт - це логічна одиниця, яка містить дані і правила (методи) обробки цих даних. У мові С + + в якості таких правил обробки виступають функції, тобто об'єкт в Borland C + + об'єднує в собі характеристики та функції, що обробляють ці дані. Одним з найголовніших понять мови С + + є поняття класу. У мові С + + для того, щоб визначити об'єкт, треба спочатку визначити його форму за допомогою ключового слова Найближчою аналогією класу є структура. Пам'ять виділяється об'єкту тільки тоді, коли клас використовується для його створення. Будь-який об'єкт мови С + + має однакові атрибути і функціональність з іншими об'єктами того ж класу. За створення своїх класів і поведінку об'єктів цих класів повну відповідальність несе сам програміст. Працюючи в деякому середовищі, програміст отримує доступ до великих бібліотек стандартних класів. Зазвичай, об'єкт знаходиться в деякому унікальному стані, обумовленому поточними значеннями його атрибутів. Функціональність об'єктного класу визначається можливими операціями над екземпляром цього класу.
Метод Гауса для розв'язування СЛАР.
Метод Гаусса. (Карл Фрідріх Гаус (1777-1855) німецький математик) На відміну від матричного методу і методу Крамера, метод Гаусса може бути застосований до систем лінійних рівнянь з довільним числом рівнянь і невідомих. Метод Гауса - один з основних результатів лінійної алгебри та аналітичної геометрії, до нього зводяться безліч інших теорем і методів лінійної алгебри (теорія та обчислення визначників, розв'язування систем лінійних рівнянь, обчислення рангу матриці і зворотної матриці, теорія базисів скінченновимірних векторних просторів і т.д .).
Задача пошуку рішень системи лінійних рівнянь має не тільки самостійне значення, але часто є складовою частиною алгоритму вирішення багатьох нелінійних задач. Основні методи вирішення СЛУ:
- Метод Гауса;
- Метод звернення матриці;
- Ітераційні методи.
Матриця A з елементами a ij називається ступінчастою, якщо вона володіє наступними двома властивостями:
1. якщо в матриці є нульова рядок, то всі рядки нижче неї також нульові;
2. нехай a ij не рівне 0 - перший ненульовий елемент у рядку з індексом i, тобто елементи a il = 0 при l <j. Тоді всі елементи в j-му стовпці нижче елемента a ij дорівнюють нулю, і всі елементи лівіше і нижче a ij також дорівнюють нулю: a kl = 0 при k> i і l = <j.
Ступенева матриця виглядає так:

Тут темними квадратиками відмічені перші ненульові елементи рядків матриці. Білим кольором зображуються нульові елементи, сірим кольором - довільні елементи.
Алгоритм Гауса використовує елементарні перетворення матриці двох типів.
· Перетворення першого роду: два рядки матриці міняються місцями, і при цьому знаки всіх елементів однієї з рядків змінюються на протилежні.
· Перетворення другого роду: до одного рядка матриці додається інший рядок, помножена на довільне число.
Елементарні перетворення зберігають визначник і ранг матриці, а також безліч рішень лінійної системи. Алгоритм Гауса призводить довільну матрицю елементарними перетвореннями до ступінчастого вигляду. Для ступінчастою квадратної матриці визначник дорівнює добутку діагональних елементів, а ранг - числу ненульових рядків (рангом за визначенням називається розмірність лінійної оболонки рядків матриці).
Метод Гаусса в математичному варіанті полягає в наступному:
1. шукаємо спочатку ненульовий елемент у першому стовпці. Якщо всі елементи першого стовпчика нульові, то переходимо на дві колонки, і так далі. Якщо знайшли ненульовий елемент у k-му рядку, то за допомогою елементарного перетворення першого роду міняємо місцями першу і k-ю рядки, домагаючись того, щоб перший елемент першого рядка різнився від нуля;
2. використовуючи елементарні перетворення другого роду, Обнуляємо всі елементи першого стовпчика, починаючи з другого елементу. Для цього від рядка з номером k віднімаємо перший рядок, помножену на коефіцієнт a k1 / a 11.
3. переходимо на дві колонки (або j-му, якщо всі елементи першого стовпчика були нульовими), і надалі розглядаємо тільки частина матриці, починаючи із другого рядка і нижче. Знову повторюємо пункти 1) і 2) до тих пір, поки не наведемо матрицю до ступінчастого вигляду.
Програмістський варіант методу Гауса має три відмінності від математичного:
1. індекси рядків і стовпців матриці починаються з нуля, а не з одиниці;
2. недостатньо знайти просто ненульовий елемент у стовпці. У програмуванні всі дії з числами виробляються приблизно, тому можна вважати, що точного рівності дійсних чисел взагалі не буває. Деякі компілятори навіть видають попередження на кожну операцію перевірки рівності дійсних чисел. Тому замість перевірки на рівність нулю числа a ij слід порівнювати його абсолютну величину ij з дуже маленьким числом ε (наприклад, ε = 0.00000001). Якщо ij = <ε, то слід вважати елемент a ij нульовим;
3. при обнулення елементів j-го стовпця, починаючи з рядка i + 1, ми до k-му рядку, де k> i, додаємо i-й рядок, помножену на коефіцієнт r =-a kj / a ij:
Така схема працює нормально тільки тоді, коли коефіцієнт r за абсолютною величиною не перевершує одиниці. В іншому випадку, помилки округлення множаться на великий коефіцієнт і, таким чином, експоненціально ростуть. Математики називають це явище нестійкістю обчислювальної схеми. Якщо обчислювальна схема нестійка, то отримані з її допомогою результати не мають ніякого відношення до вихідної завданню. У нашому випадку схема стійка, коли коефіцієнт r =-a kj / a ij не перевершує по модулю одиниці. Для цього має виконуватися нерівність Звідси випливає, що при пошуку дозволяє елемента в j-му стовпці необхідно знайти не перший-ліпший ненульовий елемент, а максимальний за абсолютною величиною. Якщо він за модулем не перевершує ε, то вважаємо, що всі елементи стовпця нульові; інакше міняємо місцями рядки, ставлячи його на вершину стовпця, і потім Обнуляємо стовпець елементарними перетвореннями другого роду.
Основна ідея методу Гаусса-привести матрицю систему до діагонального вигляду, тобто всі елементи головної діагоналі-нулі. Для приведення матриці до такого виду, ми вибираємо самий верхній рядок матриці, і віднімаємо її з усіх інших рядків, помноживши її для кожного рядка на певний коефіцієнт, так, що самий лівий стовпець нижче головної діагоналі заповнений нулями. Віднімається з коефіцієнтом рядок називається поточним рядком. Вибираючи поточний рядок спочатку верхню, а потім все нижче і нижче, ми доб'ємося, що всі елементи нижче головної діагоналі буде дорівнюють нулю. Цю частину методу-обробка рядків по поточному рядку і належить распараллелівать.
Суть методу полягає в послідовному виключенні невідомих. Розглянемо систему лінійних рівнянь:

Розділимо обидві частини 1-го рівняння на a 11  0, потім: 1) помножимо на а 21 і віднімемо з другого рівняння 2) помножимо на а 31 і віднімемо із третього рівняння і т.д. Отримаємо:, де d 1 j = a 1 j / a 11, j = 2, 3, ..., n +1. D ij = A ij - a i 1 d 1 j i = 2, 3, ..., n; j = 2, 3, ..., n +1. Далі повторюємо ці самі дії для другого рівняння системи, потім - для третього і т.д.


Приклад. Вирішити систему лінійних рівнянь методом Гауса.

Складемо розширену матрицю системи.
А * =

Таким чином, вихідна система може бути представлена ​​у вигляді:
,
звідки отримуємо: x 3 = 2; x 2 = 5; x 1 = 1.
Приклад. Вирішити систему методом Гаусса.

Складемо розширену матрицю системи.


Таким чином, вихідна система може бути представлена ​​у вигляді:
,
звідки отримуємо: z = 3; y = 2; x = 1.

Робота з файлами.

Стандартна бібліотека С + + містить набір функцій для роботи з файлами. Ці функції описано в стандарті ANSI. Відзначимо, що файловий ввід-висновок не є частиною мови С +, і ANSI-функції - не єдиний засіб введення-виведення. Так, в операційній системі Unix більш популярний інший набір функцій вводу-виводу, який можна використовувати не тільки для роботи з файлами, але і для обміну по мережі. У C + + часто використовуються бібліотеки класів для введення-виведення. Тим не менш, функції ANSI-бібліотеки підтримуються всіма С + +-компіляторами, і тому програми, застосовують їх, легко переносяться з однієї платформи на іншу. Прототипи функцій вводу-виводу і використовуються для цього типи даних описані в стандартному заголовному файлі "stdio.h.

Відкриття файлу: функція fopen.

Для доступу до файлу застосовується тип даних FILE. Це структурний тип, ім'я якого задано за допомогою оператора typedef в стандартному заголовному файлі "stdio.h". Програмісту не потрібно знати, як влаштована структура типу файл: її пристрій може бути системно залежним, тому з метою переносимості програм звертатися явно до полів структури FILE заборонено. Тип даних "покажчик на структуру FILE використовується в програмах як чорний ящик: функція відкриття файлу повертає цей покажчик у разі успіху, і надалі всі файлові функції застосовують його для доступу до файлу.
Тут path - шлях до файлу (наприклад, ім'я файлу або абсолютний шлях до файлу), mode - режим відкриття файлу. Рядок mode може містити кілька букв. Буква "r" (від слова read) означає, що файл відкривається для читання (файл повинен існувати). Буква "w" (від слова write) означає запис в файл, при цьому старе вміст файлу губиться, а в разі відсутності файлу він створюється. Буква "a" (від слова append) означає запис в кінець існуючого файлу або створення нового файлу, якщо файл не існує.
У деяких операційних системах є відмінності в роботі з текстовими і бінарними файлами (до таких систем відносяться MS DOS і MS Windows; в системі Unix відмінностей між текстовими та бінарними файлами немає). У таких системах при відкритті бінарного файлу до рядка mode слід додавати букву "b" (від слова binary), а при відкритті текстового файлу - букву "t" (від слова text). Крім того, при відкритті можна дозволити виконувати як операції читання, так і записи; для цього використовується символ + (плюс). Порядок букв в рядку mode такий: спочатку йде одна з букв "r", "w", "a", потім у довільному порядку можуть йти символи "b", "t", "+". Букви "b" і "t" можна використовувати, навіть якщо в операційній системі немає відмінностей між бінарними і текстовими файлами, в цьому випадку вони просто ігноруються.
3.Описание алгоритму розв'язання СЛАР методом Гауса
Скласти програму вирішення систем лінійних алгебраїчних рівнянь з матрицею порядку n методом Гаусса з використанням мови С + +.
Алгоритм розв'язання системи лінійних рівнянь за допомогою методу Гаусса. Алгоритм реалізований на мові С + +.
Нехай у нас є система N лінійних рівнянь
a 11 x 1 + a 12 x 2 + a 13 x 3 + ... a 1N x N = b 1
a 21 x 1 + a 22 x 2 + a 23 x 3 + ... a 2N x N = b 2
a 31 x 1 + a 32 x 2 + a 33 x 3 + ... a 3N x N = b 3
...
a N1 x 1 + a N2 x 2 + a N3 x 3 + ... a NN x N = b N
де x i - невідомі, a ij - коефіцієнти при невідомих, b i - вільні члени в рівняннях, i, j пробігають значення від 1 до N.
Мета завдання - знаючи a ij і b i знайти x i.
Суть методу Гаусса полягає в тому, що за допомогою деяких операцій вихідну систему рівнянь можна звести до більш простій системі. Ця проста система має трикутний вигляд:
a 11 x 1 +
a 12 x 2 +
a 13 x 3 +
...
a 1N x N = b 1
a 22 x 2 +
a 23 x 3 +
...
a 2N x N = b 2
a 33 x 3 +
...
a 3N x N = b 3
...
...
a NN x N = b N
Особливість цієї системи - в рядках з номером i всі коефіцієнти a ij при j <i дорівнюють нулю.
Якщо ми змогли привести нашу систему рівнянь до такого трикутникове увазі, то вирішити рівняння вже просто. З останнього рівняння знаходимо x N = b N / a NN. Далі підставляємо його в передостаннє рівняння і знаходимо з нього x N-1. Підставляємо обидва знайдених рішення в наступне з кінця рівняння і знаходимо x N-2. І так далі, поки не знайдемо x 1, на чому рішення закінчується. Така процедура називається зворотним прогоном.
Тепер перейдемо до питання як же домогтися того, щоб система стала трикутною.
З лінійної алгебри відомо що якщо до деякої рядку системи рівнянь додати будь-яку лінійну комбінацію будь-яких інших рядків цієї системи, то рішення системи не зміниться. Під лінійної комбінацією рядків розуміється сума рядків, кожна з яких множиться на деяке число (в принципі, будь-яке).
Потрібно, щоб у другому рядку вийшло рівняння, в якій відсутній член при x 1. Додамо до цієї рядку перший рядок, помножений на деяке число M.
(A 11 x 1 + a 12 x 2 + a 13 x 3 + ... a 1N x N = b 1) * M +
a 21 x 1 + a 22 x 2 + a 23 x 3 + ... a 2N x N = b 2
Отримаємо
(A 11 * М + a 21) x 1 + ... = B 1 * M + b 2
Для того, щоб член при x 1 дорівнював нулю, потрібно, щоб M = - a 21 / a 11. Виконавши цю операцію, що вийшло рівняння запишемо замість другого і приступимо до третього рівняння. До нього ми додамо перше рівняння, помножене на M = - a 31 / a 11 і теж отримаємо нуль замість члена при x 1. Таку операцію потрібно виконати над усіма іншими рівняннями. У результаті отримаємо систему такого виду:
a 11 x 1 +
a 12 x 2 +
a 13 x 3 +
...
a 1N x N = b 1
a 22 x 2 +
a 23 x 3 +
...
a 2N x N = b 2
a 32 x 2 +
a 33 x 3 +
...
a 3N x N = b 3
...
a N2 x 2 +
a N3 x 3 +
...
a NN x N = b N
Після цього будемо позбуватися від членів при x 2 в третьому, четвертому, N-му рівнянні. Для цього потрібно до рівняння з j-м номером додати друге рівняння, помножене на M = - a j2 / a 22. Виконавши цю операцію над усіма іншими рівняннями, отримаємо систему де немає членів з x 2 в рівняннях з номером більше 2.
І так далі ... Проробивши це для третього члена, четвертого ... до тих пір, поки не закінчаться рівняння, отримаємо в підсумку систему трикутного виду.
Алгоритм описаний в псевдокоді (команди у вигляді тексту російською мовою).
ПРОЦЕС 0: (головний процес)
1.Разослать всіх процесів кількість поточних рядків.
(Чи не всім процесам, якщо процесів більше ніж рядків).
2.ЦІКЛ по рядку (вибір поточного рядка)
1.Разослать всіх процесів поточний рядок.
(Якщо число процесів більше ніж залишилося рядків для обробки (рядків нижче поточного рядка), то розіслати поточний рядок не всім процесам, а тільки тим, які будуть задіяні в обробці рядків.)
2.Разослать всіх процесів рядка для обробки (надсилаємо рядок, потім рядка в матриці). Розділити між процесами рядки нижче поточної. Поділяємо так в циклі по рядках роздаємо по одній кожному процесу, поки не закінчаться рядки, по процесах 1 .. N йдемо циклічно.
3.Разослать всіх процесів кількості рядків, які були надіслані їм для обробки.
4.Прінять від процесів 1 .. N оброблені рядки, занести їх в матрицю. (Приймаються рядок і номер рядка в матриці)
5.Вибрать наступну поточний рядок - новий крок циклу.
КІНЕЦЬ ЦИКЛУ
3.Вичісліть рішення системи по діагональної матриці.
4.Видать результат роботи.
5.Завершіть роботу.

ПРОЦЕС 1 .. N:
1.Прінімаем кількість поточних рядків.
2.ЦІКЛ ОБРОБКИ ОТРИМАНИХ СТРОК
1.Прінімаем повідомлення про кількість рядків для обробки
2.Якщо число рядків для обробки> 0 то:
{
1.Прінімаем повідомлення з поточним рядком
2.ЦІКЛ обробки рядків
1.Прінімаем повідомлення з рядком для обробки.
(Отримуємо ще номер рядка в матриці).
2.Обрабативаем отриманий рядок
3.Посилаем головному процесу результати роботи. Для кожного рядка посилаємо рядок і номер рядка.
4.Ідем на новий крок циклу обробки рядків.
3.Сінхронізіруемся.
}
3.Завершіть процес.
4.Ісходний текст програми
Скласти програму вирішення систем лінійних алгебраїчних рівнянь з квадратною невиродженої матрицею порядку n методом Гаусса з використанням мови С + +.
/ / Рішення системи лінійних рівнянь методом Гауса.
# Include <io.h>
# Include "stdio.h"
# Include "conio.h"
# Include <windows.h>
# Include <iostream>
# Include <time.h>
# Include <io.h>
# Include <fcntl.h>
# Include <string.h>
# Include "stdafx.h"
using namespace std;
# Include <stdio.h> / / Описи функцій вводу-виводу
# Include <math.h> / / Описи математичних функцій
# Include <stdlib.h> / / Описи функцій malloc і free
const int n = 3;
void ReadData ()
{
int n;
double A [n] [n];
FILE * f = fopen ("l1.txt", "rt");
if (f! = 0)
printf ("CAN'T OPEN FILE \ nPlease, f ** k off!");
{
fscanf (f, "% d", & n);
printf ("Sborka matritsi m-na n-: \ n");
for (int i = 0; i <n; i + +)
{
for (int j = 0; j <n; j + +)
{
fscanf (f, "% d", & A [i] [j]);
printf ("% d", A [i] [j]);
}
printf ("\ n");
}
printf ("\ n \ n");
fclose (f);
}
}
void Gauss
(Double X [n], const double Z [n] [n], const double Y [n])
{
ReadData ();
double A [n] [n]; / / матриця коефіцієнтом Гауса
double B [n]; / / робочий масив вільних членів
int i,
int j,
int k; / / робітничі змінні
for (i = 0; i <n; i + +) / / копіювання в робочу матрицю A
{
for (j = 0; j <n; j + +)
A [i] [j] = Z [i] [j];
B [i] = Y [i]; / / копіювання вільних членів
X [i] = 0;
}
for (k = 0; k <n-1; k + +)
for (i = k +1; i <n; i + +) / / перетворення рядків
{
double r = A [i] [k] / A [k] [k];
for (j = k; j <n; j + +)
A [i] [j] -= A [k] [j] * r;
B [i] -= B [k] * r;
}
X [n-1] = B [n-1] / A [n-1] [n-1];
for (i = n-2; i> = 0; i -)
{
double s = 0;
for (j = i +1; j <n; j + +)
s + = A [i] [j] * X [j];
X [i] = (B [i] - s) / A [i] [i];
}
printf ("\ n");
for (i = 0; i <n; i + +)
{Printf ("\ n");
for (j = 0; j <n; j + +)
printf ("% 8.2lf", A [i] [j]);
printf ("% 8.2lf", B [i]);
}
}
/ * ------------------------------------------------ - * /
void main (void)
{
ReadData ();
double X [n]; / / коріння системи лінійних рівнянь
short i, j; / / робітничі змінні
printf ("matritsa A * matritsa B \ n");
for (i = 0; i <n; i + +) / / цикл рядків
{
printf ("\ n"); / / нова рядок на моніторі
for (j = 0; j <n; j + +)
printf ("% 8.2lf", A [i] [j]);
printf ("% 8.2lf", B [i]);
}
printf ("\ n");
printf ("stypen4atii vid matritsi \ n");
Gauss (X, A, B); / / рішення методом Гауса
printf ("\ n");
printf ("\ n");
printf ("zna4enia peremennih x1, x1, x3 \ n");
printf ("\ n X =");
for (i = 0; i <n; i + +)
printf ("% 8.2lf", X [i]);
printf ("\ n");
printf ("\ n");
printf ("rang = \ n");
getch ();
}

5.Тестірованіе програми
Результати рішення системи з трьома невідомими:

Результати рішення системи з чотирма невідомими:

Дані у файлі:
Ім'я файлу l1
4
2 1 4 1
3 1 3 2
2 4 5 1
5 2 2 2
Розмірності матриць = 4
Матриця А
2 1 4
3 1 3
2 4 5
5 2 2
Матриця В
1
2
1
2

Висновок
В результаті виконання курсового проекту були розроблені два класи функцій для вирішення найпростіших завдань лінійної алгебри. Число цих функцій порівняно невелика, проте можна легко додати ці класи більш складні функції, побудовані на базі вже існуючих. Класи дозволяють працювати з матрицями і векторами, елементи яких можуть бути будь-якого типу, однак на практиці найчастіше використовується цілий тип і тип чисел з плаваючою комою. Класи написані на мові С + +, однак можуть бути легко переписані на будь-якому з сучасних мов програмування, так як приведені досить прості алгоритми всіх компонентних функцій. Були максимально передбачені всілякі помилки, які можуть виникнути при використанні функцій даних класів. Особлива увага приділялася розумному виділенню пам'яті подоб'екти під час виконання програми, тому всі функції були ретельно отлажени.Класси Matrix і Vector можуть бути ефективно застосовані на практиці в завданнях, які потребують операцій з матрицями і векторами, а також пов'язаних з рішенням систем лінійних алгебраїчних рівнянь.

Список літератури
1. Початковий курс С і С + +.: Підручник. / Б. І. Березін. Москва: "ДІАЛОГ-МІФІ", 1999р.
2. Мова програмування С + +. : Підручник. /. Страуструп. Київ: "ДіаСофт", 1993 р.
3. Введення в мову С + +: Підручник. / Бьярн Страустрап.
- СПб.: 1995.
4. Структури та алгоритми обробки даних: Підручник. / Матяш В.А., Путілов В.А., Фільчаков В.В. , Щокін С.В. - Апатити, КФ ПетрГУ, 2000
5. С + + / Девіс Стефан Р. ,4-е видання: Пер. з англ.: - М.: Видавничий дім «Вільямс», 2003
6. Основи програмування: Учеб. Для середовищ. проф. освіти / І. Г. Семакін, А. П. Шестаков. - М., 2006.
7. С + + експрес курс: Підручник. / Лаптєв В.В. - СПб.: БХВ-Петербург 2004.
8. С + + навчальний курс: Підручник. / Франка П. - СПб.: Пітер 2005.
9. МОДЕЛІ І Структури ДАНИХ: / Навчальний посібник /
Д. Далека, А.С. Дерев'янко, О.Г. Кравець, Л.Є. Тімановская - Харків: ХДПУ, 2000
10.Висшая математика для економістів: підручник для студентів вузів / Н.Ш.Кремер ,3-е ізданіе.-М.: ЮНИТИ-ДАНА, 2006
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
59.8кб. | скачати


Схожі роботи:
Розв язання систем лінійних рівнянь методом Гауса
Чисельне рішення системи лінійних рівнянь за допомогою методу виключення Гауса з вибором головного
Рішення системи лінійних алгебраїчних рівнянь методом Крамера
Розвязання рівнянь методом оберненої матриці та методом Гауса
Розв язування системи лінійних алгебраїчних рівнянь за правилом Крамера методом Гаусса та за до
Системи лінійних рівнянь
Системи лінійних алгебраїчних рівнянь
Системи лінійних рівнянь і нерівностей
Розвязання системи лінійних алгебраїчних рівнянь
© Усі права захищені
написати до нас