/// <summary> /// Berechnet die Flugbahn eines Flugkörpers nach Newton /// </summary> /// <param name="v0">Startgeschwindigkeit</param> /// <param name="Auftrieb">Auftriebskraft senkrecht zur Flugrichtung</param> /// <param name="Widerstand">Widerstandskraft entgegen der Flugrichtung, bedingt durch den Luftwiderstand</param> /// <param name="Fallbeschleunigung">Fallbeschleunigung</param> /// <param name="dt">Zeitdifferenz zwischen den Einzelmessungen</param> /// <param name="Flugzeit">gesamte betrachtete Flugzeit</param> /// <returns></returns> public static List <Length> Flugbahn2D( Velocity v0, Mass MasseFlugkörper, Func <Velocity, Force> Auftrieb, Func <Velocity, Force> Widerstand, Acceleration Fallbeschleunigung, Time dt, Time Flugzeit) { Debug.Assert(v0.Dimension == 2, "Die Funktion Flugbahn2D ist auf zweidimensionale Vektoren beschränkt. Parameter v0 weicht davon ab !"); Debug.Assert(Fallbeschleunigung.Dimension == 2, "Die Funktion Flugbahn2D ist auf zweidimensionale Vektoren beschränkt. Parameter fallbeschleunigung weicht davon ab !"); var vi = Velocity.MeterPerSec(v0); int stepCount = (int)Math.Ceiling((Flugzeit.ValueInBaseUnit / dt.ValueInBaseUnit)); var pi = Length.Meter(0, 0); var bahn = new List <Length>(stepCount); // Newtonsches Näherungsverfahren für die Flugbahn for (int i = 0; i < stepCount; i++) { // nach F = m*a bestimmt sich aAuftrieb = Fauftrieb/mFlugkörper. vAuftrieb wird durch integration über t ermittelt var vAuftrieb = Velocity.MeterPerSec(Acceleration.MeterPerSec2(Auftrieb(vi), MasseFlugkörper), dt); var vWiderstand = Velocity.MeterPerSec(Acceleration.MeterPerSec2(Widerstand(vi), MasseFlugkörper), dt); vi = vi + Velocity.MeterPerSec(Fallbeschleunigung, Time.SCALE(i, dt)); vi = vi + Velocity.MeterPerSec(vAuftrieb); vi = vi + vWiderstand; // Integration der Wege pi = pi + Length.Meter(vi, dt); // Bahn aufzeichnen bahn.Add(pi); } return(bahn); }
public static LengthInMeter <Mag.One> Meter(Velocity v, Time t) { return((LengthInMeter <Mag.One>)SCALE(Time.Sec(t).Value, Velocity.MeterPerSec(v).S)); }
// m.s-2 public static Acceleration MeterPerSec2(Velocity dV, Time dt) { return(MeterPerSec2(Velocity.MeterPerSec(dV).Vector *(1 / Time.Sec(dt).Value))); }