Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using namespace std;
- #include <stdlib.h>
- #include <math.h>
- #include <stdio.h>
- #include <string.h>
- #include <vector>
- typedef vector<double> Vector;
- typedef vector<Vector> Martix;
- void print(Martix matrix, int n, int m) {
- for (int i = 0; i < n; i++){
- for (int j = 0; j < m; j++){
- printf("%-8g", matrix [i][j]);
- }
- printf("\n");
- }
- }
- void CompletePivoting(Martix matrix, int n) {
- printf("Complete pivoting method\n");
- print(matrix, n, n + 1);
- int p, q, ln = 0;
- double temp[n][n + 1] = {0}, 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 < n; j++) {
- if (fabs(matrix[i][j]) > a) {
- a = fabs(matrix[i][j]);
- p = i;
- q = j;
- }
- }
- }
- for (int j = 0; j < n + 1; j++) {
- temp[ln][j] = matrix[p][j];
- }
- ln++;
- for (int i = 0; i < n; i++) {
- double M = -matrix[i][q] / a;
- if (i == p) continue;
- for (int j = 0; j < n + 1; j++) {
- if (j == q) continue;
- matrix[i][j] += matrix[p][j] * M;
- }
- }
- for (int j = 0; j < n + 1; 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][n] != 0) {
- p = i;
- }
- }
- for (int j = 0; j < n + 1; j++) {
- temp[ln][j] = matrix[p][j];
- }
- for (int j = 0; j < n; j++) {
- x[j] = 0;
- }
- for (int i = n - 1; i >= 0; i--){
- double R = temp[i][n];
- for (int j = 0; j < n; j++) {
- if ((temp[i][j] != 0) && (x[j] != 0)) {
- R -= temp[i][j] * x[j];
- }
- }
- for (int j = 0; j < n; j++) {
- if ((temp[i][j] != 0) && (x[j] == 0)) {
- x[j] = R / temp[i][j];
- }
- }
- }
- for (int i = 0; i < n; i++) {
- printf("x%i = %f\n", i, x[i]);
- }
- }
- double* SimpleIteration(Martix matrix, int n) {
- printf("Simple iteration method\n");
- print(matrix, n, n + 1);
- double x[n], x0[n];
- for (int i = 0; i < n; i++) {
- double a = 1.0 / matrix[i][i];
- for (int j = 0; j < n + 1; 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 < n; 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][n];
- }
- for (int i = 0; i < n; i++) {
- x[i] = matrix[i][n];
- for (int j = 0; j < n; 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;
- double error = 1e-8 * fabs(((1 - q) / q));
- do {
- for (int i = 0; i < n; i++) {
- x[i] = matrix[i][n];
- for (int j = 0; j < n; 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 > error);
- for (int i = 0; i < n; i++) {
- printf("x%i = %f\n", i, x[i]);
- }
- }
- Vector operator+(const Vector &a, const Vector &b) {
- Vector r(a.size());
- for (int i = 0; i < a.size(); i++) {
- r[i] = a[i] + b[i];
- }
- return r;
- }
- Vector operator-(const Vector &a, const Vector &b) {
- Vector r(a.size());
- for (int i = 0; i < a.size(); i++) {
- r[i] = a[i] - b[i];
- }
- return r;
- }
- Vector operator*(const Vector &a, const double &b) {
- Vector r(a.size());
- for (int i = 0; i < a.size(); i++) {
- r[i] = a[i] * b;
- }
- return r;
- }
- int main() {
- Martix matrix1 = {
- {13, 14, 17, 14, 146},
- { 9, 26, 7, 9, 135},
- { 8, 4, 25, 11, 119},
- {15, 11, 5, 16, 109}
- };
- Martix matrix2 = {
- matrix1[0] + matrix1[3] - matrix1[2] - matrix1[1],
- matrix1[1],
- matrix1[0],
- matrix1[3],
- };
- CompletePivoting(matrix1, 4);
- printf("\n");
- SimpleIteration(matrix2, 4);
- }
Advertisement
Add Comment
Please, Sign In to add comment