katti_ok
Новенький
Репутация: +1/-0
Offline
Пол: 
Сообщений: 4
|
 |
« : 30 Ноябрь 2012, 01:40:42 » |
|
Помогите, пожалуйста, найти ошибку в коде!! Суть задачи: метод Гауса с выбором главного элемента в подматрице! Почему не переставляются строки в матрице В??
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Gaus_main_element { public static class Gaus_main_element { public static int n = 4; public static float[] X = new float[] { 10, 10, 10, 10 }; public static float[,] A = new float[,] { { 0, 1,0,-1}, {-1, 0,2, 2}, { 0, 1,1,-1}, { 0,-1,0, 0} }; public static float[] B = new float[] { 1, 0, 2, 3 };
public static bool flag = false;
public static void OneStep(int k) {
Console.WriteLine("Matrica A do Gaussa "); for (int q = 0; q < n; q++) { for (int p = 0; p < n; p++) Console.Write(" {0}", Math.Round(A[q, p], 3)); Console.WriteLine("\n"); } Console.WriteLine("Matrica B do Gaussa "); for (int f = 0; f < n; f++) { Console.Write(" {0}", Math.Round(B[f], 3)); Console.WriteLine("\n"); }
for (int i = 0; i < n; i++) { int t = 0; for (int j = 0; j < n; j++) { if (A[i, j] == 0) t++;
} if (t == n) { if (B != 0) Console.WriteLine("net resenij"); flag = true; break; } }
//ctb=0 for (int j = 0; j < n; j++) { if (flag == true) break; int t = 0; for (int i = 0; i < n; i++) { if (A[i, j] == 0) t++;
} if (t == n) { Console.WriteLine("beskonecno mnogo resenij"); flag = true; break; } } if (flag == false) { for (int i = k + 1; i < n; i++) { float q = A[i, k] / A[k, k]; for (int j = k; j < n; j++) { A[i, j] = A[i, j] - q * A[k, j]; } B = B - q * B[k]; }
Console.WriteLine("Matrica A posle Gaussa"); for (int q = 0; q < n; q++) { for (int p = 0; p < n; p++) Console.Write(" {0}", Math.Round(A[q, p], 3)); Console.WriteLine("\n"); } Console.WriteLine("Matrica B posle Gaussa "); for (int i = 0; i < n; i++) { Console.Write(" {0}", Math.Round(B, 3)); Console.WriteLine("\n"); }
Console.WriteLine("========================="); } //}
}
public static void BackStep() { X[n - 1] = B[n - 1] / A[n - 1, n - 1]; for (int i = n - 2; i >= 0; i--) { float sum = 0; for (int j = i + 1; j < n; j++) { sum = sum + A[i, j] * X[j]; } X = (B - sum) / A[i, i]; } }
public static void ChangeStr(int i, int j) { for (int p = 0; p < n; p++) { float temp = 0; temp = A[i, p]; A[i, p] = A[j, p]; A[j, p] = temp; temp = B; B = B[j]; B[j] = temp; } }
public static void ChangeStb(int i, int j) { for (int p = 0; p < n; p++) { float temp = 0; temp = A[p, i]; A[p, i] = A[p, j]; A[p, j] = temp; } }
public static void Max(int num) { Console.WriteLine("Matrica A do perestanovki"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) Console.Write(" {0}", Math.Round(A[i, j], 3)); Console.WriteLine("\n"); } Console.WriteLine("Matrica B do perestanovki"); for (int i = 0; i < n; i++) { Console.Write(" {0}", Math.Round(B, 3)); Console.WriteLine("\n"); }
float max = Math.Abs(A[num, num]); int k = num; int l = num; for (int i = num + 1; i < n; i++) for (int j = num + 1; j < n; j++) { if (Math.Abs(A[i, j]) > max) { max = Math.Abs(A[i, j]); k = i; l = j; } }
Console.WriteLine("Max element {0}, k={1}, l={2}", Math.Round(max, 3), k, l); if (k == num && l == num) Console.WriteLine("ne meniajem\n"); if (k != num && l != num) { ChangeStr(num, k); ChangeStb(num,l);
} if ((k == num)) ChangeStb(num, l); if ((l == num)) ChangeStr(num, k);
Console.WriteLine("Matrica A posle perestanovki"); for (int i = 0; i < n; i++) { { for (int j = 0; j < n; j++) Console.Write(" {0}", Math.Round(A[i, j], 3)); Console.WriteLine("\n"); } Console.WriteLine("Matrica B posle perestanovki "); for (int i = 0; i < n; i++) { Console.Write(" {0}", Math.Round(B, 3)); Console.WriteLine("\n"); } Console.WriteLine("\n---------------------------------"); } } public static void Gauss() { for (int i = 0; i < n - 1; i++) { if (flag == false) { Max(i); OneStep(i); } } if (flag == false) { BackStep();
for (int cx = 0; cx < n; cx++) { Console.WriteLine("x[{0}]={1}", cx, Math.Round(X[cx], 3)); } } }
} }
|