Обратная матрица - C# (185382)
Формулировка задачи:
Люди добрые! Прошу у вас помощи, для курсовой осталось сделать последнее задание, нужно найти обратную матрицу для заданной. Может есть у кого готовые алгоритмы?.. перерыл достаточное количество сайтов и форумов, но что то нормального, работающего кода так и не нашел ...
Решение задачи: «Обратная матрица»
textual
Листинг программы
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;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{ // ВНИМЕНИЕ. Данная программа педназначена только для квадратных матриц, точно имеющих решение, с невыражденой главнй диаганалью и т.д и т.п.
//Программа НЕ имеет обработчиков ошибок.// это число применяются для задания матрицы. многим методам программы необходимо знать размер матрицы поэтому
// я его вынес " на верх". а ещё потому, что неумею выводить несколько параметров.
// [url]http://www.cyberforum.ru/csharp-beginners/thread868040.html[/url]
//Если не понравилось то можно посматреть тут [url]http://msdn.microsoft.com/ru-ru/magazine/jj863137.aspx[/url]
// Данный код, есть переделка отсюда :[url]http://www.********************/showthread.php?t=133673[/url]
/*размеры матриц*/
static int razmer;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void AddColumns(int m, DataGridView dgw)
{
//добавляет n столбцов в элемент управления dgw
//Заполнение DGView столбцами
DataGridViewColumn column;
for (int i = 0; i < m; i++)
{
column = new DataGridViewTextBoxColumn();
column.DataPropertyName = "Столбец" + i.ToString();
column.Name = "Столбец" + i.ToString();
dgw.Columns.Add(column);
}
}
private void AddRows(int k, DataGridView dgw)
{
//добавляет m строк в элемент управления dgw
//Заполнение DGView строками
for (int i = 0; i < k; i++)
{
dgw.Rows.Add();
dgw.Rows[i].HeaderCell.Value
= "row" + i.ToString();
}
}
// метод инициализирует( бранирует или выделяет) место под новые строки и столбцы; создаёт 2-х мерный квадратный массив!
public double[,] MatrixCreate1(int rowscols)
{
if (rowscols != 0)
{
/*Очищаем матрицу */
dataGridView1.Columns.Clear();
dataGridView2.Columns.Clear();
/*Заполнение DGView столбцами */
AddColumns(rowscols, dataGridView1);
AddColumns(rowscols, dataGridView2);
/*Заполнение DGView строками*/
AddRows(rowscols, dataGridView1);
AddRows(rowscols, dataGridView2);
Random rnd = new Random();
int g;
double[,] hhh = new double[rowscols,rowscols];
/* {
{5,8,8},
{5,10,3},
{7,9,19}
};*/
//проверочная матрица
for (int i = 0; i < rowscols; ++i)
{
for (int j = 0; j < rowscols; ++j)
{
g=rnd.Next(10, 500);
hhh[i,j]=g;
dataGridView1.Rows[i].Cells[j].Value = hhh[i,j];
}
}
return hhh;
}
return null;
}
static double[,] One1(double[,] hhh, int h)
{ //'единичная матрица
// h = 3; //активаровать для проверки. результат найдите тут: [url]http://matrixcalc.org/[/url]
double[,] ggg = new double[h, h];// единичная матрица
// Dim A_edin(k + 1, k + 1) As Double 'затем она перейдёт в обратную
for (int i = 0; i < h; )
{
for (int j = 0; j < h; )
{
if (i == j)
{ ggg[i, j] = 1; }
else
{ ggg[i, j] = 0; }
j++;
}
i++;
}
// 'единичная матрица
//'обратная матрица
double arg;
int i1;
// Dim arg As Double
// Dim i1 As Integer
for (int j = 0; j < h; )
{
for (int i = 0; i < h; )
{
if (i == j)
{ goto k; }
arg = hhh[i, j] / hhh[j, j];
for (i1 = 0; i1 < h; )
{
hhh[i, i1] = hhh[i, i1] - hhh[j, i1] * arg;
ggg[i, i1] = ggg[i, i1] - ggg[j, i1] * arg;
i1++;
}
k:
i++;
}
j++;
}
for (int j = 0; j < h; )
{
for (int i = 0; i < h; )
{
double arg_2;
if (i == j)
{
arg_2 = hhh[i, j];
for (i1 = 0; i1 < h; )
{
hhh[i, i1] = hhh[i, i1] / arg_2;
ggg[i, i1] = ggg[i, i1] / arg_2;
i1++;
}
}
i++;
}
j++;
}
return ggg;
}
// Метод для распечатки матрицы в грид1
public void Print1(double[,] matrix, int rowscols)
{
//double[][] result;
for (int i = 0; i < rowscols; ++i) // Копирование значений
for (int j = 0; j < rowscols; ++j)
{
dataGridView1.Rows[i].Cells[j].Value = matrix[i, j];
}
}
// метод для распечаткт в грид2
public void Print2(double[,] matrix, int rowscols)
{
//double[][] result;
for (int i = 0; i < rowscols; ++i) // Копирование значений
for (int j = 0; j < rowscols; ++j)
{
dataGridView2.Rows[i].Cells[j].Value = matrix[i, j];
}
}
private void button1_Click(object sender, EventArgs e)
{
razmer = Convert.ToInt32(textBox1.Text);
double[,] jjj = MatrixCreate1(razmer);
double[,] kkk = One1(jjj,razmer);
Print1(jjj, razmer);
Print2(kkk,razmer);
}
private void button2_Click(object sender, EventArgs e)
{
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void dataGridView1_CellContentClick_1(object sender, DataGridViewCellEventArgs e)
{
}
}
}