一维谐振子递归函数,可能的无限循环,c++ 语法
1-d harmonic oscillator recursive function, possible Infinit-loop, c++ syntax
使用递归函数处理一维谐波振荡器,代码在 Fortran 中运行,并尝试转换为 C++ 以学习新语法。
到目前为止,我已经通过 google 搜索修复了所有通知的错误,但仍然没有得到结果。该程序似乎永远运行而没有发布结果。
我认为可能的答案可能是它根本没有被计算,或者由于我的 for 循环或调用函数中的语法问题而存在一些无限循环?但我没有看到它,也没有识别出它们的错误。
关于为什么这个程序不能正常工作的任何建议?
//
// main.cpp
// 1-d HO
//
// Created by Grant Metheny on 3/2/16.
// Copyright (c) 2016 Grant Metheny C++ Codes. All rights reserved.
//
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <cmath>
#include <math.h>
using namespace std;
int i = 0;
int n = 0;
double x = 1.;
double xmax = 5;
double imax = 1000;
double wavefunc = 0;
double fact = 1;
double hpol = 1;
double wf0 = 1;
double wf1 = 1;
double wf2 = 1;
double wf3 = 1;
double wf4 = 1;
double wf5 = 1;
double wf6 = 1;
double wavefunction(int n, double x)
{
return wavefunc = pow(2.0,-(n*.5)) * pow(M_PI,.25) * exp(-(.5*pow(x,2.0)));
}
double factorial(int n)
{
for (i = 0; i <= n; i++)
if (i == 0)
fact = 1.;
else
fact = fact * i;
return fact;
}
double hermite(int n, double x)
{
for (i = 0; i <= n; i++)
if (i==1)
hpol = 1.0;
else if (n==1)
hpol = 2*x;
else
hpol = 2*x*hermite(n-1,x) - 2*(n-1)*hermite(n-2,x);
return hpol;
}
double dx = 2*xmax/imax;
int main(int argc, const char * argv[]) {
for (i=0; i <= imax; i++) {
x = 5. - dx*i;
n = 0;
wf0 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 1;
wf1 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 2;
wf2 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 3;
wf3 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 4;
wf4 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 5;
wf5 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 6;
wf6 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
cout <<"I="<< i <<"X="<< x <<"WF0="<< wf0<<"WF1=" << wf1; // wf2, wf3, wf4, wf5, wf6
}
return 0;
}
您的 for
循环没有终止。而不是这个:
for (i = 0; n; i++)
(显然是受 Fortran 启发),你需要这样做:
for (i = 0; i < n; i++)
想法是 for
循环的第二部分不是限制;它是一个应该评估为 true
(以保持循环再进行一次迭代)或 false
(以退出循环)的谓词。因为 C/C++ 将非零整数值视为 true
每当需要 true/false 值时,循环就会继续进行。
您需要在代码中的多个位置进行该更正。
使用递归函数处理一维谐波振荡器,代码在 Fortran 中运行,并尝试转换为 C++ 以学习新语法。
到目前为止,我已经通过 google 搜索修复了所有通知的错误,但仍然没有得到结果。该程序似乎永远运行而没有发布结果。
我认为可能的答案可能是它根本没有被计算,或者由于我的 for 循环或调用函数中的语法问题而存在一些无限循环?但我没有看到它,也没有识别出它们的错误。
关于为什么这个程序不能正常工作的任何建议?
//
// main.cpp
// 1-d HO
//
// Created by Grant Metheny on 3/2/16.
// Copyright (c) 2016 Grant Metheny C++ Codes. All rights reserved.
//
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <cmath>
#include <math.h>
using namespace std;
int i = 0;
int n = 0;
double x = 1.;
double xmax = 5;
double imax = 1000;
double wavefunc = 0;
double fact = 1;
double hpol = 1;
double wf0 = 1;
double wf1 = 1;
double wf2 = 1;
double wf3 = 1;
double wf4 = 1;
double wf5 = 1;
double wf6 = 1;
double wavefunction(int n, double x)
{
return wavefunc = pow(2.0,-(n*.5)) * pow(M_PI,.25) * exp(-(.5*pow(x,2.0)));
}
double factorial(int n)
{
for (i = 0; i <= n; i++)
if (i == 0)
fact = 1.;
else
fact = fact * i;
return fact;
}
double hermite(int n, double x)
{
for (i = 0; i <= n; i++)
if (i==1)
hpol = 1.0;
else if (n==1)
hpol = 2*x;
else
hpol = 2*x*hermite(n-1,x) - 2*(n-1)*hermite(n-2,x);
return hpol;
}
double dx = 2*xmax/imax;
int main(int argc, const char * argv[]) {
for (i=0; i <= imax; i++) {
x = 5. - dx*i;
n = 0;
wf0 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 1;
wf1 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 2;
wf2 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 3;
wf3 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 4;
wf4 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 5;
wf5 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
n = 6;
wf6 = hermite(n,x) * wavefunction(n,x) * pow(factorial(n),(-(.5)));
cout <<"I="<< i <<"X="<< x <<"WF0="<< wf0<<"WF1=" << wf1; // wf2, wf3, wf4, wf5, wf6
}
return 0;
}
您的 for
循环没有终止。而不是这个:
for (i = 0; n; i++)
(显然是受 Fortran 启发),你需要这样做:
for (i = 0; i < n; i++)
想法是 for
循环的第二部分不是限制;它是一个应该评估为 true
(以保持循环再进行一次迭代)或 false
(以退出循环)的谓词。因为 C/C++ 将非零整数值视为 true
每当需要 true/false 值时,循环就会继续进行。
您需要在代码中的多个位置进行该更正。