Advertisement
osipyonok

tridiagonal matrix algorithm

Oct 27th, 2016
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define INF 1000010000
  4. #define nl '\n'
  5. #define pb push_back
  6. #define ppb pop_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define pii pair<int,int>
  11. #define pdd pair<double,double>
  12. #define all(c) (c).begin(), (c).end()
  13. #define SORT(c) sort(all(c))
  14. #define sz(c) (c).size()
  15. #define rep(i,n) for( int i = 0; i < n; ++i )
  16. #define repi(i,n) for( int i = 1 ; i <= n; ++i )
  17. #define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
  18. #define repf(j,i,n) for( int j = i ; j < n ; ++j )
  19. #define die(s) {std::cout << s << nl;}
  20. #define dier(s) {std::cout << s; return 0;}
  21. #define vi vector<int>
  22. typedef long long ll;
  23. #define MATRIX vector<vector<double> >
  24. #define MAXN 5050
  25. using namespace std;
  26. int n;
  27. vi dj = {-1 , 0 , 1};
  28.  
  29. inline vector<double> Tridiagonal(MATRIX A , vector<double> b){
  30.     vector<double> ans(n , 0);
  31.     vector<double> alpha(n , 0) , beta(n , 0);
  32.     alpha[1] = -A[0][1] / A[0][0];
  33.     beta[1] = b[0] / A[0][0];
  34.     repi(i , n - 2){
  35.         alpha[i + 1] = -A[i][i + 1] / (A[i][i - 1] * alpha[i] + A[i][i]);
  36.         beta[i + 1] = (b[i] - (A[i][i - 1] * beta[i])) / (A[i][i - 1] * alpha[i] + A[i][i]);
  37.     }
  38.     ans[n - 1] = (b[n - 1] - (A[n - 1][n - 2] * beta[n - 1])) / (A[n - 1][n - 1] + (A[n - 1][n - 2] * alpha[n - 1]));
  39.     repn(i , n - 1){
  40.         ans[i] = (alpha[i + 1] * ans[i + 1]) + beta[i + 1];
  41.     }
  42.     return ans;
  43. }
  44.  
  45. int main() {
  46.     ios_base::sync_with_stdio(false);
  47.     cin.tie(NULL);
  48.     cout.precision(3);
  49.     cout.setf(ios::fixed);
  50.     cin >> n;
  51.     srand(std::chrono::duration_cast<std::chrono::nanoseconds>((std::chrono::high_resolution_clock::now().time_since_epoch())).count() + time(0));
  52.     MATRIX A(n , vector<double>(n , 0.));
  53.     rep(i , n){
  54.         rep(j , 3){
  55.             if(i + dj[j] < 0 || i + dj[j] >= n)continue;
  56.             //cin >> A[i][i + dj[j]];
  57.             double tmp = (double)(rand() % 100) / (double)((rand() % 100) + 1);
  58.             if(rand() % 2)tmp = -tmp;
  59.             A[i][i + dj[j]] = tmp;
  60.         }
  61.     }
  62.     vector<double> X(n , 0);
  63.     rep(i , n){
  64.     //  cin >> X[i];
  65.         double tmp = (double)(rand() % 100) / (double)((rand() % 100) + 1);
  66.         if(rand() % 2)tmp = -tmp;
  67.         X[i] = tmp;
  68.     }
  69.     vector<double> B(n , 0);
  70.     rep(i , n){
  71.         rep(j , 3){
  72.             if(i + dj[j] < 0 || i + dj[j] >= n)continue;
  73.             B[i] += A[i][i + dj[j]] * X[i + dj[j]];
  74.         }
  75.     }
  76.     rep(i , n){
  77.         rep(j , n){
  78.             if(j && A[i][j] >= 0)cout << "+ ";
  79.             else cout << "  ";
  80.             cout << setw(6) << A[i][j] << "x" << j + 1 << " ";
  81.         }
  82.         cout << " = " << B[i] << nl;
  83.     }
  84.     vector<double> ans = Tridiagonal(A , B);
  85.     cout << nl;
  86.     rep(i , n)cout << setw(4) << "x" << i + 1 << " = " << ans[i] << " ";
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement