Всем доброго времени суток, мне нужно написать программу для решения линейных уравнений методом якоби, да на сайте есть решения, но у меня загвоздка в том что матрица, нулевое приближение, столбец свободных членов и размер матрицы находятся во внешнем файле. Я написал часть кода для чтения некоторых параметров из файла: е - нулевое приближение n количество столбцов m количество строк вектор столбец свободных членов b,нулевое приближение x0. Проблема заключается в том что я не понимаю как организовать счет по методу якоби пытался сделать цикл в цикле не смог напоролся на кучу ошибок, подскажите как лучше реализовать метод якоби в данной задачи?
основная формула по которой я хотел организовать счет:
b -матрица элементов которой находятся по следующей формуле:
a [i,j] a[i,i] элементы матрицы из файла
дополнительно прикрепляю часть кода которую написал:
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
| #include "8_fileFunctions.h" // Подключение своего заголовочного файла.
double* init1XArray(int X);
int main(int narg, char **arg) {
string inputFile = arg[1]; // Взятие имени входного файла из аргументов командной строки.
string eNm = "e";
string X0Nm = "X0";
string bNm = "b";
string ANm = "A";
string nNm = "n";
string mNm = "m";
double e = getDouble(eNm, inputFile, 0); // Считывание вещественного параметра «a».
int n = getInt(nNm, inputFile, 0); // Считывание целочисленного параметра «b»
int m = getInt(mNm, inputFile, 0); // Считывание целочисленного параметра «m»
int n = getInt(nNm, inputFile, 0); // Считывание целочисленного параметра «n»
int* dimb = getArrayDim (bNm, inputFile);
double* b = getDoubleArr1 (bNm, inputFile, dimb);
int* dimX0 = getArrayDim(X0Nm, inputFile); // Считывание размерности одномерного масива вещественных чисел.
double* X0 = getDoubleArr1(X0Nm, inputFile, dimX0); // Считывание одномерного массива вещественных чисел.
int* dimA = getArrayDim(ANm, inputFile); // Считывание размерности двумерного масива.
double** A = getDoubleArr2 (ANm, inputFile, dimA); // Считывание двумерного массива.
double k;
do {
k = 1;
for (int i=1; i<=m; i++){
for (int j=1; j<=n; j++){
X [i, j]
while (k > *e);
// Вывод считанных данных в консоль:
cout.precision(2);
cout << eNm << setw(4) << e << endl << endl;
cout.precision(2);
cout << X0Nm << endl;
cout << dimX0[0] << endl;
cout << dimX0[1] << endl;
cout << dimX0[2] << endl;
cout << endl << endl;
/* string outFile = inputFile.substr(0, inputFile.length() - 4).append("Out"); // Формирование имени выходного файла (убрать расширение с точкой и добавить суфикс "Out").
outFile.append(
inputFile.substr(inputFile.length() - 4, inputFile.length())); // Формирование имени выходного файла (добавить точку с расширением).
ofstream outStrm; // Объявление потока записи в файл;
outStrm.open(outFile.c_str()); // Подключения потока записи в файл к выходному файлу.
outStrm.precision(2);
outStrm.setf(ios::fixed, ios::floatfield);
outStrm << aNm << setw(5) << a * 2 << endl << endl; // Запись в файл параметра «a», умноженного на 2.
outStrm << bNm << setw(2) << b * 2 << endl << endl; // Запись в файл параметра «b», умноженного на 2.
outStrm << cNm << " " << c << "*" << c << endl << endl; // Запись в файл параметра «c» дважды.
// Запись в файл массивов, элементы которых умножены на 2:
outStrm.precision(0);
outStrm << arr1IntNm << endl;
outStrm << dimArr1Int[0] << endl;
outStrm << dimArr1Int[1] << endl;
for (int i = 0; i < dimArr1Int[1]; i++)
outStrm << setw(3) << arr1Int[i] * 2;
outStrm << endl << endl;
outStrm.precision(1);
outStrm << arr1DoubleNm << endl;
outStrm << dimArr1Double[0] << endl;
outStrm << dimArr1Double[1] << endl;
for (int i = 0; i < dimArr1Double[1]; i++)
outStrm << setw(5) << arr1Double[i] * 2;
outStrm << endl << endl;
outStrm << arr2Nm << endl;
outStrm << dimArr2[0] << endl;
outStrm << dimArr2[1] << " " << dimArr2[2] << endl;
for (int i = 0; i < dimArr2[1]; i++) {
for (int j = 0; j < dimArr2[2]; j++)
outStrm << setw(5) << arr2[i][j] * 2;
outStrm << endl;
}
outStrm.close(); // Закрытие потока записи в файл.
*/
return 0;
} |
|