РІШЕННЯ СИСТЕМИ ЛІНІЙНИХ АЛГЕБРАЇЧНИХ РІВНЯНЬ метод Крамера
Зміст
Введення
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 с.: Іл.
Зміст
Введення
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].
Сукупність коефіцієнтів цієї системи запишемо у вигляді таблиці:
Запишемо систему 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) - метод привласнювали матриці (
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 с.: Іл.