@@ -16,24 +16,24 @@ void Solver::Execute_Linear(double val1, double val2) {
// Локальный вектор нагрузки
VectorXd local_load ( 2 ) ;
local ( 0 , 0 ) = - A / L - B / 2. + C * L / 3 .;
local ( 0 , 1 ) = A / L + B / 2. + C * L / 6 .;
local ( 1 , 0 ) = A / L - B / 2. + C * L / 6 .;
local ( 1 , 1 ) = - A / L + B / 2. + C * L / 3 .;
local ( 0 , 0 ) = - A / L - B / 2. + C * L / 2 .;
local ( 0 , 1 ) = A / L + B / 2. + C * L / 2 .;
local ( 1 , 0 ) = A / L - B / 2. + C * L / 2 .;
local ( 1 , 1 ) = - A / L + B / 2. + C * L / 2 .;
local_load ( 0 ) = - D * L / 2. ;
local_load ( 1 ) = - D * L / 2. ;
// Глобальная матрица жёсткости
MatrixXd ansamb = MatrixXd : : Zero ( N + 1 , N + 1 ) ;
// Глобальный вектор нагрузок
VectorXd global_load = Vector Xd: : Zero ( N + 1 ) ;
// Глобальная матрица жёсткости
MatrixXd ansamb = Matrix Xd: : Zero ( N + 2 , N + 2 ) ;
// Ансамблирование
// Глобальный вектор нагрузок
VectorXd global_load = VectorXd : : Zero ( N + 2 ) ;
// Ансамблирование (с учётом смещения на 1)
for ( int elem = 0 ; elem < N ; + + elem ) {
int node_i = elem ;
int node_j = elem + 1 ;
int node_i = elem + 1 ;
int node_j = elem + 2 ;
ansamb ( node_i , node_i ) + = local ( 0 , 0 ) ;
ansamb ( node_i , node_j ) + = local ( 0 , 1 ) ;
@@ -52,15 +52,16 @@ void Solver::Execute_Linear(double val1, double val2) {
// Граничные условия
double u_right = val2 ;
ansamb . row ( 0 ) . setZero ( ) ;
ansamb . row ( N ) . setZero ( ) ;
ansamb ( 0 , 0 ) = L + 1 ;
ansamb . row ( 0 ) . setZero ( ) ;
ansamb ( 0 , 0 ) = 1 ;
ansamb ( 0 , 1 ) = - 1 ;
global_load ( 0 ) = 0 ;
ansamb ( 1 , 1 ) - = A ;
ansamb ( N , N ) = 1 ;
global_load ( N ) = u_right ;
ansamb . row ( N + 1 ) . setZero ( ) ;
ansamb ( N + 1 , N + 1 ) = 1 ;
global_load ( N + 1 ) = u_right ;
# if DEBUG
std : : cout < < " \n After: " < < std : : endl ;
@@ -74,7 +75,7 @@ void Solver::Execute_Linear(double val1, double val2) {
std : : cout < < solution < < std : : endl ;
std : : ofstream file ( " matrix_linear_ " + std : : to_string ( N ) + " .txt " ) ;
for ( int i = 0 ; i < solution . size ( ) ; i + + ) {
for ( int i = 1 ; i < solution . size ( ) ; i + + ) {
file < < solution ( i ) < < ' ' ;
}
file < < std : : endl ;
@@ -82,7 +83,7 @@ void Solver::Execute_Linear(double val1, double val2) {
void Solver : : Execute_Cubic ( double val1 , double val2 ) {
int mat_dim = 1 + N * 3 ;
int mat_dim = N * 3 + 2 ; // +2 для граничных узлов, как в линейном случае
// Локальная матрица жёсткости
MatrixXd local = MatrixXd : : Zero ( 4 , 4 ) ;
@@ -93,7 +94,7 @@ void Solver::Execute_Cubic(double val1, double val2) {
// Формирование локальной матрицы жёсткости
local ( 0 , 0 ) = - A * 37.0 / 10.0 / L + B * ( - 1.0 ) / 2.0 + C * 8. * L / 105. ;
local ( 0 , 1 ) = - A * ( - 189.0 ) / 40.0 / L + B * 57.0 / 80.0 + C * 33. * L / 560. ;
local ( 0 , 2 ) = - A * 27.0 / 20.0 / L + B * ( - 3.0 ) / 10.0 - C * 3. * L / 140. ;
local ( 0 , 2 ) = - A * 27.0 / 20.0 / L + B * ( - 3.0 ) / 10.0 - C * 3. * L / 140. ;
local ( 0 , 3 ) = - A * ( - 13.0 ) / 40.0 / L + B * 7.0 / 80.0 + C * 19. * L / 1680. ;
local ( 1 , 0 ) = - A * ( - 189.0 ) / 40.0 / L + B * ( - 57.0 ) / 80.0 + C * 33. * L / 560. ;
@@ -111,24 +112,21 @@ void Solver::Execute_Cubic(double val1, double val2) {
local ( 3 , 2 ) = - A * ( - 189.0 ) / 40.0 / L + B * ( - 57.0 ) / 80.0 + C * 33. * L / 560. ;
local ( 3 , 3 ) = - A * 37.0 / 10.0 / L + B * 1.0 / 2.0 + C * 8. * L / 105. ;
// Формирование л окально г о вектора нагрузки
// Л окальный вектор нагрузки
local_load ( 0 ) = - D * L / 8.0 ;
local_load ( 1 ) = - D * 3.0 * L / 8.0 ;
local_load ( 2 ) = - D * 3.0 * L / 8.0 ;
local_load ( 3 ) = - D * L / 8.0 ;
// Глобальная матрица жёсткости
// Глобальные матрицы
MatrixXd ansamb = MatrixXd : : Zero ( mat_dim , mat_dim ) ;
// Глобальный вектор нагрузок
VectorXd global_load = VectorXd : : Zero ( mat_dim ) ;
// Ансамблирование
// Ансамблирование (с о смещением на 1, как в линейной версии)
for ( int elem = 0 ; elem < N ; + + elem ) {
int node_i = elem * 3 ;
for ( int i = 0 ; i < 4 ; i + + ) {
for ( int j = 0 ; j < 4 ; j + + ) {
int node_i = 1 + elem * 3 ; // смещение на 1
for ( int i = 0 ; i < 4 ; + + i ) {
for ( int j = 0 ; j < 4 ; + + j ) {
ansamb ( node_i + i , node_i + j ) + = local ( i , j ) ;
}
global_load ( node_i + i ) + = local_load ( i ) ;
@@ -145,9 +143,10 @@ void Solver::Execute_Cubic(double val1, double val2) {
double u_right = val2 ;
ansamb . row ( 0 ) . setZero ( ) ;
ansamb ( 0 , 0 ) = L / 3.0 + 1 ;
ansamb ( 0 , 0 ) = 1 ;
ansamb ( 0 , 1 ) = - 1 ;
global_load ( 0 ) = 0 ;
ansamb ( 1 , 1 ) - = A ;
ansamb . row ( mat_dim - 1 ) . setZero ( ) ;
ansamb ( mat_dim - 1 , mat_dim - 1 ) = 1 ;
@@ -165,7 +164,7 @@ void Solver::Execute_Cubic(double val1, double val2) {
std : : cout < < solution < < std : : endl ;
std : : ofstream file ( " matrix_cubic_ " + std : : to_string ( N ) + " .txt " ) ;
for ( int i = 0 ; i < solution . size ( ) ; i + + ) {
for ( int i = 1 ; i < solution . size ( ) ; i + + ) {
file < < solution ( i ) < < ' ' ;
}
file < < std : : endl ;