Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2011, 22:05   #1
Fanat56
Новичок
Джуниор
 
Регистрация: 27.12.2011
Сообщений: 3
По умолчанию Найти определитель матрицы ...

Привет, помогите найти определитель матрицы 9-ого порядка, второй день сижу не могу понять как его найти в C#. Вот у меня есть код:

Код:
		void Button3Click(object sender, EventArgs e)
		{
			double[,] a=new double[10,10];
			double[] b = new double[10];
 			int q;
			int j,i,Col,Row;
			q = Convert.ToInt32(comboBox1.SelectedItem);
			
//--------------------------------- для 3-ого порядка -------------------------------------------------	
			if ( q == 3){
		   	for ( i = 0; i<= Convert.ToInt32(q)-1; i+=1)
		   { 
		   	      for ( j = 0; j<= Convert.ToInt32(q)-1; j+=1)
		   	      {	
		   	      	a[i,j] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[j].Value));		   	      	
		  	      }
		   	      b[i] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[3].Value));	
		   	      
	    	}			   
		   double det_a,det_1,det_2,det_3,x1,x2,x3;
		   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[0,2]*a[1,1]*a[2,0]+a[1,0]*a[0,1]*a[2,2]+a[0,0]*a[1,2]*a[2,1]);
		   if(det_a != 0){
		   det_1 = (b[0]*a[1,1]*a[2,2]+b[0]*a[1,2]*a[2,0]+a[1,0]*a[2,1]*b[0]) - (b[0]*a[1,1]*a[2,0]+a[1,0]*b[0]*a[2,2]+b[0]*a[1,2]*a[2,1]);
		   det_2 = (a[0,0]*b[1]*a[2,2]+a[0,1]*b[1]*a[2,0]+b[1]*a[2,1]*a[0,2]) - (a[0,2]*b[1]*a[2,0]+b[1]*a[0,1]*a[2,2]+a[0,0]*b[1]*a[2,1]);
           det_3 = (a[0,0]*a[1,1]*b[2]+a[0,1]*a[1,2]*b[2]+a[1,0]*b[2]*a[0,2]) - (a[0,2]*a[1,1]*b[2]+a[1,0]*a[0,1]*b[2]+a[0,0]*a[1,2]*b[2]);
           x1 = Math.Round((det_1/det_a),3);
           x2 = Math.Round((det_2/det_a),3);
           x3 = Math.Round((det_3/det_a),3);
           listBox1.Items.Add("Неизвестные переменные:");
           listBox1.Items.Add("x1 = " + Convert.ToString(x1));
           listBox1.Items.Add("x2 = " + Convert.ToString(x2));
           listBox1.Items.Add("x3 = " + Convert.ToString(x3));
		   }
		   else{
		   	MessageBox.Show("Определитель матрицы равен (0), система не имеет решений ...");
		       }
		   }
//--------------------------------- для 2-ого порядка -------------------------------------------------		  
			if ( q == 2){
		   	for ( i = 0; i<= Convert.ToInt32(q)-1; i+=1)
		   { 
		   	      for ( j = 0; j<= Convert.ToInt32(q)-1; j+=1)
		   	      {	
		   	      	a[i,j] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[j].Value));		   	      	
		  	      }
		   	      b[i] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[2].Value));	
		   	     
	    	}
		   	double det_a,det_1,det_2,x1,x2;
		   	det_a = a[0,0]*a[1,1] - a[0,1]*a[1,0];
		   	if (det_a != 0){
		   		det_1 = b[0]*a[1,1] - a[0,1]*b[1];
		   		det_2 = a[0,0]*b[1] - b[0]*a[1,0];
		   		x1 = Math.Round((det_1/det_a),3);
		   		x2 = Math.Round((det_2/det_a),3);
		   	    listBox1.Items.Add("Неизвестные переменные:");
                listBox1.Items.Add("x1 = " + Convert.ToString(x1));
                listBox1.Items.Add("x2 = " + Convert.ToString(x2));	
		   	}
		   	else {
		   	     MessageBox.Show("Определитель матрицы равен (0), система не имеет решений ...");
		   	     }
               }
//--------------------------------- для n-ого порядка -------------------------------------------------
           if ( (q != 2) && (q != 3)){	        
		   	 for ( i = 0; i<= Convert.ToInt32(q)-1; i+=1)
		   { 
		   	      for ( j = 0; j<= Convert.ToInt32(q)-1; j+=1)
		   	      {	
		   	      	a[i,j] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[j].Value));		   	      	
		  	      }
		   	      b[i] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[2].Value));			   	     
	    	}
//--------------------------------- для 4-ого порядка -------------------------------------------------		   	 
//             if (q == 4)
//             { double det_a;
//	             for ( i = 0; i<= Convert.ToInt32(q)-1; i+=1)
//		         { 
//		   	        for ( j = 0; j<= Convert.ToInt32(q)-1; j+=1)
//		   	         {	
//		   	      	   a[i,j] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[j].Value));		   	      	
//		  	         }
//		   	        b[i] = double.Parse(Convert.ToString(dataGridView1.Rows[i].Cells[2].Value));			   	     
//	    	     }
//	             for (Col = 0; Col == q; Col += 1)
//	             {
//	             	for (Row = 0; Row == q; Row+=1)
//	             	{
//	             		
//	             	}
//	             }
//		   	     
//		   	     
//             }
          }
			
		}

Последний раз редактировалось alexBlack; 27.12.2011 в 23:32.
Fanat56 вне форума Ответить с цитированием
Старый 27.12.2011, 22:07   #2
Fanat56
Новичок
Джуниор
 
Регистрация: 27.12.2011
Сообщений: 3
По умолчанию

Там нужно как то через рекурсию делать а мы ее еще не учили о_О, а препод задал уже, подскажи те плиз...
Fanat56 вне форума Ответить с цитированием
Старый 30.12.2011, 09:37   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Fanat56 Посмотреть сообщение
Там нужно как то через рекурсию делать а мы ее еще не учили о_О, а препод задал уже, подскажи те плиз...
Если говорить откровенно, то лезть в код нет ни какого желания - мягко его можно назвать только "быдло-кодом" или индусским кодом, а смотреть такой код - портить себе нервы. Предположу только, что нужно вычислять определитель разложением по строке=>необходимо применять рекурсию однозначно. В самой рекурсии нет ничего сложного - функция вызывает сама себя, но с другими параметрами. Как-то года два назад сам реализовывал данный алгоритм вычисления определителя и его реализация заняла у меня ~40 минут(там все просто, элементарная школьная математика). Опишу словесно данный алгоритм: в нашу функцию det в качестве аргумента мы передаем матрицу A размером NxN(N на N); вводим в функции переменную returnedValue=0 и матрицу tmpA, размером (N-1)x(N-1); если матрица имеет размер 1x1, то вернуть элемент A[0,0], иначе создаем цикл for(Int32 i=0; i<N; i++) копируем в матрицу tmpA элементы матрицы A с индексами (i1 и j1) неравными i и пишем: returnedValue+=Math.Pow(-1, i)*A[0,i]*det(tmpA); возвращаем returnedValue.
В-принципе это примерно все(если ничего не забыл).
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 30.12.2011 в 09:49.
Mixim вне форума Ответить с цитированием
Старый 30.12.2011, 16:50   #4
Sanek-MU
 
Регистрация: 19.12.2010
Сообщений: 6
По умолчанию

Вот пример на C++. Он скорее всего не оптимальный, но что есть, то есть...
Думаю, разберешься, как под C# переписать аналогично.

Код:
int ** get_matrix(int ** m, int a, int row) {
	int i,j,l,k;
	int ** n;

	n = new int * [a];
	for (i=0;i<a;i++)
		n[i] = new int [a];
	l = 0;
	for (i=0;i<(a-1);i++) {
		k = 1;
		if (l == row)
			l++;
		for (j=0;j<(a-1);j++) {
			n[i][j] = m[l][k];
			k++;
		}
		l++;
	}
	return(n);
}

float determinant_by_cols(int ** m, int a) {
	float d = 0;
	int i;

	if (a == 1)
		return(m[0][0]);
	for (i=0;i<a;i++) {
		d += pow(-1.0,(i+1)) * m[i][0] * determinant_by_cols(get_matrix(m,a,i),a-1);
	}
	return(d);
}
Sanek-MU вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти определитель матрицы... Fanat56 Общие вопросы C/C++ 1 27.12.2011 22:01
Определитель матрицы на С GT_NiNo Помощь студентам 0 21.10.2011 18:53
Определитель матрицы Rekky Свободное общение 10 24.05.2011 20:40
Определитель матрицы 2 на 2 С++ Mashul'ka Помощь студентам 1 03.11.2010 00:08