C语言编程,假如一炮弹在(0,0)打一(ⅹ,y)处,已知初速度V和质量m,已知速度ⅹy分量加速度由空气阻力变化关系ax=0.00236Vx·√(Vx^2+Vy^2),ay同ax且多一个重力加速度9.8m/s²通过一小段时间t迭代,求发射角度使炮弹打到ⅹy附近(误差为5m)?
初速度v0=828,vx,vy为飞行过程速度分量,vx2,vy2用于t时间后的速度分量,质量m=43.5,时间t=0.01s,目标在(x,y)处(射程之内),炮弹初位置在i,j(0,0),发射角度弧度制a∈(0.001~1.250),之后转为角度制an。
已编了一个,以x=20000,y=500运行,结果有问题,正确角度为24度6左右。如何解决?
星号显示不出以乘代替。
#include <stdio.h>
#include <math.h>
#define pi 3.1415926535898
int main()
{
double v0,vx,vy,vx2,vy2,m,t,x,y,i=0,j=0,a,an;
a=0.001;
scanf("%lf",&x);
scanf("%lf",&y);
while(fabs(x-i)>=5&&fabs(y-j)>=5&&a<=1.2500)
{
v0=828.00,m=43.50,t=0.01,i=0,j=0;
a=a+0.001;
vx=v0乘cos(a);
vy=v0乘sin(a);
while(fabs(x-i)>=5&&fabs(y-j)>=5&&j>=0)
{
i=i+vx乘t;
j=j+vy乘t;
vx2=vx-((0.00236乘vx乘sqrt(vx乘vx+vy乘vy))/m)乘t;
if(vy>=0)
{
vy2=vy-((0.00236乘vy乘sqrt(vx乘vx+vy乘vy))/m+9.8)乘t;
}
else
{
vy2=vy+(-(0.00236乘vy乘sqrt(vx乘vx+vy乘vy))/m-9.8)乘t;
}
vx=vx2;
vy=vy2;
}
}
an=a*180/pi;
printf("fire=%lf\n",an);
return 0;
}
计算出来是20度6左右,代码修改如下:
#include <stdio.h>
#include <math.h>
#define pi 3.1415926535898
int main()
{
double v0,vx,vy,vx2,vy2,m,t,x,y,i=0,j=0,a,an;
a=0.001;
scanf("%lf",&x);
scanf("%lf",&y);
while(a<=1.2500)
{
v0=828.00,m=43.50,t=0.01,i=0,j=0;
a=a+0.001;
vx=v0*cos(a);
vy=v0*sin(a);
i = 0;j = 0;
while((x-i)>=0 && (y-j)>=0)
{
i=i+vx*t;
j=j-vy*t;
vx2=vx-((0.00236*vx*sqrt(vx*vx+vy*vy))/m)*t;
if(vy>=0)
{
vy2=vy-((0.00236*vy*sqrt(vx*vx+vy*vy))/m+9.8)*t;
}
else
{
vy2=vy+(-(0.00236*vy*sqrt(vx*vx+vy*vy))/m-9.8)*t;
}
vx=vx2;
vy=vy2;
}
if(fabs(x-i)<5 && fabs(y-j)<5)
break;
}
an=a*180/pi;
printf("fire=%lf\n",an);
return 0;
}