Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <math.h>
- #include <stdio.h>
- #include <string.h>
- #include <vector>
- using namespace std;
- void print_matrix(vector<vector<double>> matrix, int n, int m) {
- int i, j;
- for (i = 0; i < n; i++){
- for (j = 0; j < m; j++){
- printf("%8.2f", matrix [i][j]);
- }
- printf("\n");
- }
- return;
- }
- void CompletePivoting(vector<vector<double>> matrix, int n, int m) {
- printf("Complete pivoting method\n");
- print_matrix(matrix, n, m);
- int p, q, line_new = 0;
- double M[n], t[n][m], x[n];
- for (int k = 0; k < n - 1; k++){
- double a = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m - 1; j++) {
- if (fabs(matrix[i][j]) > a) {
- a = fabs(matrix[i][j]);
- p = i;
- q = j;
- }
- }
- }
- for (int j = 0; j < m; j++) {
- t[line_new][j] = matrix[p][j];
- }
- line_new++;
- for (int i = 0; i < n; i++) {
- M[i] = -matrix[i][q] / a;
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (i != p) {
- matrix[i][j] += matrix[p][j] * M[i];
- }
- }
- }
- for (int j = 0; j < m; j++) {
- matrix[p][j] = 0;
- }
- for (int i = 0; i < n; i++) {
- matrix[i][q] = 0;
- }
- }
- for (int i = 0; i < n; i++) {
- if (matrix[i][m - 1] != 0) {
- p = i;
- }
- }
- for (int j = 0; j < m; j++) {
- t[line_new][j] = matrix[p][j];
- }
- for (int j = 0; j < m-1; j++) {
- x[j] = 0;
- }
- for (int i = n - 1; i >= 0; i--){
- double R = t[i][m - 1];
- for (int j = 0; j < m - 1; j++) {
- if ((t[i][j] != 0) && (x[j] != 0)) {
- R -= t[i][j] * x[j];
- }
- }
- for (int j = 0; j < m - 1; j++) {
- if ((t[i][j] != 0) && (x[j] == 0)) {
- x[j] = R / t[i][j];
- }
- }
- }
- for (int i = 0; i < n; i++) {
- printf("x%i = %f\n", i, x[i]);
- }
- }
- double* SimpleIteration(vector<vector<double>> matrix, int n, int m, double eps) {
- printf("Simple iteration method\n");
- print_matrix(matrix, n, m);
- double x[n], x0[n];
- for (int i = 0; i < n; i++) {
- double a = 1.0 / matrix[i][i];
- for (int j = 0; j < m; j++) {
- matrix[i][j] = matrix[i][j] * a;
- }
- }
- double q = 0;
- for (int i = 0; i < n; i++) {
- double s = 0;
- for (int j = 0; j < m - 1; j++) {
- if (i != j) {
- s += fabs(matrix[i][j]);
- }
- }
- if (s > q) q = s;
- }
- for (int i = 0; i < n; i++) {
- x0[i] = matrix[i][m-1];
- }
- for (int i = 0; i < n; i++) {
- x[i] = matrix[i][m-1];
- for (int j = 0; j < m - 1; j++) {
- if (i != j) {
- x[i] -= matrix[i][j] * x0[j];
- }
- }
- }
- for (int i = 0; i < n; i++) {
- x0[i] = x[i];
- }
- int k = 2;
- double m_norma_x = 0;
- do{
- for (int i = 0; i < n; i++) {
- x[i] = matrix[i][m - 1];
- for (int j = 0; j < m - 1; j++) {
- if (i != j) {
- x[i] -= matrix[i][j] * x0[j];
- }
- }
- }
- for (int i = 0; i < n; i++)
- x0[i] = x[i] - x0[i];
- m_norma_x = fabs(x0[0]);
- for (int i = 1; i < n; i++)
- if (fabs(x0[i]) > m_norma_x)
- m_norma_x = fabs(x0[i]);
- for (int i = 0; i < n; i++) {
- x0[i] = x[i];
- }
- k++;
- } while (m_norma_x > eps * ((1 - q) / q));
- for (int i = 0; i < n; i++) {
- printf("x%i = %f\n", i, x[i]);
- }
- }
- int main(){
- const int m = 5, n = 4;
- vector<vector<double>> AB = {
- {8, 4, 8, 20, 148},
- {8, 27, 12, 6, 87},
- {16, 13, 46, 16, 157},
- {19, 10, 7, 17, 169}
- };
- vector<vector<double>> T = {
- {50, -23, 0, -6, 91},
- {8, 27, 12, 6, 87},
- {16, 13, 46, 16, 157},
- {8, -19, 4, 34, 209}
- };
- CompletePivoting(AB, n, m);
- printf("\n");
- SimpleIteration(T, n, m, 1e-5);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement