Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <algorithm>
- #include <string>
- #include <conio.h>
- using namespace std;
- vector<double> DL, D, DR;
- double hx;
- double Func(double x)
- {
- return -12*x*x;
- }
- double UFunc(double x)
- {
- return x*x*x*x;
- }
- vector<vector<double>> LocalG(double L)
- {
- const double G1[2][2] = {
- { 1, -1},
- { -1, 1} };
- vector<vector<double>> G2;
- G2.resize(2);
- for (int i = 0; i < 2; i++)
- G2[i].resize(2);
- for (int i = 0; i < 2; i++)
- {
- for (int j = 0; j < 2; j++)
- {
- G2[i][j] = G1[i][j] * L / hx;
- }
- }
- return G2;
- }
- void GlobalG(double L, const vector<double >& x)
- {
- int size = x.size();
- vector<vector<double>> G = LocalG(L);
- for (int i = 0; i < size - 1; i++)
- {
- D[i] += G[0][0];
- D[i + 1] += G[1][1];
- DL[i + 1] += G[0][1];
- DR[i] += G[1][0];
- }
- }
- vector<double> Mult(vector<vector<double>>& m, vector<double>& v)
- {
- vector<double> out;
- out.resize(2);
- for (int i = 0; i < 2; i++)
- {
- out[i] = 0;
- for (int j = 0; j < 2; j++)
- out[i] += m[i][j] * v[j];
- }
- return out;
- }
- vector<vector<double>> LocalM(double koef)
- {
- const double m[2][2] =
- {
- {2, 1 },
- {1, 2}
- };
- vector<vector<double>> M;
- M.resize(2);
- for (int i = 0, size = M.size(); i < size; ++i)
- M[i].resize(2);
- for (int i = 0; i < 2; i++)
- {
- for (int j = 0; j < 2; j++)
- {
- M[i][j] = koef * hx * m[i][j] / 6;
- }
- }
- return M;
- }
- vector<double> GlobalF(double G, const vector<double >& x)
- {
- int countOfElements = (x.size() - 1);
- vector<double> F;
- F.resize(x.size());
- for (int k = 0; k < countOfElements; ++k)
- {
- vector<vector<double>> tmp = LocalM(G);
- vector<double> F1;
- F1.resize(2);
- F1[0] = Func(x[k]);
- F1[1] = Func(x[k + 1]);
- F1 = Mult(tmp, F1);
- F[k] += F1[0];
- F[k + 1] += F1[1];
- }
- return F;
- }
- vector<double> Compute(int& size, vector<double>& s)
- {
- vector<double> U;
- U.resize(size);
- for (int i = 0; i < size - 1; i++)
- {
- if (D[i] != 0)
- {
- double K1 = -DL[i + 1] / D[i];
- DL[i + 1] = 0;
- D[i + 1] += K1 * DR[i];
- s[i + 1] += K1 * s[i];
- }
- }
- U[size - 1] = s[size - 1] / D[size - 1];
- for (int i = size - 2; i > -1; i--)
- {
- U[i] = (s[i] - DR[i] * U[i + 1]) / D[i];
- }
- return U;
- }
- void FBC(int size, vector<double>& v, double kraev1, double kraev2)
- {
- D[0] = 1;
- DR[0] = 0;
- v[0] = kraev1;
- D[size - 1] = 1;
- DL[size - 1] = 0;
- v[size - 1] = kraev2;
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- double L = 0, G = 0, kraev1 = 0, kraev2 = 0;
- FILE* fin;
- fin = fopen("lyambda.txt", "r");
- fscanf(fin, "%lf", &L);
- fin = fopen("gamma.txt", "r");
- fscanf(fin, "%lf", &G);
- int kol_el = 0;
- double tmp = 0, tmp1 = 0;
- int tmp2 = 0;
- vector<double> x;
- fin = fopen("x.txt", "r");
- fscanf(fin, "%lf", &tmp);
- fscanf(fin, "%lf", &tmp1);
- fscanf(fin, "%d", &tmp2);
- fclose(fin);
- hx = (tmp1 - tmp) / tmp2;
- for (int i = 0; i <= tmp2; i++) x.emplace_back(tmp + i * hx);
- kraev1 = UFunc(x[0]);
- kraev2 = UFunc(x[tmp2]);
- int size = x.size();
- DL.resize(size);
- D.resize(size);
- DR.resize(size);
- GlobalG(L, x);
- vector<double> F = GlobalF(G, x);
- FBC(size, F, kraev1, kraev2);
- vector<double> u = Compute(size, F);
- FILE* fout;
- fout = fopen("U.txt", "w");
- fprintf(fout, "x u u* |u-u*| |u-u*/u*| \n");
- for (int i = 0; i < size; i++)
- {
- fprintf(fout, "%lf %lf %lf %lf %lf \n", x[i], u[i], UFunc(x[i]), abs(u[i] - UFunc(x[i])), abs((u[i] - UFunc(x[i])) / UFunc(x[i])));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement