0 / 0 / 0
Регистрация: 14.06.2012
Сообщений: 3
1

Программа на решение СЛАУ методом Якоби

14.06.2012, 18:31. Показов 39280. Ответов 12
Метки нет (Все метки)

Вывести значение решения и количество итераций
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2012, 18:31
Ответы с готовыми решениями:

Решение СЛАУ методом Якоби
Решить СЛАУ методом Якоби. Вывести значения решения, график зависимости нормы невязки от номера...

Решение СЛАУ методом Якоби
Пытаюсь реализовать метод решения системы линейных уравнений методом Якоби. #include "stdafx.h"...

Решение СЛАУ методом вращений (Якоби)
помогите, может у когото имеется приложение (на языке Pascal или C++), Решение СЛАУ методом...

Решение СЛАУ методом Якоби - Необработанное исключение (ошибка)
Здравствуйте, стояла задача решения СЛАУ, методом Якоби. Что-то набросал, что то скопировал, но...

12
12 / 12 / 4
Регистрация: 13.04.2013
Сообщений: 125
11.11.2014, 14:27 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <fstream>
#include <math.h>
#include <omp.h>
#include <cstdlib> 
using namespace std;
 
 
void Mul(int N, double **A,double *x,double *y)
{
    for (int i = 0; i<N; i++)
    {   
        y[i] = 0;
        for (int j = 0; j<N; j++)
            y[i] = y[i] + (A[i][j] * x[j]);
    }
}
 
 
void PrintMatrix(int N, double **A )
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            cout << A[i][j]<<" ";
        cout << endl;
    }
}
void PrintVec(int N, double *A)
{
    for (int i = 0; i < N; i++)
    {
            cout << A[i] << " ";
    }
    cout << endl;
}
void Jacobi(int N, double**A, double* F, double* X)
{
    double eps=0.001,norm,* TempX = new double[N],start,end;
    //start=omp_get_wtime();
    for(int k=0;k<N;k++)
        TempX[k]= X[k];
    int cnt = 0;
    start=omp_get_wtime();
    do {
        for (int i = 0; i < N; i++) 
        {
            TempX[i] = F[i];
            for (int g = 0; g < N; g++) 
                if (i != g)
                    TempX[i] -= A[i][g] * X[g];
            TempX[i] /= A[i][i];
        }
        norm = abs(X[0] - TempX[0]);
        for (int h = 0; h < N; h++) 
        {
            if (abs(X[h] - TempX[h]) > norm)
                norm = abs(X[h] - TempX[h]);
            X[h] = TempX[h];
        }
        cnt++;  
    } 
    while (norm > eps);
    end = omp_get_wtime();
    cout<<"Количество итераций = "<<cnt<<endl;
    printf_s("Затрачено %f сек\n", (end-start));
    delete[] TempX;
}
void Load(int &N, double **&A, double *&F)
{
    setlocale(0,"");
    ifstream fin;
    fin.open("input.txt");
    fin >> N;
    F = new double [N];
    A = new double *[N];
        for (int i = 0; i < N; i++)
            A[i] = new double[N];
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
                fin >> A[i][j];
            fin >> F[i];
        }
    fin.close();
}
 
int main()
{
    double **Matrix, *b,*y,*x;
    int n;
    Load(n, Matrix, b);
    cout << "Матрица:\n";
    PrintMatrix(n, Matrix);
    cout << "b: ";
    PrintVec(n, b);
    x = new double[n];
    for(int i=0;i<n;i++)
        x[i]=1.0;
    y = new double[n];
    cout<<endl<<b[1]<<endl;
    Jacobi(n, Matrix, b, x);
    cout << "Результат | x: ";
    PrintVec(n, x);
    cout << "A*x=b | b: ";
    Mul(n, Matrix, x, y);
    PrintVec(n, y);
    delete x;
    delete y;
    system("pause");
    return 1;
}

Реализован подсчет времени выполнения метода
1
0 / 0 / 0
Регистрация: 20.06.2014
Сообщений: 3
10.01.2016, 16:32 3
А какое ты приложение создавал, консольное или пустое?
0
12 / 12 / 4
Регистрация: 13.04.2013
Сообщений: 125
15.12.2016, 17:49 4
Пустое
0
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 6
15.06.2019, 09:41 5
Кто-нибудь может мне подсказать кое-что по этому коду?
0
587 / 407 / 203
Регистрация: 10.06.2016
Сообщений: 1,911
15.06.2019, 10:15 6
mimilbek, это судя по коду:
C++
1
2
3
4
5
6
for (int i = 0; i<N; i++)
    {   
        y[i] = 0;
        for (int j = 0; j<N; j++)
            y[i] = y[i] + (A[i][j] * x[j]);
    }
Метод простой итерации, а не Якоби.

Добавлено через 46 секунд
Ollivi, могу сказать, что все замудрено, можно значительно проще.
0
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 6
15.06.2019, 15:25 7
slava_psk, О, тут кто-то жив. Подскажите, что выводит строка 101: cout << endl << b[1] << endl; Не понимаю ее смысл. И вообще разве метод Якоби не заканчивается на выводе трех значений x? Разве Mul тут не лишняя?..
0
587 / 407 / 203
Регистрация: 10.06.2016
Сообщений: 1,911
15.06.2019, 15:35 8
Ollivi, вы пробовали выполнять этот код? Откуда в его взяли?
0
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 6
15.06.2019, 15:37 9
По моему, вот так вот, это уже метод Якоби:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <stdio.h>
#include <iostream>
#include "math.h"
#include <fstream>
#include <omp.h>
#include <cstdlib> 
using namespace std;
 
//
//void Mul(int N, double **A, double *x, double *y)
//{
//  for (int i = 0; i < N; i++)
//  {
//      y[i] = 0;
//      for (int j = 0; j < N; j++)
//          y[i] = y[i] + (A[i][j] * x[j]);
//  }
//}
 
 
void PrintMatrix(int N, double **A)
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            cout << A[i][j] << " ";
        cout << endl;
    }
}
void PrintVec(int N, double *A)
{
    for (int i = 0; i < N; i++)
    {
        cout << A[i] << " ";
    }
    cout << endl;
}
void Print(int N, double *A)
{
    for (int i = 0; i < N; i++)
    {
        cout <<"x"<<i+1<<"="<< A[i] << " ";
    }
    cout << endl;
}
void Jacobi(int N, double**A, double* F, double* X)
{
    double e;
    cout << "Задайте начальное приближение ";
    cin >> e;
    double norm, *TempX = new double[N];
 
    for (int k = 0; k < N; k++)
        TempX[k] = X[k];
    int cnt = 0;
    /*start = omp_get_wtime();*/
    do {
        for (int i = 0; i < N; i++)
        {
            TempX[i] = F[i];
            for (int g = 0; g < N; g++)
                if (i != g)
                    TempX[i] -= A[i][g] * X[g];
            TempX[i] /= A[i][i];
        }
        norm = abs(X[0] - TempX[0]);
        for (int h = 0; h < N; h++)
        {
            if (abs(X[h] - TempX[h]) > norm)
                norm = abs(X[h] - TempX[h]);
            X[h] = TempX[h];
        }
        cnt++;
    } while (norm > e);
//  end = omp_get_wtime();
    cout << "Количество итераций = " << cnt << endl;
//  printf_s("Затрачено %f сек\n", (end - start));
    delete[] TempX;
}
void input(int &N, double **&A, double *&F)
{
    setlocale(0, "");
    ifstream fin;
    fin.open("input.txt");
    fin >> N;
    F = new double[N];
    A = new double *[N];
    for (int i = 0; i < N; i++)
        A[i] = new double[N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            fin >> A[i][j];
        fin >> F[i];
    }
    fin.close();
}
 
int main()
{
    double **Matrix, *b, *y, *x;
    int n;
    input(n, Matrix, b);
    cout << "Матрица:\n";
    PrintMatrix(n, Matrix);
    cout << "b: ";
    PrintVec(n, b);
    x = new double[n];
    for (int i = 0; i < n; i++)
        x[i] = 1.0;
    y = new double[n];
    //cout << endl << b[1] << endl;
    Jacobi(n, Matrix, b, x);
    cout << "Результат: ";
    Print(n, x);
    //cout << "A*x=b | b: ";
    //Mul(n, Matrix, x, y);
    //PrintVec(n, y);
    //delete x;
    //delete y;
    system("pause");
    return 1;
}
Добавлено через 1 минуту
Взяла здесь) Пробовала..
0
587 / 407 / 203
Регистрация: 10.06.2016
Сообщений: 1,911
15.06.2019, 15:57 10
Программа на решение СЛАУ методом Якоби
0
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 6
15.06.2019, 16:05 11
slava_psk, океей, спасибо, видимо, у меня неверная информация была
0
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 6
16.06.2019, 10:11 12
slava_psk, а можете, пожалуйста, ещё подсказать по поводу чтения матрицы из файла и дальнейшего использования этих данных в методе.. Вот у меня есть второй метод решения системы уравнений, но там матрица вводится вручную:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
 
int main()
{
    int i, j, n, m;
    //создаем массив
    cout << "Number of equations: ";
    cin >> n;
    cout << "Number of variables: ";
    cin >> m;
    m += 1;
    float **matrix = new float *[n];
    for (i = 0; i<n; i++)
        matrix[i] = new float[m];
 
    //инициализируем
 
    for (i = 0; i<n; i++)
 
        for (j = 0; j<m; j++)
        {
            cout << " Element " << "[" << i + 1 << " , " << j + 1 << "]: ";
 
            cin >> matrix[i][j];
        }
 
    //выводим массив
    cout << "matrix: " << endl;
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++)
            cout << matrix[i][j] << " ";
        cout << endl;
    }
    cout << endl;
 
    //Метод Гаусса
    //Прямой ход, приведение к верхнетреугольному виду
    float  tmp;
    int k;
    float *xx = new float[m];
 
    for (i = 0; i<n; i++)
    {
        tmp = matrix[i][i];
        for (j = n; j >= i; j--)
            matrix[i][j] /= tmp;
        for (j = i + 1; j<n; j++)
        {
            tmp = matrix[j][i];
            for (k = n; k >= i; k--)
                matrix[j][k] -= tmp*matrix[i][k];
        }
    }
    /*обратный ход*/
    xx[n - 1] = matrix[n - 1][n];
    for (i = n - 2; i >= 0; i--)
    {
        xx[i] = matrix[i][n];
        for (j = i + 1; j<n; j++) xx[i] -= matrix[i][j] * xx[j];
    }
 
    //Выводим решения
    for (i = 0; i<n; i++)
        cout << xx[i] << " ";
    cout << endl;
 
    delete[] matrix;
    system("pause");
    return 0;
}
А хотелось бы, что бы, как в примере выше, брались значения из файла..
0
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 6
16.06.2019, 10:11 13
slava_psk, а можете, пожалуйста, ещё подсказать по поводу чтения матрицы из файла и дальнейшего использования этих данных в методе.. Вот у меня есть второй метод решения системы уравнений, но там матрица вводится вручную:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
 
int main()
{
    int i, j, n, m;
    //создаем массив
    cout << "Number of equations: ";
    cin >> n;
    cout << "Number of variables: ";
    cin >> m;
    m += 1;
    float **matrix = new float *[n];
    for (i = 0; i<n; i++)
        matrix[i] = new float[m];
 
    //инициализируем
 
    for (i = 0; i<n; i++)
 
        for (j = 0; j<m; j++)
        {
            cout << " Element " << "[" << i + 1 << " , " << j + 1 << "]: ";
 
            cin >> matrix[i][j];
        }
 
    //выводим массив
    cout << "matrix: " << endl;
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++)
            cout << matrix[i][j] << " ";
        cout << endl;
    }
    cout << endl;
 
    //Метод Гаусса
    //Прямой ход, приведение к верхнетреугольному виду
    float  tmp;
    int k;
    float *xx = new float[m];
 
    for (i = 0; i<n; i++)
    {
        tmp = matrix[i][i];
        for (j = n; j >= i; j--)
            matrix[i][j] /= tmp;
        for (j = i + 1; j<n; j++)
        {
            tmp = matrix[j][i];
            for (k = n; k >= i; k--)
                matrix[j][k] -= tmp*matrix[i][k];
        }
    }
    /*обратный ход*/
    xx[n - 1] = matrix[n - 1][n];
    for (i = n - 2; i >= 0; i--)
    {
        xx[i] = matrix[i][n];
        for (j = i + 1; j<n; j++) xx[i] -= matrix[i][j] * xx[j];
    }
 
    //Выводим решения
    for (i = 0; i<n; i++)
        cout << xx[i] << " ";
    cout << endl;
 
    delete[] matrix;
    system("pause");
    return 0;
}
А хотелось бы, что бы, как в примере выше, брались значения из файла..
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2019, 10:11
Помогаю со студенческими работами здесь

Почему программа прерывается с ошибкой? Реализовывал решение СЛАУ методом Гаусса
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int n=0; int...

Решение СЛАУ методом Якоби
Нужно реализовать метод Якоби. Помогите найти ошибку в цикле (while), проблема с переходом на...

Решение СЛАУ методом Якоби
На x:=Yacoby(A, b, eps) выдает такой текст: &quot;Недопустимый индекс массива. Индекс должен быть целым...

Решение СЛАУ методом вращений (Якоби)
помогите, может у когото имеется приложение (на языке Pascal или C++), Решение СЛАУ методом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru