Экселайт
Ученик
(152),
на голосовании
4 месяца назад
Помогите, объясните принцип действия данного кода(по полочкам)) #include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense>
using namespace Eigen; using namespace std;
double V(double x) { if (x > -1 && x < 1) return 0.0; else return 1e30; // Бесконечно высокие стенки }
int main() { const int N = 1000; // Количество точек сетки const double L = 2; // Размер системы const double h = L / N; // Шаг сетки const double mass = 1.0; // Масса частицы const double hbar = 1.0; // Постоянная Планка
MatrixXd A = MatrixXd::Zero(N, N); VectorXd potential(N);
for (int i = 0; i < N; ++i) { double x = -L / 2 + h * i; potential(i) = V(x); if (i > 0) { A(i, i - 1) = 1.0; } A(i, i) = -2.0; if (i < N - 1) { A(i, i + 1) = 1.0; } }
A *= -hbar * hbar / (2 * mass * h * h); A += potential.asDiagonal();
#include <iostream>
#include <vector>
#include <cmath>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
double V(double x) {
if (x > -1 && x < 1) return 0.0;
else return 1e30; // Бесконечно высокие стенки
}
int main() {
const int N = 1000; // Количество точек сетки
const double L = 2; // Размер системы
const double h = L / N; // Шаг сетки
const double mass = 1.0; // Масса частицы
const double hbar = 1.0; // Постоянная Планка
MatrixXd A = MatrixXd::Zero(N, N);
VectorXd potential(N);
for (int i = 0; i < N; ++i) {
double x = -L / 2 + h * i;
potential(i) = V(x);
if (i > 0) {
A(i, i - 1) = 1.0;
}
A(i, i) = -2.0;
if (i < N - 1) {
A(i, i + 1) = 1.0;
}
}
A *= -hbar * hbar / (2 * mass * h * h);
A += potential.asDiagonal();
SelfAdjointEigenSolver<MatrixXd> solver(A);
if (solver.info() != Success) {
cerr << "Eigenvalue decomposition failed!" << endl;
return 1;
}
for (int i = 0; i < 5; ++i) {
cout << "Energy level " << i << ": " << solver.eigenvalues()(i) << endl;
}
return 0;
}