Распараллеливание метода Якоби - C#
Формулировка задачи:
Помогите пожалуйста распараллелить функцию Якоби для решения СЛАУ.
Я вообще ничего не понимаю в параллелизме
Сам попытался, но мне кажется, что так делать неправильно.
static void Jacobi1(int N, double eps, double[,] A, double[] F, double[] X)//Последовательная функция { double[] TempX = new double[N]; while(true) { for (int i = 0; i < N; i++) { TempX[i] = F[i]; // Инициализируем i-ую неизвестную значением свободного члена i-ой строки матрицы for (int j = 0; j < N; j++) // Вычитаем сумму по всем отличным от i-ой неизвестным { if (i != j) TempX[i] -= A[i, j] * X[j]; } TempX[i] /= A[i, i];// Делим на коэффициент при i-ой неизвестной } double error = 0.0; for (int i = 0; i < N; i++) { error += Math.Abs(TempX[i]- X[i]); } if (error < eps) { break; } for (int h = 0; h < N; h++) { X[h] = TempX[h]; } } Console.Write("\nРешения СЛАУ:"); for (int i = 0; i < N; i++) { Console.Write("\n"); Console.Write("X[{0}",i+1); Console.Write("]="); Console.Write("{0,-5}", X[i]); } }
static void Jacobi2(int N, double eps, double[,] A, double[] F, double[] X) { double[] TempX = new double[N]; while (true) { Parallel.For(0, N, i => { TempX[i] = F[i]; // Инициализируем i-ую неизвестную значением свободного члена i-ой строки матрицы Parallel.For(0, N, j => {// Вычитаем сумму по всем отличным от i-ой неизвестным if (i != j) TempX[i] -= A[i, j] * X[j]; }); TempX[i] /= A[i, i];// Делим на коэффициент при i-ой неизвестной }); double error = 0.0; Parallel.For(0, N, i => { error += Math.Abs(TempX[i] - X[i]); }); if (error < eps) { break; } Parallel.For(0, N, h => { X[h] = TempX[h]; }); } for (int i = 0; i < N; i++) { Console.Write("\n"); Console.Write("X[{0}", i + 1); Console.Write("]="); Console.Write("{0,-5}", X[i]); } Console.ReadLine(); }
Решение задачи: «Распараллеливание метода Якоби»
textual
Листинг программы
static void Jacobi2(int N, double eps, double[,] A, double[] F, double[] X)//Последовательная функция { double[] TempX = new double[N]; var locker = new object(); while (true) { double error = 0.0; Parallel.For(0, N, i => { TempX[i] = F[i]; // Инициализируем i-ую неизвестную значением свободного члена i-ой строки матрицы for (int j = 0; j < N; j++) // Вычитаем сумму по всем отличным от i-ой неизвестным { if (i != j) TempX[i] -= A[i, j] * X[j]; } TempX[i] /= A[i, i];// Делим на коэффициент при i-ой неизвестной lock (locker) error += Math.Abs(TempX[i] - X[i]); }); if (error < eps) { break; } X = TempX.ToArray(); } Console.Write("\nРешения СЛАУ:"); for (int i = 0; i < N; i++) { Console.Write("\n"); Console.Write("X[{0}", i + 1); Console.Write("]="); Console.Write("{0,-5}", X[i]); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д