Реализация метода Ньютона для вычисления вектора смещения
This commit is contained in:
61
main.cpp
61
main.cpp
@@ -46,12 +46,14 @@ double E1(double t) {
|
|||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
MatrixXd Y = MatrixXd::Zero(MATRIX_DIM, MATRIX_DIM);
|
MatrixXd Y = MatrixXd::Zero(MATRIX_DIM, MATRIX_DIM);
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
VectorXd N = VectorXd::Zero(MATRIX_DIM);
|
VectorXd N = VectorXd::Zero(MATRIX_DIM);
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
VectorXd dX = VectorXd::Zero(MATRIX_DIM);
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
VectorXd X = VectorXd::Zero(MATRIX_DIM);
|
VectorXd X = VectorXd::Zero(MATRIX_DIM);
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||||
|
VectorXd X_backup = VectorXd::Zero(MATRIX_DIM);
|
||||||
|
|
||||||
void Jacobian(double dt) {
|
void Jacobian(double dt) {
|
||||||
Y(0, 0) = 1, Y(0, 3) = -1. / dt;
|
Y(0, 0) = 1, Y(0, 3) = -1. / dt;
|
||||||
@@ -95,10 +97,61 @@ void nevyzka(double dt, double cur_time) {
|
|||||||
|
|
||||||
N(11) = E1(cur_time) - X(6);
|
N(11) = E1(cur_time) - X(6);
|
||||||
N(12) = E2 - X(9);
|
N(12) = E2 - X(9);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
N = -1 * N;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
Jacobian(0.1);
|
double dt = T_Start; // <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
double dt_prev = dt; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
double eps_max = ACR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
double eps_min = 1e-10; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
int counter = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
double cur_time = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
double eps_cur;
|
||||||
|
double eps;
|
||||||
|
double step_c = 0;
|
||||||
|
|
||||||
|
while (dt <= TK) {
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
int iteration = 0;
|
||||||
|
bool flag = true;
|
||||||
|
while (flag) {
|
||||||
|
Jacobian(dt);
|
||||||
|
nevyzka(dt, cur_time);
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
std::cout << Y << std::endl << N;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dX = Y.fullPivLu().solve(N);
|
||||||
|
#ifdef _DEBUG
|
||||||
|
std::cout << '\n' << dX;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X += dX;
|
||||||
|
iteration++;
|
||||||
|
double maximum = X.maxCoeff();
|
||||||
|
if (maximum <= ACR) {
|
||||||
|
flag = false;
|
||||||
|
}
|
||||||
|
else if (iteration == 7 && flag) {
|
||||||
|
iteration = 0;
|
||||||
|
dt /= 2.;
|
||||||
|
if (dt < SMN) {
|
||||||
|
std::cerr << "Sorry, but i can not solve this" << std::endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
X = X_backup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
}
|
||||||
|
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
/*Jacobian(0.1);
|
||||||
nevyzka(0.1, 0);
|
nevyzka(0.1, 0);
|
||||||
std::cout << Y << std::endl << N;
|
std::cout << Y << std::endl << N;*/
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user