任务是计算摆的周期。当接近t = 0时,我的价值观之一正在爆炸,这让我很困惑。我也不知道我的任何价值观是否正确。
以下是我的插值函数Interp:
#include <stdio.h>
#include <math.h>
double Interp(double x_1, double y_1, double x_2, double y_2, double x){
double k,y,b;
k=(y_2-y_1)/(x_2-x_1);
b=y_2-(k*x_2);
y=k*x+b;
return(y);
}
此函数采用两个x值并内插y值。我在程序中调用此函数以查找时间段。
以下是查找钟摆周期的代码:
#include <stdio.h>
#include <math.h>
double Interp();
int main(){
int i,j;
double x,v,dv,dt,dx,t,n;
double oldt, x1, diff, xnext, crosst1, crosst2, sol;
FILE *fp;
fp=fopen("Pendulum.out","w");
dt=(6*M_PI)/40000;
v=0; j=0;
for(n=0;n<M_PI;n+=0.05){
x=n;
for(i=0;i<50000;i++){
t=i*dt;
dv=(-sin(x)*dt);
dx=v*dt;
v=v+dv;
oldt=(i-1)*dt;
x1=x;
x=x+dx;
xnext=x;
if(j==1 && x1>0 && xnext<0) {
crosst2=Interp(x1, oldt, xnext,t, 0);
j++;
}
if(j==0 && x1>0 && xnext<0) {
crosst1=Interp(x1, oldt, xnext,t, 0);
j++;
}
}
sol=crosst2-crosst1;
fprintf(fp,"%lf\t%lf\n", n, sol);
v=0;
j=0;
i=0;
}
fclose(fp);
}
该程序应该通过记录钟摆第一次越过某个点,然后再次越过某个点来找到周期。然后,找到差异将为我们提供时间。
这是结果输出的示例。
0.000000 -0.000000
0.050000 inf
0.100000 6.287124
0.150000 6.321593
0.200000 6.321101
0.250000 6.313769
0.300000 6.358041
0.350000 6.335938
这些值对我来说似乎很合理(但是),但我无法弄清楚为什么它在n = 0.05时会达到无穷大。我也不完全确定如何检查我的结果是否正确。
任何帮助将不胜感激。预先感谢
答案 0 :(得分:0)
至少这个问题
sol=crosst2-crosst1;
可能会使用crosst2, crosst1
,而没有设置其中一个或两个都导致未定义的行为。
最好将它们初始化或不进行减法,直到两者都被设置。
要进一步调查,请在下面推荐:GTG。
fprintf(fp, "%.17g %.17g %lf\t%lf\n", crosst1, crosst2, n, sol);
注意:我使用了#define M_PI 3.1415926535897932384626433832795