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

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

10.10.2011, 04:25. Показов 3649. Ответов 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
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2011, 04:25
Ответы с готовыми решениями:

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

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

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

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

4
2825 / 1634 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
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
446 / 209 / 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
Заблокирован
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
2825 / 1634 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2011, 22:15

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

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

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

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


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

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

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