Распараллеливание метода Якоби - 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]);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы