我是C的新手,并且不熟悉编写任何大于几行的程序。
我正在尝试为重力和阻力作用的自由落体中的物体写一个模型。它使用欧拉方法求解两个一阶微分方程,一个用于位置,一个用于速度。
所以我们有:F = m dv / dt = -mg - k | v | v和dy / dt = v
这些解决方案:Vn + 1 = Vn - (delta t *(g +(k / m)| Vn | Vn))和Yn + 1 = Yn +(delta t * Vn)
(在此Vn + 1中是第n + 1个术语等。)
在我的程序中,我试图有两个函数,位置和速度,它们通过传递它们与主函数之间的Y和V值的指针来工作,然后它应该循环直到Y = 0并打印掉每一步的价值观。
当我运行它时会出现类似这样的内容:http://imgur.com/DNHIhHI
有人能告诉我这有什么问题,或者我是否需要完全使用不同的方法?
非常感谢,下面的代码
#include <stdio.h>
void Velocity(double *ptr, double m, double k, double t);
void Position(double *pst, double *ptr, double t );
int main()
{
double k = 18833.5608;
double t = 0;
double m;
double speed = 0;
double *ptr = &speed;
double y = 1000;
double *pst = &y;
printf("Enter mass of object: \n");
scanf("%f" , &m);
do
{
Velocity( ptr, m, k, t );
printf("Velocity at time %f is: %f\n" , t, speed);
Position( pst, ptr, t);
printf("Position at time %f is: %f\n" , t , y);
t++;
}
while((y>0));
return 0;
}
void Velocity(double *velo, double m, double k, double t)
{
double g = 9.80665;
*velo = *velo - (t*(g+((k/m)*fabs(*velo)**(velo))));
}
void Position(double *Y , double *velo, double t )
{
*Y = *Y+(t*(*velo));
}
答案 0 :(得分:1)
当编写进行计算的程序时 - 用任何语言,而不仅仅是C - 尝试使计算的代码接受参数和返回结果但不是变异变量。也就是说,不要写:
void do_calculation( double * result, double x, double y)
{
*result = x + y;
}
...
double r;
do_calculation(&r, 123, 456);
改为写
double do_calculation(double x, double y)
{
return x + y;
}
...
double r = do_calculation(123, 456);
有意义吗?
如果您想要修改现有值,请不要将其作为要变异的变量传递。而不是
void do_calculation(double * accumulator, double x, double y)
{
*accumulator = *accumulator + x + y;
}
...
double r = 10;
do_calculation(&r, 123, 456);
代替
double do_calculation(double original, double x, double y)
{
return original + x + y;
}
...
double r = 10;
r = do_calculation(r, 123, 456);
现在,一旦您的程序架构得更加明智,您就需要学习如何调试小程序。关于这个问题的一些好建议可以在这里找到:
http://ericlippert.com/2014/03/05/how-to-debug-small-programs/
答案 1 :(得分:0)
误解。我相信你试图通过使用小的时间增量来解决方程式。这没有什么不对,只是让时间增量尽可能小,并纠正公式:
#include <stdio.h>
#include <math.h>
void Velocity(double *velocity, double m, double k, double t)
{
double g = 9.80665;
double velo = *(velocity);
velo = velo - (t*(g+((k/m)*abs(velo)*(velo))));
*(velocity)=velo;
}
void Position(double *position , double *velocity, double t )
{
double Y = *(position);
double velo = *(velocity);
Y = Y+(t*(velo));
*(position)=Y;
}
int main()
{
double k = 18833.5608;
double t = 0;
double dt = 0.001; //making a small increment of time
double m=100;
double speed = 0;
double y = 1000;
//printf("Enter mass of object: \n");
//scanf("%f" , &m);
do
{
Velocity( &speed, m, k, dt );
printf("Velocity at time %f is: %f\n" , t, speed);
Position( &y, &speed, dt);
printf("Position at time %f is: %f\n" , t , y);
t+=dt; //increment time by delta t
}
while((y>0));
return 0;
}