Задача - рассчитать период маятника. Одно из моих значений взрывается, когда оно приближается к 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. Я также не совсем уверен, как проверить правильность моих результатов.
Любая помощь будет принята с благодарностью. Заранее спасибо