如何计算摆的周期

时间:2019-03-28 03:44:30

标签: c physics computation

任务是计算摆的周期。当接近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时会达到无穷大。我也不完全确定如何检查我的结果是否正确。

任何帮助将不胜感激。预先感谢

1 个答案:

答案 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