Методические указания. Вычисление определителя в предлагаемом примере производится с помощью разложения его по элементам первой строки и использования рекурсии для нахождения

Вычисление определителя в предлагаемом примере производится с помощью разложения его по элементам первой строки и использования рекурсии для нахождения дополнительных миноров к элементам тем же способом.

Рекурсия - это такой способ организации вычислительного процесса при котором процедура или функция в процессе выполнения обращается сама к себе.

Пример программы, вычисляющей матрицу и ее определитель:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace WindowsFormsApplicationL3

{

public partial class Form1: Form

{

//String[] St;

//Класс List<string> - коллекция строк - лист из строк имеет методы

//накопления и преобразования неопределенного количества элементов

List<string> list_st = new List<string>();

string[] St;

Double[,] MatrD, MatrA, MatrB, MatrC, Matr1, Matr2;

int i = 0, j = 0, n = 0;

public Form1()

{

InitializeComponent();

}

//Процедура считывания строк из файла

private void Sc(ref Double[,] Matr)

{

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

FileStream FS = openFileDialog1.OpenFile() as FileStream;

StreamReader SR = new StreamReader(FS);

dataGridView1.Rows.Clear();

//добавление первой колонки

DataGridViewTextBoxColumn titleColumn = new DataGridViewTextBoxColumn();

//Изменение заголовка колонки

titleColumn.HeaderText = "Titlt" + 1.ToString();

//Выравнивание ширины колонки в соответствии с заданным стилем - AllCells

titleColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

//добавление

dataGridView1.Columns.Add(titleColumn);

list_st.Clear();

while (SR.Peek() > 0)

{ // Считывание строки и добавление колонки (свойство AllowUserToAddRows - False)

list_st.Add(SR.ReadLine());

//dataGridView1

dataGridView1.Rows.Add();

}

St = list_st.ToArray();

n = St.Length;

Matr = new Double[n, n];

for (i = 0; i < n -1; i++)

{ // Добавление колонки

DataGridViewTextBoxColumn titleColumn1 = new DataGridViewTextBoxColumn();

titleColumn1.HeaderText = "Titlt" + (i +2).ToString();

//Выравнивание ширины колонки в соответствии с заданным стилем - AllCells

titleColumn1.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

dataGridView1.Columns.Add(titleColumn1);

}

for (i = 0; i < n; i++)

{

St[i] = St[i].Replace(".", ",");

//Разбиение строки St на подстроки aa

string[] aa = St[i].Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

for (j = 0; j < aa.Length; j++)

{

//Заполнение матрицы и таблицы

Matr[i, j] = Convert.ToDouble(aa[j]);

dataGridView1.Rows[i].Cells[j].Value = Matr[i, j];

}

}

SR.Close();

FS.Close();

}

}

private void button1_Click(object sender, EventArgs e)

{ //Матрица A

dataGridView1.Columns.Clear();

Sc(ref MatrA);

}

private void button2_Click(object sender, EventArgs e)

{ //Матрица B

dataGridView1.Columns.Clear();

Sc(ref MatrB);

}

private void button3_Click(object sender, EventArgs e)

{ //Матрица C

dataGridView1.Columns.Clear();

Sc(ref MatrC);

}

private void button4_Click(object sender, EventArgs e)

{ //Матрица (A+B)*C

if ((dataGridView1.Columns.Count < 1)||MatrA==null||MatrB==null||MatrC==null) return;

dataGridView1.Columns.Clear();

//добавление первой колонки

DataGridViewTextBoxColumn titleColumn = new DataGridViewTextBoxColumn();

titleColumn.HeaderText = "Titlt" + 1.ToString();

titleColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

dataGridView1.Columns.Add(titleColumn);

for (int i = 0; i < n - 1; i++)

{ // Добавление колонки

//dataGridView1.Rows.Clear();

DataGridViewTextBoxColumn titleColumn1 = new DataGridViewTextBoxColumn();

titleColumn1.HeaderText = "Titlt" + (i + 2).ToString();

titleColumn1.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

dataGridView1.Columns.Add(titleColumn1);

}

MatrD = new Double[n, n];

Matr1 = new Double[n, n];

for (i = 0; i < n; i++)

{

dataGridView1.Rows.Add();

}

for (i = 0; i < n; i++)

{

for (j = 0; j < n; j++)

{

Matr1[i, j] = MatrA[i, j] + MatrB[i, j];

}

}

for (i = 0; i < n; i++)

{

for (j = 0; j < n; j++)

{

MatrD[i, j] = 0;

for (int k = 0; k < n; k++)

MatrD[i, j] = MatrD[i, j] + Matr1[i, k]*MatrC[k, j];

dataGridView1.Rows[i].Cells[j].Value = MatrD[i,j];

}

}

}

private void button5_Click(object sender, EventArgs e)

{ // Заполнение второй таблицы

//dataGridView2 = dataGridView1;

//dataGridView1.Rows.Clear();

if (dataGridView1.Columns.Count<1) return;

dataGridView2.Columns.Clear();

//добавление первой колонки и первой строки

DataGridViewTextBoxColumn titleColumn = new DataGridViewTextBoxColumn();

titleColumn.HeaderText = "Titlt" + 1.ToString();

titleColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

dataGridView2.Columns.Add(titleColumn);

dataGridView2.Rows.Add();

for (int i = 0; i < n - 1; i++)

{ // Добавление колонки

//dataGridView1.Rows.Clear();

DataGridViewTextBoxColumn titleColumn1 = new DataGridViewTextBoxColumn();

titleColumn1.HeaderText = "Titlt" + (i + 2).ToString();

titleColumn1.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

dataGridView2.Columns.Add(titleColumn1);

// добавление строки

dataGridView2.Rows.Add();

}

// Создание матрицы из второй таблицы

Matr2 = new Double[n, n];

for (i = 0; i < n; i++)

{

for (j = 0; j < n; j++)

{

dataGridView2.Rows[i].Cells[j].Value = dataGridView1.Rows[i].Cells[j].Value;

Matr2[i, j] = Convert.ToDouble(dataGridView2.Rows[i].Cells[j].Value);

}

}

}

private void button6_Click(object sender, EventArgs e)

{

//Вычисление определителя

textBox1.Clear();

double S=Opred(Matr2, n);

textBox1.Text ="Определитель равен "+ Convert.ToString(S);

}

//Функция вычисления определителя

double Opred(double[,] M, int m)

{

if (M == null)

return 0;

Double[,] M2;

M2 = new double[m - 1, m - 1];

int i1=0,j1=0,k=0,i=0,j=0;

double Opr=0;

//Тривиальное решение

if (m == 1)

{

return Opr=M[0, 0];

}

for (k = 0; k < m; k++)

{//Разложение по элементам нулевой строки

i1 = 0;

for(i=0;i<m;i++)

{

j1 = 0;

if (i!=0) //вычеркивание нулевой строки

{

for(j=0;j<m;j++)

{

if (j!= k) //вычеркивание k-го стролбца

{

M2[i1, j1] = M[i, j];

j1++;

}

}

i1++;

}

}

// Рекурсивное обращение

Opr=Opr+Math.Pow(-1,k)*M[0,k]*Opred(M2, m-1);

}

return Opr;

}

}

}

Рис. 5.1 Форма №1 проекта.

Рис. 5.2 Форма №2 проекта.

Варианты заданий вычисления матричного выражения и определителя матрицы

1. ;

2. ;

3. ;

4. ;

5. ;

6. ;

7. ;

8. ;

9. ;

10. ;

11. ;

12. ;

В которых:

; ; ;



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: