РІШЕННЯ
СИСТЕМИ ЛІНІЙНИХ АЛГЕБРАЇЧНИХ РІВНЯНЬ метод Крамера Зміст Введення
1. Створення С #
2. Постановка завдання
3. Метод Крамера
4. Програмна реалізації алгоритму методу Крамера
Висновок
Список використаних джерел
Введення На практиці в більшості випадків знайти точної рішення виниклої
математичної задачі не вдається. Це відбувається головним чином не тому, що ми не вміємо цього зробити, а оскільки дані рішення зазвичай не виражається у звичних для нас елементарних чи інших відомих функціях. Тому велике значення придбали
чисельні методи, особливо у зв'язку із зростанням ролі
математичних методів в різних галузях
науки і техніки та з появою високопродуктивних ЕОМ.
У цій
курсовій роботі розглянута важлива, з точки зору прикладних задач: метод Крамера для рішення лінійних алгебраїчних рівнянь.
1. СОЗДЕНІЕ С # Найчастіше занадто багато чого вимог від інструментів, з якими
працюємо, особливо, коли це стосується мов
програмування. Хоча таких мов існує безліч, але тільки деякі з них по-справжньому сильні. Ефективність мови полягає в його потужності і одночасно - в гнучкості.
Синтаксис мови повинен бути лаконічним, але ясним.
Він має сприяти створенню коректного коду та надавати реальні можливості, а не ультрамодні (і, як правило, тупикові) рішення. Нарешті, потужний
мова повинна
мати одне нематеріальне якість: викликати
відчуття гармонії. Якраз такою мовою
програмування і є С #. Створений компанією Microsoft для підтримки середовища. NET Framework, мову С # спирається на багату спадщину в області програмування. Його головним
архітектором був провідний фахівець у цій галузі - Андерс Хейлсберг (Anders Hejlsberg).
С # - прямий нащадок двох найуспішніших у світі комп'ютерних мов: З і C + +. Від С він успадкував
синтаксис, ключові слова й оператори. Він дозволяє побудувати і удосконалити об'єктну модель, визначену в C + +. Крім
того, С # близько пов'язаний з іншим дуже успішним мовою: Java. Маючи спільне походження, але розрізняючись в багатьох важливих аспектах, С # і Java - це скоріше "двоюрідні брати". Наприклад, вони обидва підтримують програмування розподілених систем і обидва користуються проміжний код для досягнення переносимості, але розрізняються при цьому в деталях реалізації. Спираючись на потужний фундамент, який становлять успадковані характеристики, С # містить ряд важливих нововведень, які піднімають
мистецтво програмування на новий щабель. Наприклад, до складу елементів мови С # включені такі
поняття, як делегати (представники), властивості, індексатори і події. Долучення також
синтаксис, який підтримує атрибути; спрощено створення компонентів за рахунок виключення проблем, пов'язаних з COM (Component Object Model - модель компонентних об'єктів Microsoft -
стандартний механізм, що включає інтерфейси, за допомогою яких об'єкти надають свої служби іншим об'єктам).
І ще. Подібно Java мову С # пропонує засоби динамічного виявлення помилок, забезпечення безпеки та керованого виконання програм. Але, на відміну від Java, C # дає програмістам доступ до покажчиків. Таким чином, С # поєднує первозданну міць C + + з типовою безпекою Java, яка забезпечується наявністю механізму контролю типів (type checking) і коректним використанням шаблонних класів (template class). Більше того,
мова С # відрізняється тим, що
компроміс між потужністю і надійністю ретельно збалансований і практично прозорий (не помітний для користувача або програми).
Протягом всієї історії розвитку обчислювальної техніки
еволюція мов програмування означала зміна обчислювального середовища, способу
мислення програмістів і самого підходу до програмування.
Мова С # не є винятком. У безперервному
процесі удосконалення, адаптації та впровадження нововведень З # в даний час знаходиться на передньому краї. Це - мова, ігнорувати
існування якого не може жоден професійний програміст.
2. Постановка завдання До вирішення систем лінійних рівнянь зводяться численні практичні завдання. Можна з повною
підставою стверджувати, що рішення лінійних систем є однією з найпоширеніших і важливих завдань обчислювальної математики [1,2].
(1)
Сукупність коефіцієнтів цієї системи запишемо у вигляді таблиці:
Запишемо систему
n лінійних алгебраїчних рівнянь з
n невідомими.
Дана таблиця
n 2 елементів, що складається з
n рядків та
n стовпців, називається квадратною
матрицею порядку
n. Якщо подібна таблиця містить
nm елементів, розташованих у
n рядках і
m стовпцях, то вона називається прямокутною матрицею.
Використовуючи поняття
матриці А, систему рівнянь (3) можна записати у векторно-матричному вигляді:
,
або, у більш компактній запису,
де
х і
b - вектор-стовпець невідомих і вектор-стовпець правих частин відповідно.
3. Метод Крамера Алгоритм Крамера, згідно [1,2], виражається формулами
де
...,
При цьому необхідною і достатньою умовою існування єдиного рішення, є не рівність нулю головного визначника системи
.
Блок-схема алгоритму представлена на малюнку.
SHAPE \ * MERGEFORMAT
4. Програмна реалізації алгоритму метод Крамера Основним методом класу Programm, є метод Main. З нього починається виконання програми. У нашому випадку, він містить
найпростіший користувальницький інтерфейс, за допомогою якого користувач вводить розмірність системи, елементи матриці системи
А і вектора правих частин
b (1, розділ 1), а після необхідних обчислень на екрані з'являється результат - елементи вектора
x. У роботі, алгоритм Крамера для більшої читабельності, розбитий на окремі
функції - методи:
static double det (int n, double [,] B) - метод обчислює
визначник матриці. Параметрами цього методу є - кількість рівнянь
(n), а так само матриця, в нашому випадку
B. Визначник матриці обчислюється непосдедственно, тобто розкладанням по першому рядку [3];
static void equal (int n, double [,] A, double [,] B) - метод привласнювали
матриці (
), Де
n-розмірність матриць;
static int SLAU_kramer (int n, double [,] A, double [] b, double [] x) - метод
реалізує метод Крамера, згідно блок схемою глави 2.
В якості
мови програмування ми використовували об'єктно - орієнтована
мова С #. Наш
вибір обумовлений його гнучкістю в розробці і створенні програмних продуктів [4-7].
Текст програми призведе нижче.
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication_Kramer
{
class Program
{
static void Main (string [] args)
{
int n / * кількість рівнянь * /
double [,] A = new double [3,3]; / * матриця системи * /
double [] b = new double [3]; / * вектор правих частин * /
double [] x = new double [3]; / * вектор рішення * /
char qq;
Console.Write ("Введіть кількість рівнянь (<= 3) n ->");
n = Convert.ToInt32 (Console.ReadLine ());
if (n> 3 | | n <= 1)
{
Console.WriteLine ("Помилка в розмірності системи (n = 2,3)");
Convert.ToInt32 (Console.ReadLine ());
return;
}
for (int i = 0; i <n; i + +)
for (int j = 0; j <n; j + +)
{
Console.Write ("A {0} {1} ->", i, j);
A [i, j] = Convert.ToDouble (Console.ReadLine ());
}
for (int i = 0; i <n; i + +)
{
Console.Write ("b {0} ->", i);
b [i] = Convert.ToDouble (Console.ReadLine ());
}
if (SLAU_kramer (n, A, b, x) == 1)
{
Console.WriteLine ("Система не має рішення");
Convert.ToInt32 (Console.ReadLine ());
return;
}
else
for (int i = 0; i <n; i + +)
Console.WriteLine ("x" + i + "=" + x [i]);
Console.ReadLine ();
}
private
static double det (int n, double [,] B)
{
if (n == 2)
return B [0,0] * B [1,1] - B [0,1] * B [1,0];
return B [0,0] * (B [1,1] * B [2,2] - B [1,2] * B [2,1]) - B [0,1] * (B [1, 0] * B [2,2] - B [1,2] * B [2,0]) +
B [0,2] * (B [1,0] * B [2,1] - B [1,1] * B [2,0]);
}
static void equal (int n, double [,] A, double [,] B)
{
for (int i = 0; i <n; i + +)
for (int j = 0; j <n; j + +)
A [i, j] = B [i, j];
}
static void change (int n, int N, double [,] A, double [] b)
{
for (int i = 0; i <n; i + +)
A [i, N] = b [i];
}
public
static int SLAU_kramer (int n, double [,] A, double [] b, double [] x)
{
double [,] An = new double [3,3];
double det1 = det (n, A);
if (det1 == 0) return 1;
for (int i = 0; i <n; i + +)
{
equal (n, An, A);
change (n, i, An, b);
x [i] = det (n, An) / det1;
}
return 0;
}
}
}
Програма, яка реалізує метод Крамера, була протестована на наступний тестових прикладах.
Вирішити систему другого порядку
рішення систем є вектор
.
Результат виконання програми представлений на рис. 1.
Рис. 1. Результат виконання програми для системи другого порядку.
Вирішити систему третього порядку
рішення систем є вектор
.
Результат виконання програми представлений на рис. 2.
Рис. 2. Результат виконання програми для системи третього порядку.
У ході
тестування або, так само були розглянуті випадки неправильного введення розмірності, результат виконання на рис.3 і
випадок несумісності системи рівнянь рис.4.
Рис. 3. Результат виконання програми в слуае помилкового введення розмірності системи.
Рис. 4. Результат виконання програми у разі несумісності системи.
Слід зауважити, що в програмі не ошуществляется перевірка правильність введення елементів матриці і вектора правих частин.
ВИСНОВОК У роботі, нами був програмно реалізовано метод Крамера для розв'язання
системи лінійних алгебраїчних рівнянь. Ми використовували необхідна умова існування розв'язку, тобто не рівність нулю головного визначника системи.
Відмінна риса цього методу полягає в неодноразовому обчисленні визначника матриці. З обчислювальної точки зору це трудомістка
операція зі зростанням кількості елементів. У роботі була розглянута система 3-го порядку, а
визначники обчислювалися безпосередньо.
Однак це не знижує цінність
роботи, оскільки перехід до вирішення СЛАР з невідомою кількістю рівнянь здійснюється зміною методу, який обчислює визначник матриці.
СПИСОК ВИКОРИСТОВУЮТЬСЯ ДЖЕРЕЛ 1. Турчак Л.І. Основи чисельних методів / Л.І. Турчак, П.В. Плотніков. - М.: Фізматліт, 2002. - 304 с.
2.
Демидович Б. П.
Чисельні методи аналізу / Б.П.
Демидович, І.А. Марон,
Е.З. Шувалова. - М.:
Наука, 1967 .- 368 с.
3.
Вища математика для економістів: Уч. Для вузів / Н.Ш. Кремер, Б.А. Путко, І.М. Тришин, М.М. Фрідман.-М.:
Банки і
біржі, 1998.-471 с.
4. Мохіка Х. Мова С #: розробка Web-додатків на ASP.NET / Х. Мохіка; пер. з англ. А.А. Слінкіна. - М.: НТ Пресс, 2006. - 464 с. - (Quick Start).
5. Ліберті Дж.
Програмування на C #: пров. з англ. / Дж. Ліберті. - 2-е вид. - СПб.:
Символ, 2003. - 688 с.: Іл.
6. З #: пров. з англ. / К. Ватсон, М. Белліназо, О. Корнс та ін - СПб.: Пітер, 2006. - 861 с.
7. Галісеев Г.В.
Програмування на мові С #: самовчитель / Г.В. Галісеев. - М.: Вільямс, 2006. - 368 с.: Іл.