用C建模摆锤

时间:2016-01-15 21:15:36

标签: c math while-loop physics

这是我尝试while循环来模拟钟摆摆动的代码,但所产生的价值似乎对我没有帮助:

#include <stdio.h>
#include <math.h>
#define PI 3.14159265

main()
{
    float theta = 0;   // initial value for angle
    float omega = 0.2; // initial value for angular speed
    float time = 0;    // initial time
    float dt = 0.01;   // time step

    while (theta < 2 * PI && -2*PI) {
        time = time + dt;
        theta = theta + omega*dt;

        printf("theta=%i, omega=%i, time=%i, and dt=%i\n", theta, omega, time, dt);
    }
    system("PAUSE");
}

如何修改此功能以获得更多帮助?我必须使用的while条件是当钟摆向前或向后(-2PI或2PI)进行一次启示时它应该停止。我需要使用公式&#39; omega = omega-(g / l) dt sin(theta)&#39;并且不假设theta大约等于sin(theta)。

5 个答案:

答案 0 :(得分:4)

  1. while(theta <2*PI&&-2*PI)

    c中如果我们想要组合多个表达式,我们可以使用逻辑运算符将它们组合为

    while((theta < 2 * PI) && (theta > -2 * PI))  
    
    PS-我不是物理专家。根据您的要求更改条件

答案 1 :(得分:4)

此代码中存在一些问题:

  1. 根据标准,您不应使用

    main()
    

    但是

    1. int main()
    2. int main(void)
    3. int main(int argc, char *argv[])
    4. 也别忘了

      return 0;
      

      示例程序:

      #include <stdio.h>
      
      int main(void) {       
          /* Do stuff */        
          return 0;    
      }
      

      如果您想了解更多相关信息,请点击here

    5. 正如LutzL所指出,您应该使用M_PI而不是PI的定义。只需#include <math.h>

      这就是你打印价值的方式,例如:

      printf("\nValue of M_PI is %f\n\n", M_PI);
      

      了解更多here

    6. 正如rootkea所指出的那样:

        

      如果我们想要组合多个表达式,我们可以将它们组合起来   使用逻辑运算符

           

      while((theta < 2 * PI) && (theta > -2 * PI))

    7. 如果您想要更高的精度(我认为就是这种情况),您应该使用double代替float

    8. 您正尝试使用float格式说明符打印"%i"个变量。这是错误的,"%i"用于打印int带符号的整数,并使用错误的说明符调用未定义的行为。您应该使用"%f"来打印浮点数或双重带符号的十进制数。

    9. 阅读有关printf格式说明符here的内容。

答案 2 :(得分:2)

您使用的角度方程式不正确。根据你的表达式,它随时间线性变化,尽管方程是谐波的:

θ=θ 0 cos(ωt)

其中ω= g / L L 是钟摆的长度, g 是由重力引起的加速度。

thetaMax是最大偏转角,g是重力常数,L是摆的长度,t是时间。因此,您希望了解节能法中的thetaMax

Alrught,让我们在这里修改节能法:

如您所知,最大偏转时的势能等于摆径最低点的动能:

KE = ПE
m*g*L*sin(thetaMax) = m*sqr(omega)*sqr(L)/2

大约对于小角度:

m*g*L*thetaMax = m*sqr(omega)*sqr(L)/2
thetaMax = sqr(omega)*L/(2*g)

就是这样。这是计算这种振荡运动的代码。所有绝对值:

#include <stdio.h>
#include <math.h>
#define PI 3.14159265
#define L 1 //length of the pendulum
#define g 9.8  //gravity const

int main()
{
    double theta = 0; // initial value for angle
    double omega = 0.2; // initial value for angular speed
    double time = 0; // initial time
    double dt = 0.01; // time step

    double thetaMax = omega*omega*L/(2*g);

    while (theta < thetaMax) {
        time = time + dt;
        theta = thetaMax * sin(omega*time);
        printf("theta=%f, omega=%f, time=%f, and thetaMax=%f\n", theta, omega, time, thetaMax);
     }
    return 0;
}

它将无限地计算这些参数,因此只需将while循环条件下的θ限制为所需的偏转角度。

答案 3 :(得分:1)

(物理摆锤上的简单点质量)等式是

  

θ''+ k·sin(θ)= 0

常数:

  

k = g / L

包含引力g和长度L.

θ是从静止位置测量的角度,当然是指向下方,也就是说,在具有通常角度约定的笛卡尔坐标系中,在-90°。因此,钟摆振荡转化为零theta振荡。

你可以使用辛欧拉或Verlet / Leapfrog来解决那个(保守的)微分方程。一个变体中的辛欧拉有一个循环(使用ω=θ',即(θ',ω')=(ω, -k·sin(θ)

for(...) {
    omega -= k*sin(theta) * dt;
    theta  += omega * dt;
    t += dt;
    printf(...);
}

答案 4 :(得分:1)

简单来说,建模的想法涉及找到物理现象的数学表示。换句话说,你需要“找到”一个代表上下文中对象的所有可观察属性的方程式,在你的情况下是一个钟摆 1

所有你需要描述的钟摆是运动方程。为了找到它,你首先尝试通过观察它来限定运动:

  

如果你试图从它的平衡点取代它(很多次以一个非常小的角度),你将主要观察很少的波动,沿着相同的路径,它的振幅减小,并恢复到稳定的平衡,如如果通过某种恢复力,换句话说,钟摆执行常规和重复运动,称为周期性运动

因此,你正在寻找一个可以代表周期运动的数学函数,因为事实证明这个角色的一个很好的候选者是三角函数: sin cos ,具有所需的属性,即用期间T 重复自己。

要找到并量化这种恢复力,你可以使用牛顿第二定律,在你用非常小的角度theta << 1(允许使用小角度近似值sin(theta) = theta)表达所有内容之后在位移theta中,你得到了想要的运动方程,它由下面的微分方程表示:

enter image description here

带着惊喜(以及接近的第一顺序),当您解决上述等式时,您会发现:

enter image description here

其中 2 与您的观察结果相符(有一些随机误差(标准偏差),最好不是系统的),即摆的运动由余弦函数描述,它具有周期性幅度等于初始位移的运动,周期等于:

enter image description here

,这是捕获

theta的上述等式描述了一个不会失去能量并且其值无限重复的钟摆,这就是为什么程序中的循环是无限循环谐波振荡 双关语具有相同的值!

如果您想观察慢慢停止的动作,则需要添加额外的阻尼力,这将慢慢减去系统的能量。该阻尼力由运动方程中的以下附加项表示:

enter image description here

再次,可以用角度theta表示。现在,当你解决运动方程时,振幅乘以:

enter image description here

其中b是阻尼常数,它取决于运动停止的速度。

由于上述

如果你想看到类似于真正的钟摆的东西,你需要将这最后一个指数包含在你的等式中。

为此,请遵循@Petr Stepanov提供的精彩解释,修改thetaMax以包含上述指数。

#include <stdio.h>
#include <math.h>
#define PI 3.14159
#define E 2.71828      // Euler's number
#define L 1            // length of the pendulum
#define g  9.80665     // gravity const

int main() {

    double theta = 0.0; // initial value for angle
    double omega = 0.2; // initial value for angular speed
    double time = 0.0;  // initial time
    double dt = 0.01;   // time step
    double b = 0.5;     // modified damping constant

    double thetaMax = omega * omega * L / (2 * g);

    while (theta < thetaMax) {
        time = time + dt;
        theta = thetaMax * ldexp(E, (-b) * time) * sin(omega * time);

        printf("Deflection angle=%f, Angular frequency=%f, Time=%f\n", theta, omega, time);
    }

    return 0;
}

1。一个质量为m 的物体,悬挂在一个固定点上,带有一个非弹性的“无质量”螺纹,长度为长度,可以在重力场中自由摆动,由重力加速度常数g 量化。功能

2。应该指出的是:“所有模型都是错误的;实际问题是它们必须是多么错误才有用”