Files
MemMAPR-MKE/MemMAPR-MKE.cpp
ParkSuMin c7ff86c752 Добавлено решение СЛАУ
+ вывод локальной матрицы жёсткости
2025-09-08 22:22:57 +03:00

81 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Header.h"
using namespace Eigen;
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;
return 0;
}