Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
#1

Метод простых итераций для СЛАУ - C++

20.03.2015, 22:19. Просмотров 2768. Ответов 17
Метки нет (Все метки)

Помогите пожалуйста!
Нужно реализовать метод простых итераций для решения СЛАУ
дана вот такая матрица
-0.95 -0.06 -0.12 0.14 2.17
0.04 -1.12 0.08 0.11 1.4
0.11 0.12 0 1.03 0.8
0.34 0.08 -1.06 0.14 2.1
решать с точностью 0.001
заранее огромное спасибо
http://www.cyberforum.ru/cpp-beginners/thread364390.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2015, 22:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод простых итераций для СЛАУ (C++):

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

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

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

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

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

17
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
21.03.2015, 15:07 #2
Лучше бы матрицу отдельно от столбца свободных членов написал, чего в кучу свалил.
Показывай код, на чем остановился?
0
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
21.03.2015, 21:21  [ТС] #3
кода покачто нету
впринципе показать нечего
разве что ввод марицы
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
#include <iostream>
#include <iomanip>
 
#define N  4
#define N1 N+1
 
using namespace std;
 
int main()
{
    setlocale(0, "");
    double A[N][N1] =
    {
        { -0.95, -0.06,  -0.12,  0.14, 2.17 },
        { 0.04, -1.12, 0.08, 0.11, 1.4 },
        { 0.11, 0.12 ,0 , 1.03, 0.8 },
                { 0.34, 0.08, -1.06, 0.14, 2.1 }
    };
    
        //вывод матрицы А
    cout << "матрица А:\n";
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << setw(7) << A[i][j];
        }
        cout << endl;
    }
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
22.03.2015, 09:13 #4
Да. . не густо.
Вот методичка.
Вот пара функций:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void MultiplyMatrixToVector(double *pMatrix, double *pVector, double *pResult, int iDimension)
{
    double dSum;
 
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        dSum = 0;
        for (int iCurColumn = 0; iCurColumn < iDimension; iCurColumn++)
        {
            dSum += pMatrix[(iCurRow*iDimension)+iCurColumn] * (pVector[iCurColumn]);
        }
        pResult[iCurRow] = dSum;
    }
};
 
void AddVectorToVector(double *pVector1, double *pVector2, double *pResult, int iDimension)
{
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        pResult[iCurRow] = pVector1[iCurRow] + pVector2[iCurRow];
    }
};
Вот решение примера из методички (для контроля правильности):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    double dTestMat[3][3] = 
    {
        { 0, 0.2, -0.4 },
        { -0.25, 0, 0.25 },
        { -0.25, -0.25, 0 }
    };
    double dTestVect[3] = { 1.6, -1, 1};
    double dTestRes[3] = {0, 0, 0};
    double dTestApprox[3] = {0, 0, 0};
 
    MultiplyMatrixToVector( (double*)dTestMat, dTestVect, dTestRes, 3);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, 3 );
    // Второе приближение dTestApprox = { 1, -1.15, 0.85 }
 
    MultiplyMatrixToVector( (double*)dTestMat, dTestApprox, dTestRes, 3);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, 3 );
    // Третье приближение dTestApprox = { 1.03, -1.0375, 1.0375 }
 
    MultiplyMatrixToVector( (double*)dTestMat, dTestApprox, dTestRes, 3);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, 3 );
    // Четвертое приближение dTestApprox = { 0.9775, -0.99812, 1.001875 }
    ...
0
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
22.03.2015, 10:09  [ТС] #5
а не могли бы вы помочь применить эти функции к моей задаче
буду благодарен
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
22.03.2015, 15:04 #6
Ты имеешь в виду полностью решить её вместо тебя? А зачетку преподу мне тоже свою нести?
Нет, это уже не помощь, это халява называется.

Между прочим твоя задача не выполняет условия сходимости для метода простых итераций. Что бы её так решать, матрицу сначала нужно нормировать. Тогда за 12 итераций достигается требуемая точность = 0.00049619391335809589
0
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
24.03.2015, 20:43  [ТС] #7
обьясните пожалуйста тогда что такое
C++
1
2
3
double dTestVect[3] = { 1.6, -1, 1};
double dTestRes[3] = {0, 0, 0};
double dTestApprox[3] = {0, 0, 0};
и немного по тому как работают эти функции

буду благодарен
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
24.03.2015, 22:02 #8
dTestVect - столбец свободных членов. (в методичке он обозначен \beta )
dTestRes - столбец для хранения результата умножения матрицы (т.е. это как бы временная переменная)
dTestApprox - столбец с приближенными значениями (x)

Как работают функции должно быть понятно из их названий:
C
1
void MultiplyMatrixToVector(double *pMatrix, double *pVector, double *pResult, int iDimension)
Умножает матрицу, (указатель на которую передают параметром pMatrix) на вектор (указатель на который передается вторым параметром pVector). Результат записывается в третий параметр pResult. Последний параметр iDimension определяет размерность векторов и матрицы.
AddVectorToVector складывает два вектора. Смысл параметров аналогичный.
0
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
26.03.2015, 08:15  [ТС] #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
#include<iostream>
using namespace std;
 
void MultiplyMatrixToVector(double *pMatrix, double *pVector, double *pResult, int iDimension)
{
    double dSum;
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        dSum = 0;
        for (int iCurColumn = 0; iCurColumn < iDimension; iCurColumn++)
        {
            dSum += pMatrix[(iCurRow*iDimension) + iCurColumn] * (pVector[iCurColumn]);
        }
        pResult[iCurRow] = dSum;
    }
};
 
void AddVectorToVector(double *pVector1, double *pVector2, double *pResult, int iDimension)
{
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        pResult[iCurRow] = pVector1[iCurRow] + pVector2[iCurRow];
    }
};
 
int main(){
    double dTestMat[3][3] =
    {
        { 0, 0.2, -0.4 },
        { -0.25, 0, 0.25 },
        { -0.25, -0.25, 0 }
    };
    double dTestVect[3] = { 1.6, -1, 1 };
    double dTestRes[3] = { 0, 0, 0 };
    double dTestApprox[3] = { 0, 0, 0 };
 
    MultiplyMatrixToVector((double*)dTestMat, dTestVect, dTestRes, 3);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, 3);
    // Второе приближение dTestApprox = { 1, -1.15, 0.85 }
    cout << dTestApprox << endl;
    MultiplyMatrixToVector((double*)dTestMat, dTestApprox, dTestRes, 3);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, 3);
    // Третье приближение dTestApprox = { 1.03, -1.0375, 1.0375 }
    cout << dTestApprox << endl;
    MultiplyMatrixToVector((double*)dTestMat, dTestApprox, dTestRes, 3);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, 3);
    // Четвертое приближение dTestApprox = { 0.9775, -0.99812, 1.001875 }
    cout << dTestApprox << endl;
    system("pause");
}
в ответе я получил
0072FC08
0072FC08
0072FC08

что с этим делать я не очень понимаю
никогда с таким не сталкивался потому что нуб
можете подправить код для моей матицы
потому что я боюсь все поламать
(но я понимаю для этого нужно в функции изменить 3 на 4)
C++
1
2
MultiplyMatrixToVector((double*)dTestMat, dTestApprox, dTestRes, 4);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, 4);
правильно?
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
26.03.2015, 09:58 #10
Уфф. . похоже объяснять что-либо бесполезно. Короче:
1) Нормируем твою матрицу (т.е. делим все элементы на max(по модулю) ), получаем:
C
1
2
3
4
5
6
7
    double dTestMat[N][N] = 
    {
        {-0.437788018, -0.02764977, -0.055299539, 0.064516129},
        {0.01843318, -0.516129032, 0.036866359, 0.050691244},
        {0.050691244, 0.055299539, 0, 0.474654378}, 
        {0.156682028, 0.036866359, -0.488479263, 0.064516129}
    };
Вектор свободных членов:
C
1
double dTestVect[N] = { 1, 0.64516129, 0.368663594, 0.967741935 };
Переменные для вычисления достигнутой погрешности:
C
1
2
3
4
5
6
    double dTestPrevApprox[N] = { 1, 0.64516129, 0.368663594, 0.967741935 };
    double dTestDifference[N] = {0, 0, 0, 0};
    double dTestNorma = GetMatrixNormaValue( (double*)dTestMat, N);
    double dBiasBase = dTestNorma/(1-dTestNorma);
    double dMaxDifference;
    double dPrecission;
Еще пара функций, необходимых для вычисления погрешности:
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
void SubVectorFromVector(double *pVector1, double *pVector2, double *pResult, int iDimension)
{
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        pResult[iCurRow] = pVector1[iCurRow] - pVector2[iCurRow];
    }
};
 
double GetMaxAbsVectorValue(double *pVector1, int iDimension)
{
    double dMaxVal = fabs(pVector1[0]);
    for (int iCurRow = 1; iCurRow < iDimension; iCurRow++)
    {
        if ( fabs(pVector1[iCurRow]) > dMaxVal) dMaxVal = fabs(pVector1[iCurRow]);
    }
    return dMaxVal;
};
 
double GetMatrixNormaValue(double *pMatrix, int iDimension)
{
    double dMaxVal = 0;
    
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        double dRowMax = 0;
        for (int iCurColumn = 0; iCurColumn < iDimension; iCurColumn++)
        {
            dRowMax += fabs(pMatrix[(iCurRow*iDimension)+iCurColumn]);
        }
        if ( dRowMax > dMaxVal) dMaxVal = dRowMax;
    }
    return dMaxVal;
};
Делаем первую итерацию:
C
1
2
3
4
5
6
7
    MultiplyMatrixToVector( (double*)dTestMat, dTestVect, dTestRes, N);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, N);
    // Считаем погрешность:
    SubVectorFromVector(dTestApprox, dTestPrevApprox, dTestDifference, N);
    dMaxDifference = GetMaxAbsVectorValue(dTestDifference, N);
    dPrecission = dBiasBase*dMaxDifference;
    AddVectorToVector(dTestRes, dTestVect, dTestPrevApprox, N);
погрешность 1.6, вторая и последующие итерации (другая переменная):
C
1
2
3
4
5
6
7
    MultiplyMatrixToVector( (double*)dTestMat, [B][U]dTestApprox[/U][/B], dTestRes, N);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, N);
    // Третье приближение dTestApprox = { 1.03, -1.0375, 1.0375 }
    SubVectorFromVector(dTestApprox, dTestPrevApprox, dTestDifference, N);
    dMaxDifference = GetMaxAbsVectorValue(dTestDifference, N);
    dPrecission = dBiasBase*dMaxDifference;
    AddVectorToVector(dTestRes, dTestVect, dTestPrevApprox, N);
погрешность становится: 2) 0.9914, 3) 0.4226, 4) 0.1570 и т.д. до требуемой точности.
1
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
26.03.2015, 19:30  [ТС] #11
вот я пытаюсь слить все это в рабочюю программу
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
#include <iostream>
 
void SubVectorFromVector(double *pVector1, double *pVector2, double *pResult, int iDimension)
{
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        pResult[iCurRow] = pVector1[iCurRow] - pVector2[iCurRow];
    }
};
 
double GetMaxAbsVectorValue(double *pVector1, int iDimension)
{
    double dMaxVal = fabs(pVector1[0]);
    for (int iCurRow = 1; iCurRow < iDimension; iCurRow++)
    {
        if (fabs(pVector1[iCurRow]) > dMaxVal) dMaxVal = fabs(pVector1[iCurRow]);
    }
    return dMaxVal;
};
 
double GetMatrixNormaValue(double *pMatrix, int iDimension)
{
    double dMaxVal = 0;
 
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        double dRowMax = 0;
        for (int iCurColumn = 0; iCurColumn < iDimension; iCurColumn++)
        {
            dRowMax += fabs(pMatrix[(iCurRow*iDimension) + iCurColumn]);
        }
        if (dRowMax > dMaxVal) dMaxVal = dRowMax;
    }
    return dMaxVal;
};
void MultiplyMatrixToVector(double *pMatrix, double *pVector, double *pResult, int iDimension)
{
    double dSum;
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        dSum = 0;
        for (int iCurColumn = 0; iCurColumn < iDimension; iCurColumn++)
        {
            dSum += pMatrix[(iCurRow*iDimension) + iCurColumn] * (pVector[iCurColumn]);
        }
        pResult[iCurRow] = dSum;
    }
};
 
void AddVectorToVector(double *pVector1, double *pVector2, double *pResult, int iDimension)
{
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        pResult[iCurRow] = pVector1[iCurRow] + pVector2[iCurRow];
    }
};
 
 
int main(){
    const int N=4;
    double dTestMat[N][N] =
    {
        { -0.437788018, -0.02764977, -0.055299539, 0.064516129 },
        { 0.01843318, -0.516129032, 0.036866359, 0.050691244 },
        { 0.050691244, 0.055299539, 0, 0.474654378 },
        { 0.156682028, 0.036866359, -0.488479263, 0.064516129 }
    };
 
    double dTestVect[N] = { 1, 0.64516129, 0.368663594, 0.967741935 };
 
    double dTestPrevApprox[N] = { 1, 0.64516129, 0.368663594, 0.967741935 };
    double dTestDifference[N] = { 0, 0, 0, 0 };
    double dTestNorma = GetMatrixNormaValue((double*)dTestMat, N);
    double dBiasBase = dTestNorma / (1 - dTestNorma);
    double dMaxDifference;
    double dPrecission;
 
    double dTestRes[N] = { 0, 0, 0 };
    double dTestApprox[N] = { 0, 0, 0 };
    
    MultiplyMatrixToVector((double*)dTestMat, dTestVect, dTestRes, N);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, N);
    // Считаем погрешность:
    SubVectorFromVector(dTestApprox, dTestPrevApprox, dTestDifference, N);
    dMaxDifference = GetMaxAbsVectorValue(dTestDifference, N);
    dPrecission = dBiasBase*dMaxDifference;
    AddVectorToVector(dTestRes, dTestVect, dTestPrevApprox, N);
 
    MultiplyMatrixToVector((double*)dTestMat, [B][U]dTestApprox[/ U][/ B], dTestRes, N);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, N);
    // Третье приближение dTestApprox = { 1.03, -1.0375, 1.0375 }
    SubVectorFromVector(dTestApprox, dTestPrevApprox, dTestDifference, N);
    dMaxDifference = GetMaxAbsVectorValue(dTestDifference, N);
    dPrecission = dBiasBase*dMaxDifference;
    AddVectorToVector(dTestRes, dTestVect, dTestPrevApprox, N);
}
выбивает ошибки
Ошибка 1 error C3481: B: передаваемая переменная в лямбда-выражении не найдена 89
Ошибка 2 error C2059: синтаксическая ошибка: ) 89
Ошибка 3 error C2059: синтаксическая ошибка: [ 89
Ошибка 4 error C3493: "dTestRes" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 90
Ошибка 5 error C3493: "dTestVect" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 90
Ошибка 6 error C3493: "dTestApprox" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 90
Ошибка 7 error C3493: "N" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 90
Ошибка 8 error C3493: "dTestPrevApprox" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 92
Ошибка 9 error C3493: "dTestDifference" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 92
Ошибка 10 error C3493: "dMaxDifference" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 93
Ошибка 11 error C3493: "dPrecission" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 94 1 SI
Ошибка 12 error C3493: "dBiasBase" нельзя передать неявно, поскольку не задан режим передачи по умолчанию 94
Ошибка 13 IntelliSense: идентификатор "B" не определен 89
Ошибка 14 IntelliSense: требуется "{", вводящая тело лямбды 89
Ошибка 15 IntelliSense: идентификатор "U" не определен 89
Ошибка 16 IntelliSense: требуется круглая скобка ")" 89

я не могу разобраться с этим
спасибо что помогаете такому тупилке как я
я пишу код на VS 2013
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
26.03.2015, 19:45 #12
строка 89 должна быть:
C
1
 MultiplyMatrixToVector((double*)dTestMat, dTestApprox, dTestRes, N);
теги B и U - это я хотел шрифтом обратить внимание, что используется другая переменная, а редактор их воспринял в текстовом виде.
0
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
26.03.2015, 19:49  [ТС] #13
вот после выполения вот этого когда
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
#include <iostream>
using namespace std;
 
void SubVectorFromVector(double *pVector1, double *pVector2, double *pResult, int iDimension)
{
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        pResult[iCurRow] = pVector1[iCurRow] - pVector2[iCurRow];
    }
};
 
double GetMaxAbsVectorValue(double *pVector1, int iDimension)
{
    double dMaxVal = fabs(pVector1[0]);
    for (int iCurRow = 1; iCurRow < iDimension; iCurRow++)
    {
        if (fabs(pVector1[iCurRow]) > dMaxVal) dMaxVal = fabs(pVector1[iCurRow]);
    }
    return dMaxVal;
};
 
double GetMatrixNormaValue(double *pMatrix, int iDimension)
{
    double dMaxVal = 0;
 
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        double dRowMax = 0;
        for (int iCurColumn = 0; iCurColumn < iDimension; iCurColumn++)
        {
            dRowMax += fabs(pMatrix[(iCurRow*iDimension) + iCurColumn]);
        }
        if (dRowMax > dMaxVal) dMaxVal = dRowMax;
    }
    return dMaxVal;
};
void MultiplyMatrixToVector(double *pMatrix, double *pVector, double *pResult, int iDimension)
{
    double dSum;
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        dSum = 0;
        for (int iCurColumn = 0; iCurColumn < iDimension; iCurColumn++)
        {
            dSum += pMatrix[(iCurRow*iDimension) + iCurColumn] * (pVector[iCurColumn]);
        }
        pResult[iCurRow] = dSum;
    }
};
 
void AddVectorToVector(double *pVector1, double *pVector2, double *pResult, int iDimension)
{
    for (int iCurRow = 0; iCurRow < iDimension; iCurRow++)
    {
        pResult[iCurRow] = pVector1[iCurRow] + pVector2[iCurRow];
    }
};
 
 
int main(){
    const int N=4;
    double dTestMat[N][N] =
    {
        { -0.437788018, -0.02764977, -0.055299539, 0.064516129 },
        { 0.01843318, -0.516129032, 0.036866359, 0.050691244 },
        { 0.050691244, 0.055299539, 0, 0.474654378 },
        { 0.156682028, 0.036866359, -0.488479263, 0.064516129 }
    };
 
    double dTestVect[N] = { 1, 0.64516129, 0.368663594, 0.967741935 };
 
    double dTestPrevApprox[N] = { 1, 0.64516129, 0.368663594, 0.967741935 };
    double dTestDifference[N] = { 0, 0, 0, 0 };
    double dTestNorma = GetMatrixNormaValue((double*)dTestMat, N);
    double dBiasBase = dTestNorma / (1 - dTestNorma);
    double dMaxDifference;
    double dPrecission;
 
    double dTestRes[N] = { 0, 0, 0 };
    double dTestApprox[N] = { 0, 0, 0 };
    
    MultiplyMatrixToVector((double*)dTestMat, dTestVect, dTestRes, N);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, N);
    // Считаем погрешность:
    SubVectorFromVector(dTestApprox, dTestPrevApprox, dTestDifference, N);
    dMaxDifference = GetMaxAbsVectorValue(dTestDifference, N);
    dPrecission = dBiasBase*dMaxDifference;
    AddVectorToVector(dTestRes, dTestVect, dTestPrevApprox, N);
 
    MultiplyMatrixToVector((double*)dTestMat, dTestApprox, dTestRes, N);
    AddVectorToVector(dTestRes, dTestVect, dTestApprox, N);
    // Третье приближение dTestApprox = { 1.03, -1.0375, 1.0375 }
    SubVectorFromVector(dTestApprox, dTestPrevApprox, dTestDifference, N);
    dMaxDifference = GetMaxAbsVectorValue(dTestDifference, N);
    dPrecission = dBiasBase*dMaxDifference;
    AddVectorToVector(dTestRes, dTestVect, dTestPrevApprox, N);
    cout << dTestApprox << endl;
    system("pause");
}
ответ я получаю
00E1F668

что не так?
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
26.03.2015, 20:04 #14
Цитата Сообщение от alexplotkin Посмотреть сообщение
что не так?


C
1
double dTestApprox[N] = { 0, 0, 0 };
- это массив из 4 элементов, а ты его в cout как число шлешь. Пиши dTestApprox[0] - первый элемент, dTestApprox[1] - второй, и т.д.
0
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
26.03.2015, 20:10  [ТС] #15
0.748321
0.53895
0.909296
0.693956
теперь получил эти ответы
но я проверяю в онлайн калькуляторе я чтото оно совсем не сходится

может проще покажешь свой код как у тебя чтоб я мог ссылаться
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
26.03.2015, 20:43 #16
Это значения коэффициентов на второй итерации, когда погрешность = 0.99144918001430493
А калькулятор с какой погрешностью считает? Наверняка итераций должно быть больше.
0
alexplotkin
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 36
26.03.2015, 20:53  [ТС] #17
будь другом

мне это завтра желательно сдать
не мог бы ты мне рабочий код дать
буду тебе безмерно благодарен
пожалуйста
0
Chardash
40 / 1 / 2
Регистрация: 20.12.2013
Сообщений: 34
21.12.2016, 17:44 #18
Продублируйте пожалуйста методичку ещё раз
0
21.12.2016, 17:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2016, 17:44
Привет! Вот еще темы с решениями:

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

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

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

Метод простых итераций (для трехмерной матрицы)
Привет всем. Помогите пожалуйста. Из корней системы уравнений выдает правильно...


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

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

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