Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void gauss (Matrix A1, double *b1) {
- Matrix A = new Matrix (A1.M, A1.n);
- int n = A.n;
- double *b = new double[n];
- for (int i = 0; i<n; i++)
- b[i] = b1[i];
- double *x = new double[n];
- for (int i = 0; i<n; i++){
- if (A.M[i][i] == 0){
- int bool = 0;
- for (int k = i + 1; k<n; k++){
- if (A.M[k][i] != 0){
- bool = 1;
- for (int c = 0; c<n; c++){
- double tmp = A.M[i][c];
- A.M[i][c] = A.M[k][c];
- A.M[k][c] = tmp;
- }
- double tmp = b[i];
- b[i] = b[k];
- b[k] = tmp;
- break;
- }
- }
- if (bool == 0){
- std::cout << "простой метод Гаусса не применим";
- return;
- }
- }
- for (int j = i + 1; j<n; j++){
- b[j] = (b[j] / A.M[j][i])*A.M[i][i] - b[i];
- for (int k = n - 1; k >= i; k--)
- A.M[j][k] = (A.M[j][k] / A.M[j][i])*A.M[i][i] - A.M[i][k];
- }
- }
- x[n - 1] = b[n - 1] / A.M[n - 1][n - 1];
- for (int i = n - 2; i >= 0; i--){
- double sum = b[i];
- for (int j = n - 1; j>i; j--)
- sum = sum - A.M[i][j] * x[j];
- x[i] = sum / A.M[i][i]; }
- std::cout << "Решение методом Гаусса:";
- for (int i = 0; i<n; i++)
- std::cout << x[i] << "\t";
- std::cout << "\n";
- }
- void Seidel (Matrix M, double* b, double eps) {
- Matrix A = new Matrix (M.M, M.n);
- _Vector vb = new _Vector (b, M.n);
- int n = A.n;
- Matrix C = new Matrix (n);
- _Vector d = new _Vector (n);
- for (int i = 0; i<n; i++){
- C.M[i][i] = 0;
- if (A.M[i][i] == 0){
- std::cout << ("Матрица не является матрицей с диагональным преобладанием");
- if (!A.isPositiveDefine ()){
- std::cout<< ("Матрица не является матрицей с диагональным преобладанием или она не положительно определена");
- return;
- }
- }
- d.v[i] = b[i] / A.M[i][i];
- for (int j = 0; j<n; j++){
- if (i == j)
- continue;
- C.M[i][j] = -A.M[i][j] / A.M[i][i];
- }
- }
- _Vector x1 = new _Vector (d.v, n);
- _Vector x2 = new _Vector (n);
- _Vector x3 = new _Vector (n);
- int count = 0;
- while ((x1.substraction (x2)).normInf ()>eps){
- for (int i = 0; i<n; i++)
- x2.v[i] = x1.v[i];
- double no;
- int k = -1;
- for (int i = 0; i<n; i++){
- double sum = 0;
- for (int j = 0; j<n; j++){
- double x;
- if (j>k)
- x = x1.v[j];
- else
- x = x3.v[j];
- sum = sum + C.M[i][j] * x;
- }
- sum = sum + d.v[i];
- k++;
- x3.v[i] = sum;
- }
- for (int i = 0; i<n; i++)
- x1.v[i] = x3.v[i];
- no = (x1.substraction (x2)).normInf ();
- count++;
- }
- std::cout << "Решение методом Зейделя. "";
- std::cout << "Всего " << count << " шагов:";
- x1.display ();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement