diff --git a/Header.h b/Header.h index 7a1d8de..d91307c 100644 --- a/Header.h +++ b/Header.h @@ -1,3 +1,3 @@ #include #include -#include \ No newline at end of file +#include "Solver.h" \ No newline at end of file diff --git a/MemMAPR-MKE.cpp b/MemMAPR-MKE.cpp index 7ae95fa..521821c 100644 --- a/MemMAPR-MKE.cpp +++ b/MemMAPR-MKE.cpp @@ -1,81 +1,10 @@ #include "Header.h" - -using namespace Eigen; +#include "Solver.h" int main() { std::ifstream file("matrix.txt"); - int N = 3; - int upper = 1, lower = 0; - double A = 1, B = 0, C = 1, L = upper - lower; - - double dx = L / N; - - MatrixXd local = MatrixXd::Zero(2, 2); - local(0, 0) = A / dx - B / 2; - local(0, 1) = -A / dx + B / 2; - local(1, 0) = -A / dx - B / 2; - local(1, 1) = A / dx + B / 2; - std::cout << "Local matrix:\n" << local << std::endl; - - VectorXd local_load(2); - local_load(0) = C * dx / 2; - local_load(1) = C * dx / 2; - - // Ансамблированные матрица и вектор - MatrixXd ansamb = MatrixXd::Zero(N + 1, N + 1); - VectorXd global_load = VectorXd::Zero(N + 1); - - // Ансамблирование для каждого конечного элемента - for (int elem = 0; elem < N; ++elem) { - int node_i = elem; - int node_j = elem + 1; - - // Матрица жесткости - ansamb(node_i, node_i) += local(0, 0); - ansamb(node_i, node_j) += local(0, 1); - ansamb(node_j, node_i) += local(1, 0); - ansamb(node_j, node_j) += local(1, 1); - - // Вектор нагрузки - global_load(node_i) += local_load(0); - global_load(node_j) += local_load(1); - } - - std::cout << "Before:" << std::endl; - std::cout << "Ansamb matrix:\n" << ansamb << std::endl; - std::cout << "Ansamb load vector:\n" << global_load << std::endl; - - // ГУ 1-го рода - double u_left = 5.0; // u(1) = 5 - double u_right = 15.0; // u(6) = 15 - - // 1. Учёт условия u(1)=5 - for (int i = 1; i < N + 1; ++i) { - global_load(i) -= ansamb(i, 0) * u_left; - } - // Обнуляем первую строку и столбец матрицы, устанавливаем диагональ = 1 - ansamb.row(0).setZero(); - ansamb.col(0).setZero(); - ansamb(0, 0) = 1.0; - global_load(0) = u_left; - - // 2. Учёт условия u(6)=15 - for (int i = 0; i < N; ++i) { - global_load(i) -= ansamb(i, N) * u_right; - } - // Обнуляем последнюю строку и столбец матрицы, устанавливаем диагональ = 1 - ansamb.row(N).setZero(); - ansamb.col(N).setZero(); - ansamb(N, N) = 1.0; - global_load(N) = u_right; - - std::cout << "\nAfter:" << std::endl; - std::cout << "Modified matrix:\n" << ansamb << std::endl; - std::cout << "Modified load vector:\n" << global_load << std::endl; - - VectorXd solution = ansamb.fullPivLu().solve(global_load); - std::cout << "\nSolution:" << std::endl; - std::cout << solution << std::endl; + Solver slv(1., 0., 1., 3, 0, 1); + slv.Execute(); return 0; } \ No newline at end of file diff --git a/MemMAPR-MKE.vcxproj b/MemMAPR-MKE.vcxproj index d5110a0..d180b92 100644 --- a/MemMAPR-MKE.vcxproj +++ b/MemMAPR-MKE.vcxproj @@ -124,12 +124,14 @@ + + diff --git a/MemMAPR-MKE.vcxproj.filters b/MemMAPR-MKE.vcxproj.filters index 09afe7f..68b8f0e 100644 --- a/MemMAPR-MKE.vcxproj.filters +++ b/MemMAPR-MKE.vcxproj.filters @@ -13,11 +13,17 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {3be6c970-16cc-463a-a3d5-22a26a8bff54} + Исходные файлы + + Solver + @@ -26,5 +32,8 @@ Исходные файлы + + Solver + \ No newline at end of file diff --git a/Solver.cpp b/Solver.cpp new file mode 100644 index 0000000..f8dddaa --- /dev/null +++ b/Solver.cpp @@ -0,0 +1,79 @@ +#include "Header.h" +#include +using namespace Eigen; + +Solver::Solver(double _A, double _B, double _C, int _N, int _l, int _u) { + A = _A, B = _B, C = _C, N = _N; + upper = _u, lower = _l; + L = upper - lower; + dx = L / N; +} + +void Solver::Execute() { + MatrixXd local = MatrixXd::Zero(2, 2); + local(0, 0) = A / dx - B / 2; + local(0, 1) = -A / dx + B / 2; + local(1, 0) = -A / dx - B / 2; + local(1, 1) = A / dx + B / 2; + std::cout << "Local matrix:\n" << local << std::endl; + + VectorXd local_load(2); + local_load(0) = C * dx / 2; + local_load(1) = C * dx / 2; + + // + MatrixXd ansamb = MatrixXd::Zero(N + 1, N + 1); + VectorXd global_load = VectorXd::Zero(N + 1); + + // + for (int elem = 0; elem < N; ++elem) { + int node_i = elem; + int node_j = elem + 1; + + // + ansamb(node_i, node_i) += local(0, 0); + ansamb(node_i, node_j) += local(0, 1); + ansamb(node_j, node_i) += local(1, 0); + ansamb(node_j, node_j) += local(1, 1); + + // + global_load(node_i) += local_load(0); + global_load(node_j) += local_load(1); + } + + std::cout << "Before:" << std::endl; + std::cout << "Ansamb matrix:\n" << ansamb << std::endl; + std::cout << "Ansamb load vector:\n" << global_load << std::endl; + + // 1- + double u_left = 5.0; // u(1) = 5 + double u_right = 15.0; // u(6) = 15 + + // 1. u(1)=5 + for (int i = 1; i < N + 1; ++i) { + global_load(i) -= ansamb(i, 0) * u_left; + } + // , = 1 + ansamb.row(0).setZero(); + ansamb.col(0).setZero(); + ansamb(0, 0) = 1.0; + global_load(0) = u_left; + + // 2. u(6)=15 + for (int i = 0; i < N; ++i) { + global_load(i) -= ansamb(i, N) * u_right; + } + // , = 1 + ansamb.row(N).setZero(); + ansamb.col(N).setZero(); + ansamb(N, N) = 1.0; + global_load(N) = u_right; + + std::cout << "\nAfter:" << std::endl; + std::cout << "Modified matrix:\n" << ansamb << std::endl; + std::cout << "Modified load vector:\n" << global_load << std::endl; + + VectorXd solution = ansamb.fullPivLu().solve(global_load); + std::cout << "\nSolution:" << std::endl; + std::cout << solution << std::endl; +} \ No newline at end of file diff --git a/Solver.h b/Solver.h new file mode 100644 index 0000000..fed0ee8 --- /dev/null +++ b/Solver.h @@ -0,0 +1,9 @@ +#pragma once +class Solver { +private: + double A, B, C, L, dx; + int N, upper, lower; +public: + Solver(double _A, double _B, double _C, int _N, int _l, int _u); + void Execute(); +}; \ No newline at end of file