Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- #define all(x) x.begin(), x.end()
- #define rall(x) x.rbegin(), x.rend()
- //#define endl '\n'
- #define boostIO() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
- typedef long double ld;
- typedef vector<vector<ld>> matrix;
- matrix mul(const matrix& a, const matrix& b) {
- matrix ans(a.size(), vector<ld>(b[0].size()));
- for (int i = 0; i < a.size(); ++i)
- for (int j = 0; j < b[0].size(); ++j)
- for (int k = 0; k < b.size(); ++k)
- ans[i][j] += a[i][k] * b[k][j];
- return ans;
- }
- void print(string name,const matrix& a) {
- cout << name << " = \n";
- for (auto row : a) {
- for (auto x : row) {
- cout << fixed << setw(15) << x;
- }
- cout << endl;
- }
- }
- const ld EPS = 1e-6;
- const ld INF = LONG_MAX;
- int gauss(matrix& a, vector<ld>& ans) {
- int n = (int)a.size();
- int m = (int)a[0].size() - 1;
- vector<int> where(m, -1);
- for (int col = 0, row = 0; col < m && row < n; ++col) {
- int sel = row;
- for (int i = row; i < n; ++i)
- if (abs(a[i][col]) > abs(a[sel][col]))
- sel = i;
- if (abs(a[sel][col]) < EPS)
- continue;
- for (int i = col; i <= m; ++i)
- swap(a[sel][i], a[row][i]);
- where[col] = row;
- for (int i = 0; i < n; ++i)
- if (i != row) {
- double c = a[i][col] / a[row][col];
- for (int j = col; j <= m; ++j)
- a[i][j] -= a[row][j] * c;
- }
- ++row;
- }
- print("a", a);
- ans.assign(m, 0);
- for (int i = 0; i < m; ++i)
- if (where[i] != -1)
- ans[i] = a[where[i]][m] / a[where[i]][i];
- for (int i = 0; i < n; ++i) {
- double sum = 0;
- for (int j = 0; j < m; ++j)
- sum += ans[j] * a[i][j];
- if (abs(sum - a[i][m]) > EPS)
- return 0;
- }
- for (int i = 0; i < m; ++i)
- if (where[i] == -1)
- return INF;
- return 1;
- }
- int main() {
- matrix A = {
- {352809.0 / 50000,-233253.0 / 100000.0,0,0,0},
- {65007.0 / 10000.0,-281899.0 / 100000.0,-451277.0 / 100000.0,0,0},
- {0,17213.0 / 2000,75103.0 / 10000,855647.0 / 100000.0,0},
- {0,0,26733.0 / 4000.0,-493469.0 / 50000.0,31539.0 / 6250.0},
- {0,0,0,93833.0 / 12500.0,-417783.0 / 50000.0}
- };
- vector<ld> b = { 2.23609, -8.3874, -2.47353, 7.43828, -0.746177};
- vector<ld> fi(5), l(5), x(5);
- fi[0] = -A[0][1] / A[0][0];
- l[0] = b[0] / A[0][0];
- for (int i = 1; i < 5; ++i) {
- if (i != 4)
- fi[i] = -A[i][i + 1] /
- (A[i][i] + A[i][i - 1] * fi[i - 1]);
- l[i] = (b[i] - A[i][i - 1] * l[i - 1]) /
- (A[i][i] + A[i][i - 1] * fi[i - 1]);
- }
- x[4] = l[4];
- for (int i = 3; i >= 0; --i) {
- x[i] = x[i + 1] * fi[i] + l[i];
- }
- cout << endl << "fi: \n";
- for (auto x : fi) {
- cout << x << endl;
- }
- cout << endl << "la: \n";
- for (auto x : l) {
- cout << x << endl;
- }
- cout << endl << "X: \n";
- for (auto xx : x) {
- cout << xx << endl;
- }
- matrix X(5, vector<ld>(1));
- for (int i = 0; i < 5; ++i)
- X[i][0] = x[i];
- print("b", mul(A, X));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement