这是我尝试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)。
答案 0 :(得分:4)
while(theta <2*PI&&-2*PI)
在c
中如果我们想要组合多个表达式,我们可以使用逻辑运算符将它们组合为
while((theta < 2 * PI) && (theta > -2 * PI))
PS-我不是物理专家。根据您的要求更改条件 答案 1 :(得分:4)
此代码中存在一些问题:
根据标准,您不应使用
main()
但是
int main()
int main(void)
int main(int argc, char *argv[])
也别忘了
return 0;
示例程序:
#include <stdio.h>
int main(void) {
/* Do stuff */
return 0;
}
如果您想了解更多相关信息,请点击here。
正如LutzL所指出,您应该使用M_PI
而不是PI的定义。只需#include <math.h>
这就是你打印价值的方式,例如:
printf("\nValue of M_PI is %f\n\n", M_PI);
了解更多here。
正如rootkea所指出的那样:
如果我们想要组合多个表达式,我们可以将它们组合起来 使用逻辑运算符
while((theta < 2 * PI) && (theta > -2 * PI))
如果您想要更高的精度(我认为就是这种情况),您应该使用double
代替float
。
您正尝试使用float
格式说明符打印"%i"
个变量。这是错误的,"%i"
用于打印int
带符号的整数,并使用错误的说明符调用未定义的行为。您应该使用"%f"
来打印浮点数或双重带符号的十进制数。
阅读有关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
中,你得到了想要的运动方程,它由下面的微分方程表示:
带着惊喜(以及接近的第一顺序),当您解决上述等式时,您会发现:
其中 2 与您的观察结果相符(有一些随机误差(标准偏差),最好不是系统的),即摆的运动由余弦函数描述,它具有周期性幅度等于初始位移的运动,周期等于:
theta
的上述等式描述了一个不会失去能量并且其值无限重复的钟摆,这就是为什么程序中的循环是无限循环谐波振荡 双关语具有相同的值!
如果您想观察慢慢停止的动作,则需要添加额外的阻尼力,这将慢慢减去系统的能量。该阻尼力由运动方程中的以下附加项表示:
再次,可以用角度theta
表示。现在,当你解决运动方程时,振幅乘以:
其中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。应该指出的是:“所有模型都是错误的;实际问题是它们必须是多么错误才有用”