Реализация метода Ньютона для вычисления вектора смещения
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>
|
||||
MatrixXd Y = MatrixXd::Zero(MATRIX_DIM, MATRIX_DIM);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
VectorXd N = VectorXd::Zero(MATRIX_DIM);
|
||||
|
||||
// <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);
|
||||
// <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) {
|
||||
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(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() {
|
||||
Jacobian(0.1);
|
||||
nevyzka(0.1, 0);
|
||||
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);
|
||||
std::cout << Y << std::endl << N;*/
|
||||
}
|
||||
Reference in New Issue
Block a user