ВычМат / ВычМат(1)
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
НАБЕРЕЖНОЧЕЛНИНСКИЙ ИНСТИТУТ (ФИЛИАЛ)
КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ
ЛАБОРАТОРНАЯ РАБОТА №1
«Решение системы линейных уравнений прямыми методами»
По дисциплине
«Вычислительная математика»
Выполнил:
Студент группы 2161121
Золотых С.В.
Проверил:
Мингалеева Л.Б.
Набережные Челны
2018
Цель
Решить систему линейных уравнений методами: Крамера, Гаусса и Гаусса-Жордана
Ход выполнения работы:
Обычная реализация:
Решение в MS-Excel
Метод Крамера:
Метод Гаусса
Метод Гаусса-Жордана
Решение в Scilab
Метод Крамера:
Результат решения:
Метод Гаусса:
Результат решения:
Метод Гаусса-Жордана:
Результат решения:
Решение на языке C#
namespace Линейные_уравнения
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Start_Click(object sender, EventArgs e)
{
//Данные из номера
double[,] matrix_a = {
{3.35, 2.94, 2.53},
{5.41, 4.88, 4.41 },
{3.88, 3.3, 2.78},
};
double[] vector_b = { 70.69, 115.38, 81.07 };
//Вызов методов
Method_Kramer(matrix_a, vector_b);
Method_Gauss(matrix_a,vector_b);
Method_GaussJordan(matrix_a, vector_b);
}
public void Method_Kramer(double[,] a, double[] b) {
//Определитель матрицы
double det_A= a[0, 0] * a[1, 1] * a[2, 2] + a[0, 1] * a[1, 2] * a[2, 0] + a[1, 0] * a[2, 1] * a[0, 2]
-(a[2, 0] * a[1, 1] * a[0, 2] + a[0, 0] * a[2, 1] * a[1, 2] + a[2, 2] * a[1, 0] * a[0, 1]);
//Определитель первой вспомогательной матрицы
double det_B = b[0] * a[1, 1] * a[2, 2] + a[0, 1] * a[1, 2] * b[2] + b[1] * a[2, 1] * a[0, 2]
- (b[2] * a[1, 1] * a[0, 2] + b[0] * a[2, 1] * a[1, 2] + a[2, 2] * b[1] * a[0, 1]);
//Определитель второй вспомогательной матрицы
double det_C = a[0, 0] * b[1] * a[2, 2] + b[0] * a[1, 2] * a[2, 0] + a[1, 0] * b[2] * a[0, 2]
- (a[2, 0] * b[1] * a[0, 2] + a[0, 0] * b[2] * a[1, 2] + a[2, 2] * a[1, 0] * b[0]);
//Определитель третьей вспомогательной матрицы
double det_D = a[0, 0] * a[1, 1] * b[2] + a[0, 1] * b[1] * a[2, 0] + a[1, 0] * a[2, 1] * b[0]
- (a[2, 0] * a[1, 1] * b[0] + a[0, 0] * a[2, 1] * b[1] + b[2] * a[1, 0] * a[0, 1]);
//Находим значения переменных
double x1 = Math.Round(det_B / det_A,4);
double x2 = Math.Round(det_C / det_A,4);
double x3 = Math.Round(det_D / det_A,4);
label1.Text = Convert.ToString("x1 = " + x1);
label2.Text = Convert.ToString("x2 = " + x2);
label3.Text = Convert.ToString("x3 = " + x3);
}
public void Method_Gauss(double[,] a, double[] b) {
//Меняем вторую строчку
a[1, 1] = a[1, 1] - a[0, 1] * (a[1, 0] / a[0, 0]);
a[1, 2] = a[1, 2] - a[0, 2] * (a[1, 0] / a[0, 0]);
b[1]= b[1] - b[0] * (a[1, 0] / a[0, 0]);
//Меняем третью строчку первый раз
a[2,1]= a[2, 1] - a[0, 1] * (a[2, 0] / a[0, 0]);
a[2,2]= a[2, 2] - a[0, 2] * (a[2, 0] / a[0, 0]);
b[2]= b[2] - b[0] * (a[2, 0] / a[0, 0]);
//Меняем третью строчку второй раз
a[2,2] = a[2,2] - a[1,2] * (a[2, 1] / a[1, 1]);
b[2] = b[2] - b[1] * (a[2, 1] / a[1, 1]);
//Находим значения переменных
double x3 = Math.Round((b[2] / a[2,2]),4);
double x2 = Math.Round(((b[1] - a[1,2] * x3) / a[1,1]),4);
double x1 = Math.Round(((b[0] - a[0, 1] * x2 - a[0, 2] * x3) / a[0, 0]),4);
label4.Text = Convert.ToString("x1 = " + x1);
label5.Text = Convert.ToString("x2 = " + x2);
label6.Text = Convert.ToString("x3 = " + x3);
}
public void Method_GaussJordan(double[,] a, double[] b) {
//Меняем вторую строчку
a[1, 1] = a[1, 1] - a[0, 1] * (a[1, 0] / a[0, 0]);
a[1, 2] = a[1, 2] - a[0, 2] * (a[1, 0] / a[0, 0]);
b[1] = b[1] - b[0] * (a[1, 0] / a[0, 0]);
//Меняем третью строчку первый раз
a[2, 1] = a[2, 1] - a[0, 1] * (a[2, 0] / a[0, 0]);
a[2, 2] = a[2, 2] - a[0, 2] * (a[2, 0] / a[0, 0]);
b[2] = b[2] - b[0] * (a[2, 0] / a[0, 0]);
//меняем первую строчку первый раз
a[0, 2] = a[0, 2] - a[1, 2] * (a[0, 1] / a[1, 1]);
b[0] = b[0] - b[1] * (a[0, 1] / a[1, 1]);
//Меняем третью строчку второй раз
a[2, 2] = a[2, 2] - a[1, 2] * (a[2, 1] / a[1, 1]);
b[2] = b[2] - b[1] * (a[2, 1] / a[1, 1]);
//Меняем вторую строчку второй раз
b[1] = b[1] - b[2] * (a[1, 2] / a[2, 2]);
//Меняем первую строчку второй раз
b[0] = b[0] - b[2] * (a[0, 2] / a[2, 2]);
//Находим значения переменных
double x1 = Math.Round((b[0] / a[0, 0]),4);
double x2 = Math.Round((b[1] / a[1, 1]),4);
double x3 = Math.Round((b[2] / a[2, 2]),4);
label7.Text = Convert.ToString("x1 = " + x1);
label8.Text = Convert.ToString("x2 = " + x2);
label9.Text = Convert.ToString("x3 = " + x3);
}
private void button1_Click(object sender, EventArgs e)
{
//Данные из номера
double[,] matrix_a = {
{0.5,1,1 },
{3,-5,3},
{2,7,-1},
};
double[] vector_b = {2,1,8};
//Вызов методов
Method_Kramer(matrix_a, vector_b);
Method_Gauss(matrix_a, vector_b);
Method_GaussJordan(matrix_a, vector_b);
}
Результат решения:
Вывод
На практике закрепила знания о решении систем линейных уравнений прямыми методами (метод Крамера, метод Гаусса и Гаусса-Жордана). Выполнение заданий по варианту было реализовано с помощью обычного решения, таблиц MS-Excel, Scilab и программы на языке C#. В ходе выполнения лабораторных изучила среду Scilab, вспомнила знания о языке C# и работу с таблицами и формулами в Excel.