Advertisement
pilner

ModSim 5E5U - Jacobi

Dec 6th, 2022 (edited)
686
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 1 0
  1. #include <bits/stdc++.h>
  2. // #include <iostream>
  3. // #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     int ex1a, ex1b, ex1c, ex1d, ex1e, ex1r;
  9.     int ex2a, ex2b, ex2c, ex2d, ex2e, ex2r;
  10.     int ex3a, ex3b, ex3c, ex3d, ex3e, ex3r;
  11.     int ex4a, ex4b, ex4c, ex4d, ex4e, ex4r;
  12.     int ex5a, ex5b, ex5c, ex5d, ex5e, ex5r;
  13.  
  14.     system("clear"); // cls for cmd/powershell | clear for bash terminal
  15.  
  16.     cout << "5 Equations 5 Unknowns Calculator (JACOBI)" << endl;
  17.     cout << "Must not have any spaces and include the constant (1a+2b+3c+4d+5e=-6)" << endl << endl;
  18.  
  19.     // INPUT
  20.     cout << "Enter equation 1: ";
  21.     scanf("%d%*c%d%*c%d%*c%d%*c%d%*c%*c%d", &ex1a, &ex1b, &ex1c, &ex1d, &ex1e, &ex1r);
  22.     cout << "Enter equation 2: ";
  23.     scanf("%d%*c%d%*c%d%*c%d%*c%d%*c%*c%d", &ex2a, &ex2b, &ex2c, &ex2d, &ex2e, &ex2r);
  24.     cout << "Enter equation 3: ";
  25.     scanf("%d%*c%d%*c%d%*c%d%*c%d%*c%*c%d", &ex3a, &ex3b, &ex3c, &ex3d, &ex3e, &ex3r);
  26.     cout << "Enter equation 4: ";
  27.     scanf("%d%*c%d%*c%d%*c%d%*c%d%*c%*c%d", &ex4a, &ex4b, &ex4c, &ex4d, &ex4e, &ex4r);
  28.     cout << "Enter equation 5: ";
  29.     scanf("%d%*c%d%*c%d%*c%d%*c%d%*c%*c%d", &ex5a, &ex5b, &ex5c, &ex5d, &ex5e, &ex5r);
  30.  
  31.     // PROCESS - JACOBI
  32.     int k = 1;
  33.     bool isInfinite = false;
  34.     double oldA = 0, oldB = 0, oldC = 0, oldD = 0, oldE = 0;
  35.     double newA, newB, newC, newD, newE;
  36.     double errorA, errorB, errorC, errorD, errorE, errorAvg;
  37.  
  38.     while (true) {
  39.  
  40.         newA = -(-ex1r + (ex1b * oldB) + (ex1c * oldC) + (ex1d * oldD) + (ex1e * oldE)) / ex1a;
  41.         newB = -(-ex2r + (ex2a * oldA) + (ex2c * oldC) + (ex2d * oldD) + (ex2e * oldE)) / ex2b;
  42.         newC = -(-ex3r + (ex3a * oldA) + (ex3b * oldB) + (ex3d * oldD) + (ex3e * oldE)) / ex3c;
  43.         newD = -(-ex4r + (ex4a * oldA) + (ex4b * oldB) + (ex4c * oldC) + (ex4e * oldE)) / ex4d;
  44.         newE = -(-ex5r + (ex5a * oldA) + (ex5b * oldB) + (ex5c * oldC) + (ex5d * oldD)) / ex5e;
  45.    
  46.         errorA = abs((newA-oldA)/newA);
  47.         errorB = abs((newB-oldB)/newB);
  48.         errorC = abs((newC-oldC)/newC);
  49.         errorD = abs((newD-oldD)/newD);
  50.         errorE = abs((newE-oldE)/newE);
  51.         errorAvg = (errorA + errorB + errorC + errorD + errorE)/5;
  52.  
  53.         if (errorAvg <= 0.0000000001) {
  54.             break;
  55.         } else if (errorAvg >= 100) {
  56.             isInfinite = true;
  57.             break;
  58.         } else {
  59.             oldA = newA;
  60.             oldB = newB;
  61.             oldC = newC;
  62.             oldD = newD;
  63.             oldE = newE;
  64.         }
  65.  
  66.         k++;
  67.     }
  68.  
  69.     // OUTPUT
  70.     if (isInfinite == false) {
  71.         cout << endl << "-----JACOBI-----" << endl;
  72.         printf("at k = %d\n", k);
  73.         printf("a = %lf\n", newA);
  74.         printf("b = %lf\n", newB);
  75.         printf("c = %lf\n", newC);
  76.         printf("d = %lf\n", newD);
  77.         printf("e = %lf\n", newE);
  78.         printf("%.12lf >= 0.0000000001?\n", errorAvg);
  79.  
  80.     } else {
  81.         cout << endl << "Results are reaching infinity" << endl;
  82.         cout << "Rearrange or change your values to be diagonally dominant." << endl;
  83.     }
  84.  
  85.     return 0;
  86. }
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement