1

首先,我想提一下,在编码方面我是一个完整的初学者,更不用说 C++,所以请耐心等待,因为我需要完整的指导。我的任务是在 C++ 中实现一维非谐波振荡器的 Lanczos 算法,参考论文链接Analytical Lanczos method

本文提供了算法实现的分步指南: 分步指南here

初始试验函数为:Psi_1 = (1 + x^2) * (exp(-x^2 - 1/4 * x^4)。

该论文还包含针对这种特殊情况的 MATHEMATICA 代码。数学代码

因此,这是我的尝试,但尚未完成,但是,我想确保我在编程逻辑方面走的是正确的道路。还有很多错误等等。(还请原谅这里缺乏基础,我只是一个初学者。非常感谢。)

int main() {

    //Grid parameters.
    const int Rmin = 1, Rmax = 31, nx = 300;//Grid length and stepsize.

    double dx = (Rmax- Rmin) / nx; //Delta x.

    double a, b;

    std::vector<double> x, psi_1;

    for (int j = 1; j < 64; ++j) { //Corresponds to each succesive Lanczos Vector.

    
        for (int i = Rmin; i < nx + 1; i++) { //Defining the Hamiltonian on the grid. 

            x[i] = (nx / 2) + i;

            psi_1[i] = (1 + pow(x[i] * dx, 2)) * exp(pow(-x[i] * dx, 2) - (1 / 4 * pow(x[i] * dx, 4 )) //Trial wavefunction.

            H[i] = ((PSI[j][i + 1] - 2 * PSI[j][i] + PSI[j][i - 1]) / pow(dx, 2)) + PSI[j][i] * 1/2 * pow(x[i] * dx, 2) + PSI[j][i] * 2 * pow(x[i] * dx, 4) + PSI[j][i] * 1/2 * pow(x[i], 6); //Hamiltonian. ****   

            //First Lanczos step.

            PSI[1][i] = psi_1[i]
        }

    //Normalisation of the wavefunction (b).

    double b[j] = 0.0; 

    for (int i = Rmin; i < nx + 1; i++) { 

        PSI[1][i] = psi_1[i];

        b[j] += abs(pow(PSI[j][i], 2));
    }

    b[j] = b[j] * dx;

    for (int i = Rmin; i < nx + 1; i++) {

        PSI[j] = PSI[j] / sqrt(b[j]);
    }
    //Expectation values (a). Main diagonal of the Hamiltonian matrix.

    double a[j] = 0.0;

    for (int i = Rmin; i < nx + 1; i++) {

        a[j] += PSI[j] * H[i] * PSI[j] * dx
    }
    
    //Recursive expression.

    PSI[j] = H[i] * PSI[j-1] - PSI[j-1] * a[j-1] - PSI[j-2] * b[j-1]

    //Lanczos Matrix.

    LanczosMatrix[R][C] = 
    for (int R = 1; R < 64; R++) {
        row[R] = 
    }
}  

我还没有完成代码,但是非常感谢一些有经验的指导!(此外,代码必须大量清理,但这是首先尝试了解总体思路。)

4

0 回答 0