Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Fantezz
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 80
1

Решение СЛАР простой итерацией

12.03.2017, 17:47. Просмотров 94. Ответов 0
Метки нет (Все метки)

Дана такая матрица и ее вектор
нужно перемножить матрицу на вектор
сделать уравнение и подсчитать(скрин маткада ниже)
наброски кода (выводит чепуху,потому что-то не то сделал)
помогите
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
// dada.cpp: определяет точку входа для консольного приложения.
//
 
 
#include "stdafx.h"
#include <vector>
#include <cmath>
 
#include <iostream>
#include <iomanip>
 
 
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.77, -0.44, 0.21, -0.18 },
        { 0.45, 1.23, 0.06, 0.0 },
        { 0.26, 0.34, -1.11, 0.00 },
        { 0.05, -0.26, 0.34, -1.12 }
    };
 
    double dTestVect[N] = { -1.24, 0.88, -0.62,1.17 };
 
    double dTestPrevApprox[N] = { -1.24, 0.88, -0.62,1.17  };
    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");
}
0
Миниатюры
Решение СЛАР простой итерацией  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2017, 17:47
Ответы с готовыми решениями:

Поиск корня нелинейного уравнения простой итерацией, половинным делением, методом Ньютона
Найти корень уравнения sin x = x с погрешностью не более 0.000001 и для каждого...

Решение простой задачки
Всем привет. Недавно решил начать заниматься плюсами (да и в целом...

решение с простой переменной
Добрый вечер:sleep: Задание прикреплено ниже, если кому не трудно посмотрите...

Решение уравнения методом простой итерации
День добрый. Мне необходимо решить уравнение x-10cos(x)=0 разным методами и с...

Решение нелинейного уравнения методом простой итерации
Помогите, пожалуйста! Нужно разработать программу для решения нелинейного...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2017, 17:47

Решение нелинейных уравнений методом простой итерации
Реализовать заданный алгоритм для уравнения x^3+x^2-1=0, решив уравнение с...

Решение нелинейных уравнений методом простой итерации
Решение нелинейных уравнений методом простой итерации. Реализовать заданный...

Решение системы линейных алгебраических уравнений, метод простой итерации
Решить систему линейных алгебраических уравнений. Коэффициенты и свободные...


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

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

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