Как рассчитать период маятника - PullRequest
0 голосов
/ 28 марта 2019

Задача - рассчитать период маятника. Одно из моих значений взрывается, когда оно приближается к t = 0, что меня очень смущает. Я также не знаю, правильны ли какие-либо из моих значений.

Ниже приведена моя функция интерполяции, Интерп:

#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. Я также не совсем уверен, как проверить правильность моих результатов.

Любая помощь будет принята с благодарностью. Заранее спасибо

...