模型使用Euler方法和指针算法不起作用

时间:2014-03-27 16:56:13

标签: c pointers model while-loop

我是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));
}

2 个答案:

答案 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;
}