Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Adam-RS
1 / 1 / 4
Регистрация: 02.10.2010
Сообщений: 28
#1

Метод простых итераций (для трехмерной матрицы) - C++

10.10.2011, 04:25. Просмотров 2421. Ответов 4
Метки нет (Все метки)

Привет всем. Помогите пожалуйста. Из корней системы уравнений выдает правильно только один,((
http://www.cyberforum.ru/cpp-beginners/thread1400064.html
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
#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int i, j, n = 3;
    float a[3][3], al[3][3], b[3], bt[3], x0[3], x1[3];
    float e = 0.001, k = 0;
 
    cout << "Massiv a: " << endl;
 
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            cout << "a[" << i << "]" << "[" << j << "] = ";
            cin >> a[i][j];
        }
        cout << endl;
    
    cout << "Massiv b: " << endl;
 
    for (i = 0; i < n; i++)
    {
        cout << "b[" << i <<"] = ";
        cin >> b[i];
    }
    cout << endl;
 
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            if (i = j)
                al[i][j] = 0;
            else
                al[i][j] = (-1) * (a[i][j] / a[i][i]);
        }
 
        for (i = 0; i < n; i++)
        {
            bt[i] = b[i] / a[i][i];
            x0[i] = bt[i];
        }
 
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            {
                x1[i] = bt[i] + (al[i][j] * x0[i]);
                x0[i] = x1[i];
            }
            
        for (i = 0; i < n; i++)
            k = k + sqrt(x1[i] - x0[i]);
 
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            do
            {
                x1[i] = bt[i] + (al[i][j] * x0[i]);
                x0[i] = x1[i];
            }
            while (k > e);
        }
    
        cout << "x1["<< i << "] = " << x1[i] << endl;
    }
    
    
    getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2011, 04:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод простых итераций (для трехмерной матрицы) (C++):

Метод простых итераций для СЛАУ
Прошу помочь с написанием МПИ для СЛАУ на C. Каким образом выразить из AX=b...

Метод простых итераций для СЛАУ
Здравствуйте! Пытаюсь реализовать метод простых итераций. Все функции, которые...

Метод простых итераций для СЛАУ
Доброго времени суток всем!!! решаю СЛАУ методом простых итераций, проблема...

Метод простых итераций для решения СЛАУ
Здравствуйте. Попытался сделать программу для решения СЛАУ методом простых...

Метод простых итераций для решения СЛАУ
Всем добрый вечер! Столкнулся с заданием на тему решения СЛАУ методом простых...

4
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
10.10.2011, 15:21 #2
Цитата Сообщение от Adam-RS Посмотреть сообщение
трехмерной матрицы

Цитата Сообщение от Adam-RS Посмотреть сообщение
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
// строка 32
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            if (i = j)
                al[i][j] = 0;
            else
                al[i][j] = (-1) * (a[i][j] / a[i][i]);
        }
 
        for (i = 0; i < n; i++)
        {
            bt[i] = b[i] / a[i][i];
            x0[i] = bt[i];
        }
 
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            {
                x1[i] = bt[i] + (al[i][j] * x0[i]);
                x0[i] = x1[i];
            }
            
        for (i = 0; i < n; i++)
            k = k + sqrt(x1[i] - x0[i]);
Отступ есть, фигурных скобок нет - что-то не то.
1
aeshes
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
10.10.2011, 16:09 #3
Что это за строчка?
C++
1
 if (i = j)
Вы сравниваете i с j на равенство или проверяете присваивание?
Если это сравнение, то нужно писать i==j

А еще этот цикл вызывает сомнения
C++
1
2
3
4
5
6
7
8
for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                {
                        if (i = j)
                                al[i][j] = 0;
                        else
                                al[i][j] = (-1) * (a[i][j] / a[i][i]);
                }
при i=0,j=0 у вас получится a[0][0]=0. На следующем проходе цикла (i=0,j=1) вы будете делить на 0: a[0][1]=-1*a[0][1]/a[0][0]
К этому моменту a[0][0] - уже ноль

А если б вы еще формулы приложили для метода итераций, было бы вообще хорошо. Потому что вдруг вы не ту формулу изначально программируете?
1
alex_bojik
Заблокирован
10.10.2011, 16:18 #4
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
#include <math.h>
#define eps 0.001 //желаемая точность 
 
..........................
 
void Jacobi (int N, double **A, double *F, double *X)
// N - размерность матрицы; A[N][N] - матрица коэффициентов, F[N] - столбец свободных членов,
// X[N] - начальное приближение, ответ записывается также в X[N];
{
        double * TempX = new double[N];
        double norm; // норма, определяемая как наибольшая разность компонент столбца иксов соседних итераций.
 
        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 = fabs(X[0] - TempX[0]);
                for (int h = 0; h < N; h++) {
                        if (fabs(X[h] - TempX[h]) > norm)
                                norm = fabs(X[h] - TempX[h]);
                        X[h] = TempX[h];
                }
        } while (norm > eps);
        delete[] TempX;
}
Извини некада переписывать для частных случаев... этот общий... названия не пугайся методо простых итераций также известен как метод Якоби, сам недавно делал тока на C#
З.Ы. взято отсюда
1
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
10.10.2011, 22:15 #5
Кстати, valarray удобно использовать, когда операции с целыми строчками производятся. Вот когда-то писал:
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
#include <iostream>
#include <cmath>
#include <limits>
#include <valarray>
#include <algorithm>
 
using namespace std;
 
typedef valarray<double> row, column;
typedef valarray<row> matrix;
 
const double inf = numeric_limits<double>::infinity();
 
int main()
{
    int n;
    cout << "n: ";
    cin >> n;
    matrix A(row(n), n);
    column a(n);
    cout << "\nA[1][1] ... A[1][n] a[1]\n"
        "...\n"
        "A[n][1] ... A[n][n] a[n]\n";
    for (int r = 0; r < n; r++)
    {
        for (int c = 0; c < n; c++)
            cin >> A[r][c];
        cin >> a[r];
    }
    double eps;
    cout << "\neps: ";
    cin >> eps;
    column xcur(n);
    cout << "\nxcur: ";
    for (int r = 0; r < n; r++)
        cin >> xcur[r];
 
    matrix B(row(n), n);
    column b(n);
    for (int r = 0; r < n; r++)
    {
        B[r] = -A[r] / A[r][r];
        B[r][r] = 0;
        b[r] = a[r] / A[r][r];
    }
 
    cout << "\nB b:\n";
    for (int r = 0; r < n; r++)
    {
        for (int c = 0; c < n; c++)
            cout << B[r][c] << " ";
        cout << b[r] << "\n";
    }
 
    double Linf = -inf;
    for (int r = 0; r < n; r++)
    {
        double s = 0;
        for (int c = 0; c < n; c++)
            s += fabs(B[r][c]);
        if (s > Linf)
            Linf = s;
    }
    cout << "\nLinf: " << Linf << endl;
 
    double L1 = -inf;
    for (int c = 0; c < n; c++)
    {
        double s = 0;
        for (int r = 0; r < n; r++)
            s += fabs(B[r][c]);
        if (s > L1)
            L1 = s;
    }
    cout << "L1: " << L1 << endl;
 
    double L2 = 0;
    for (int r = 0; r < n; r++)
    {
        for (int c = 0; c < n; c++)
            L2 += B[r][c] * B[r][c];
    }
    cout << "L2: " << L2 << endl;
 
    double L = min(Linf, L1);
    L = min(L, L2);
    if (L >= 1)
    {
        cout << "L >= 1 :-(" << endl;
        return 1;
    }
 
    column xnext = xcur;
    do
    {
        xcur = xnext;
        cout << "\nxcur: \n";
        for (int r = 0; r < n; r++)
            cout << xcur[r] << " ";
        for (int r = 0; r < n; r++)
            xnext[r] = b[r] + (B[r] * xcur[r]).sum();
    } while ((xnext - xcur).apply(fabs).max() >= eps);
    cout << "\nX: \n";
    for (int r = 0; r < n; r++)
        cout << xnext[r] << " ";
    cout << endl;
}
2
10.10.2011, 22:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2011, 22:15
Привет! Вот еще темы с решениями:

Метод простых итераций для решения СЛАУ
Здравствуйте. Есть функция, реализующая метод простых итераций: void...

Метод простых итераций для одного уравнения
arccos(x) - sqrt(1-0.3x^3) = 0 Отрезок от +приближенное значение корня...

Метод простых итераций для решения СЛАУ
Доброго времени суток. Если у кого нибудь есть готовые программы для данного...

Посчитать количество проведенных итераций (метод простых итераций, Pascal -> C++)
перевести из паскаля в С++ program method_of_simple_iteration; uses crt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru