我正在编写一个程序,该程序将以特定的初始速度以特定角度投掷球的第100个间隔输出各种统计数据表。我无法计算空气阻力。我的代码如下。 1级被解决,巫师正在模拟2D射弹运动而没有空气阻力。我被困在2级女巫是同样的事情,但我需要考虑空气阻力。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Homework2ProjectileMotion
{
class Program
{
private const double interval = 0.001;
private const int mass = 5;
private const double initialSpeed = 10;
private const double angle = Math.PI / 4;
private const double startTime = 0;
private void CalcAll(StreamWriter sw, double drag)
{
double speed = initialSpeed;
double xPos = 0;
double pXPos = 0;
double yPos = 0;
double pYPos = 0;
double zPos = 0;
double pZPos = 0;
double distance = 0;
double xVel = 10 * Math.Cos(angle);
double yVel = 0;
double zVel = 10 * Math.Sin(angle);
double xAcc = 0;
double yAcc = 0;
double zAcc = -9.8;
double mAcc = 9.8;
double xAir = 0;
double yAir = 0;
double zAir = 0;
double air = 0;
double slope = 0;
double vector = 0;
sw.WriteLine("Time\tx\ty\tz\tDistance\tvx\tvy\tvz\tSpeed\tax\tay\taz\tm_Acc\n" + startTime + "\t" + xPos + "\t" + yPos + "\t" + zPos + "\t" + distance + "\t" + xVel + "\t" + yVel + "\t" + zVel + "\t" + speed + "\t" + xAcc + "\t" + yAcc + "\t" + zAcc + "\t" + mAcc);
for (double i=startTime+interval;zPos>=0;i+=interval)
{
air = drag * speed * speed;
if (xPos == 0)
{
slope = 1;
}
else
{
slope = (zPos - pZPos) / (xPos - pXPos);
}
vector = Math.Atan(slope);
xAir = air * Math.Cos(vector);
zAir = air * Math.Sin(vector);
xAcc = ((xAcc * mass) - xAir) / mass;
yAcc = ((yAcc * mass) - yAir) / mass;
zAcc = ((zAcc * mass) - zAir) / mass;
mAcc = Math.Sqrt(xAcc * xAcc + zAcc * zAcc);
xVel = xVel + (xAcc * interval);
yVel = yVel + (yAcc * interval);
zVel = zVel + (zAcc * interval);
speed = Math.Sqrt(xVel * xVel + zVel * zVel);
pXPos = xPos;
pYPos = yPos;
pZPos = zPos;
xPos = xPos + xVel * interval;
yPos = yPos + yVel * interval;
zPos = zPos + zVel * interval;
distance = Math.Sqrt(xPos * xPos + zPos * zPos);
sw.WriteLine(i + "\t" + xPos + "\t" + yPos + "\t" + zPos + "\t" + distance + "\t" + xVel + "\t" + yVel + "\t" + zVel + "\t" + speed + "\t" + xAcc + "\t" + yAcc + "\t" + zAcc + "\t" + mAcc);
}
sw.Close();
}
private void Level1()
{
StreamWriter writer = File.CreateText("Level1.txt");
CalcAll(writer, 0);
writer.Close();
}
private void Level2(double dragCoe)
{
StreamWriter writer = File.CreateText("Level2.txt");
CalcAll(writer, dragCoe);
writer.Close();
}
static void Main(string[] args)
{
Program run = new Program();
//run.Level1();
run.Level2(0.3);
}
}
}
这是前几个输出的图像以及水平与垂直的图表:
答案 0 :(得分:1)
我用来计算阻力的公式是使用矢量:
Fd = -.5*rho*|V|.*V*Cd*A;
或:
Vt = sqrt((2*m*g)/(Cd*A*rho));
y = Vt^2/(2*g)*ln((V0^2+Vt^2)/((V^2*Vt^2));
x = (Vt^2/g)*ln((Vt^2+g*U0*t)/Vt^2);
其中,
Vt是终端速度
g是重力
m是质量
U0是初始x速度(initialSpeed * cos(launchAngle))
V0是初始垂直速度
rho是空气密度
V是速度矢量
| V |是速度矢量的绝对值
Cd是阻力系数(球体为0.47)
A是横截面积(球半径^ 2 * pi)
请记住,Fd是一股力量:
acceleration = (Force of gravity + force of drag )/ mass
,因为:
F = ma
a = F/m
Fnet = Fd+Fg;
a = Fnet/m
答案 1 :(得分:0)
您的加速度计算错误。微分方程是
x'' = -k*v*x'
z'' = -k*v*y' - g
其中v=speed
是速度矢量的长度。
因此你应该计算
speed = Math.Sqrt(xVel * xVel + zVel * zVel);
xAcc = (xGrav*mass-drag*speed*xVel)/mass;
zAcc = (zGrav*mass-drag*speed*zVel)/mass;
使用常量xGrav=0
和zGrav=-9.81
(y作为x),然后使用Euler步骤。