Bergauf und bergrunter - halte drunter: Bahnkurve eines Jagdgeschosses

Modellierung und Simulation der Geschossbahn eines Jagdgeschosses in Abhängigkeit von der Elevation der Visierlinie unter Berücksichtigung des Luftwiderstandes

Außenballistik, Luftreibung, Geschossbahn, Trajektorie, Python
Dr. Dieter Graessle

email: dieter@dieter-graessle.de

web: https://www.dieter-graessle.de

Stand 05.03.2021

Einleitung

Bergauf und bergrunter - halte drunter!

Jeder Jäger hat diesen Merksatz im Rahmen seiner Schießausbildung gelernt und in vielen Internetforen wird darüber diskutiert: Woran liegt das, wieviel macht das aus, ist das nur Jägerlatein?

Diese kleine Studie soll dieser Frage nachgehen, und zwar unter Anwendung der physikalischen Grundlagen: Kräfte und deren Wirkung auf die Bewegung eines Geschosses.

Die Berechnung von ballistischen Bahnkurven erfolgt im einfachsten Fall ohne Berücksichtigung des Luftwiderstandes. Dadurch ergeben sich sehr einfache und analytisch lösbare Bahngleichungen. Für Geschossbahnen kann der Luftwiderstand, der mit dem Quadrat der Geschwindigkeit steigt, in der Regel kaum vernachlässigt werden. Die entstehenden Gleichungen sind Differenzialgleichungen bzw. Differenzialgleichungssysteme, die mit entsprechenden numerischen Iterationsverfahren gelöst ( = simuliert ) werden können. Das verwendete physikalische Prinzip zum Aufbau der Gleichungsstruktur ist das der Superposition der zueinander orthogonalen Bewegungskomponenten in waag- und senkrechter Richtung. Im Gegensatz zum reibungsfreien Modell ist hier, bedingt durch die quadratisch von der Gesamtgeschwindigkeit abhängige Luftreibung, eine vollständige Entkoppelung der Bewegungskomponenten nicht mehr möglich.

Die Programmcodes sind für die Betrachtung der Resultate nicht wichtig. Sie sind für Interessierte jedoch mit dargestellt.

Disclaimer:

Die gezeigten Simulationen stellen eine starke Vereinfachung der Realität dar und sind nicht mit der Präzision eines Ballistikrechners vergleichbar.

Der Python-Code ist amateurhaft und simpel programmiert, aber dafür leicht nachvollziehbar.

Prinzipielle Struktur der Bewegungsgleichungen

Die ballistische Bewegung eines Körpers (= bei einem Wurf) kann mit Hilfe der Zerlegung in Waagrecht- und Senkrechtkomponenten mathematisch beschrieben werden.

Vernachlässigt man den Luftwiderstand, lässt sich die zeitliche Entwicklung der Waagrechtkomponente (x-Koordinate) darstellen als:

$x(t) = v_x \cdot t$

Die Senkrechtkomponente (y-Koordinate) ergibt sich als beschleunigte Bewegung zu:

$y(t) = y_0 + v_0 \cdot t - \frac{1}{2} g \cdot t^2$

wobei g die Fallbeschleunigung mit einem Wert von $9,81 m s^{-2}$ ist.

Durch auflösen der Gleichung der x-Komponente nach t und einsetzen in die Gleichung der y-Komponente ergibt sich eine Parabelbahn.

Für ein Büchsengeschoss kann der Luftwiderstand nicht vernachlässigt werden. Dies hat Auswirkungen für die Berechnung der Bahnkurve aus den Gleichungen der x- und y-Komponenten. Im Folgenden soll dies dargestellt werden.

Die Luftreibung

Die Luftreibungskraft wirkt entgegen der Bewegungsrichtung (Geschwindigkeit) und hängt quadratisch von der Geschwindigkeit in Bahnrichtung ab.

Abbildung 1: Komponenten der Luftreibung

Luftreibungskraft: $ F_R = \frac{1}{2} \cdot \rho \cdot c_w \cdot A \cdot {v_B}^2$

mit

$\vec{v}_B = \begin{pmatrix} v_x \\ v_y \end{pmatrix} = $ Bahngeschwindigkeitsvektor

$v_B = | \vec{v}_B | = $ Betrag der Geschwindigkeit des Geschosses in Bahnrichtung

$\rho=$ Dichte der Luft

$c_w=$ Widerstandsbeiwert des Geschosses

$A$ = Stirnfläche (Querschittsfläche bezüglich Bahngeschwindigkeitsvektor) des Geschosses

Für ein Geschoss mit kreisförmiger Querschnittsfläche ergibt sich mit $A = r^2$ und $r=$ Geschossradius:

$ F_R = \frac{1}{2} \cdot \rho \cdot c_w \cdot r^2 \cdot \pi \cdot {v}^2$

Der $c_w$-Wert bewegt sich für ein Jagdgeschoss im Überschallbereich in der Nähe von ca 0,5. Genaue Angaben hierzu sind nicht leicht zu finden. Eine Umrechnung des ballistischen Koeffizienten in den $c_w$-Wert ist möglich.

Für die Dichte der Luft wird vereinfachend der Wert $ \rho = 1,2250$ $kg \cdot m^{-3} $ verwendet (Luftdichte Meereshöhe bei 1013 hPa, Temperatur = 15°C).

Der physikalische Hintergrund für die Luftdichte wird in der einschlägigen Fachliteratur beschrieben und wird hier nicht weiter behandelt.

Literatur:

https://de.wikipedia.org/wiki/Strömungswiderstand

Aufstellung der Bewegungsgleichungen zur Berechnung der Flugbahn:

Die Darstellung der Geschossbahn erfolgt in x- und y-Koordinaten für die Horizontal- und Vertikalkomponenten der Bewegung.

Abbildung 2: Geschwindigkeitskomponenten der Geschossbahn

Zustandsgrößen:

Die Flugbahn des Geschosses wird im kartesischen Koordinatensystem beschrieben durch die folgenden Zustandsgrößen:

$x(t)$ = horizontale Ortskoordinate

$v_x(t)$ = Geschwindigkeitskomponente in x-Richtung = Horizontalgeschwindigkeit

$y(t)$ = vertikale Ortskoordinate

$v_y(t)$ = Geschwindigkeitskomponente in y-Richtung = Vertikalgeschwindigkeit

Rotation (Drall), Seitenwinde und sich daraus ergebende Effekte (Präzession, Magnus-Effekt) werden in diesem einfachen Modell nicht berücksichtigt. Im einfachsten Fall ohne Berücksichtigung der Luftreibung wäre $v_x(t)$ konstant und eine relative einfach analytische Berechnung der Bahnkurve wäre möglich. Durch die Berücksichtigung des Luftwiderstands wird $v_x(t)$ eine sich zeitlich ändernde Größe.

Hilfsgrößen

Zur Berechnung der Bahnkurve werden verschiedene Hilfsgrößen benötigt:

Bahngeschwindigkeit in Geschossrichtung: $ v_B = \sqrt{ {v_x}^2 + {v_y}^2}$

$\theta$ = Tangentensteigungswinkel der Geschossbahn bezüglich der Horizontalen am Bahnpunkt $P(x|y)$:

$tan(\theta) = \frac{v_y}{v_x} \Rightarrow \theta = arctan \left( \frac{v_y}{v_x} \right)$

Komponentenzerlegung der Luftreibungskraft:

Zur Integration der Bewegungsgleichungen muss die Reibungskraft in die x- und y-Komponenten zerlegt werden:

$F_{R,x} = - cos(\theta) \cdot F_R$

$F_{R,y} = - sin(\theta) \cdot F_R$

Da die Reibungskraft entgegengesetzt der Bewegungsrichtung $\theta$ zeigen, erhalten die Kraftkomponenten ein Minus als Vorzeichen.

Dynamik der Geschossbewegung:

Die Krümmung der Geschossbahn resultiert aus der Veränderung der x- und y-Komponenten der Geschossgeschwindigkeit. Geschwindigkeitsänderungen bezogen auf die Zeit sind Beschleunigungen, die sich über die Grundgleichung der Newtonschen Mechanik $F = m \cdot a$ berechnen lassen:

$ a_x = \frac{d^2 x}{dt^2} = \frac{dv_x}{dt} = \frac{F_x}{m} = \frac{F_{R,x} }{m} $

$ a_y = \frac{d^2 y}{dt^2} = \frac{dv_y}{dt} = \frac{F_y}{m} = \frac{F_G + F_{R,y}}{m} $

mit der Gewichtskraft $ F_G=-m \cdot g$ und $g = 9,81 m \cdot s^{-2}$ (Fallbeschleunigung / Ortsfaktor)

Differenzialgleichungen für die Geschossbahn

Die Ermittlung der Geschossbahn erfolgt durch numerische Integration der Diffentialgleichungen der Bewegungskomponenten. Die obigen Gleichungen, in denen die zweiten Ableitungen der Ortskoordinate verwendet werden, werden jeweils durch zwei Differenzialgleichungen ersetzt. Damit ergibt sich ein System linearer Differenzialgleichungen erster Ordnung.

$\frac{d x}{dt} = v_x$

$\frac{d v_x}{dt} = \frac{F_{R,x} }{m} $

$\frac{d y}{dt} = v_y$

$\frac{d v_y}{dt} = \frac{F_G + F_{R,y}}{m}$

Dieses Differenzialgleichungssystem kann nun nach Festlegung der Konstanten $m, r, c_w, \rho, g $ und des Abschusswinkels $\theta_0$ für ein Zeitintervall $T = [0 , t_{max}]$ numerisch gelöst und damit die Geschossbahn dargestellt werden.

Geschossbahn und Visierlinie, Justierung der Zieleinrichtung

Die Motivation für die Modellierung der Geschossbahn ist die Abweichung von Visierpunkt der Visiereinrichtung und Treffpunkt des Geschosses. Hierfür ist die Zusammenführung der Geschossbahn mit einer Visierlinie (modelliert durch eine Geradengleichung) nötig. Geht man davon aus, dass als Ziel eine vertikale Fläche dient, so entspricht die Differenz $h(x)$ der y-Werte von Geschosskurve und Visierlinie der Abweichung von Ziel- und Treffpunkt. Die folgende Abbildung soll die geometrische Idee der Ansätze für die Geschossbahn und die Visierlinie verdeutlichen. Das Zielfernrohrgehäuse ist im Allgemeinen parallel zum Lauf (also zur Laufseele) montiert (in Spezialfällen mit einer Vorneigung, auf die hier nicht eingegangen wird). Die innere Zieloptik des Zielfernrohrs kann durch einen Einstelltrieb gegenüber dieser Parallelen um den Winkel $\beta$ geneigt werden, so dass sich Geschossbahn und Visierlinie schneiden können.

Abbildung 3: Visierlinie und Geschossbahn

$h(x)$ = Differenz der y-Werte von Geschossbahn und Visierlinie

$\beta$ = Winkel zwischen Laufseelenlinie und Visierlinie

$d_z$ = Abstand zwischen Laufseelenlinie und Visierlinie (optische Achse des Zielfernrohrs)

$l$ = Lauflänge

Zielgeometrie bei nicht-horizontalem Ziel

Der Ausgangspunkt der Visierlinie wird in den Ursprung $O(0|0)$ des Koordinatensystems gelegt. Das Patronenlager als Ausgangspunkt der Geschossbahn wird bei parallel zum Zielfernrohr ausgerichtetem Lauf (als0 $\beta = 0$) durch den Punkt $G(0|-d_z)$ angenähert. Natürlich ist der Winkel zwischen Laufseele und Visierlinie $\beta \neq 0$, wodurch sich der Punkt G verschiebt. Durch einfache Berechnung am rechtwinkligen Dreieck ergibt sich damit für G

$G(x_g|y_g)$ mit

$x_g = -d_z \cdot \sin(\beta) $

$y_g = d_z \cdot \cos(\beta) )$

Abbildung 4: Geometrie beim nichthorizontalen Ziel

Beim Anvisieren eines Zielpunktes, der nicht auf einer Horizontalen mit den Zielfernrohr liegt, wird das winkelstarr montierte System Zielfernrohr / Lauf um den vertikalen Winkel $\alpha$, unter dem das Ziel erscheint, vertikal gedreht. Dieser Winkel $\alpha$ muss zu $\beta$ addiert werden. Damit ergibt sich für den Geschossausgangspunkt:

$\alpha$ = Zielwinkel: Winkel, unter der das Ziel bezüglich der Horizontalen erscheint.

$x_g = -d_z \cdot \sin(\beta + \alpha) $

$y_g = d_z \cdot \cos(\beta + \alpha) $

Berücksichtigung des Laufs:

Setzt man nun einen Lauf der Länge l am Patronenlager an, so ändert sich der Ausgangspunkt der Geschossbahn nochmals. Mit Hilfe weiterer Berechnungen am rechtwinkligen Dreieck ergibt sich eine Verschiebung in

x-Richtung von $l \cdot \cos(\beta + \alpha)$

y-Richtung von $l \cdot \sin(\beta + \alpha)$

und damit ergibt sich für die Koordinaten von G

$x_g = -d_z \cdot \sin(\beta + \alpha) + l \cdot \cos(\beta + \alpha)$

$y_g = d_z \cdot \cos(\beta + \alpha) + l \cdot \sin(\beta + \alpha)$

Anfangsgeschwindigkeiten

Tritt das Geschoss mit der Mündungsgeschwindigkeit $v_0$ unter dem intialen Steigungswinkel $\alpha + \beta$ aus dem Lauf aus, so errechnen sich die beiden Komponenten der Anfangsgeschwindigkeit als:

$v_{x,0} = \cos(\alpha + \beta) \cdot v_0$

$v_{y,0} = \sin(\alpha + \beta) \cdot v_0$

Implementierung mit Python 3

Die oben gezeigten Gleichungen wurden mit Python3 umgesetzt. Die numerische Lösung des Differenzialgleichungssystems erfolgte mit Hilfe des Integrierers scipy.integrate.odeint.

In [29]:
%matplotlib inline

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import math

def deg2rad(deg): # Winkelgrade in Rad
    return deg * 3.14159 / 180

def luftwiderstand1dim(v, d, r,): 
    # v = Geschwindigkeit
    # d = Durchmesser
    # r = Dichte
    # cw = cw-Wert
    # F = Luftreibungskraft
    F = 0.5 * r * cw * d**2 * (3.141 / 4) * v**2
    return F 

def luftwiderstand2dim(v_x, v_y, d, rho, cw): # Luftwiderstandskraft des Geschosses in zwei Dimensionen
    # v_x = Horizontalgeschwindigkeit
    # v_y = Vertikalgeschwindigkeit
    # d = Geschossdurchmesser
    # rho = Dichte der Luft
    # cw = Cw-Wert
    # F = Reibungskraft
    
    v = (v_x**2 + v_y**2)**0.5
    r = d/2
    F = 0.5 * rho * cw * r**2 * 3.14159 * v**2
    phi = math.atan(v_y / v_x)
    Fx = F * math.cos(phi); Fy = F * math.sin(phi)
    return Fx, Fy
    
# Differenzialgleichungsmodell

def derivative(x,t, d, r, cw, m):
    # x = Zustandsvektor
    # t = Zeitpunkt
    # d = Geschossdurchmesser, für Lufwiderstand
    # r = Dichte der Luft, für Luftwiderstand
    # cw = cw-Wert, für Luftwiderstand
    # m = Geschossmasse
    
    dx = [0, 0, 0, 0]
    lw_x, lw_y = luftwiderstand2dim( v_x = x[1], v_y = x[3], d=d, rho=r, cw = cw )
    dx[0] = x[1] # dx = vx
    dx[1] = -lw_x / m # dvx = ax
    dx[2] = x[3] # dy = vy
    dx[3] = -9.81 -lw_y / m #  dvy = ay
    
    return dx

def simulate(t_max, ziel, just, d_z, l, d, r, cw, v0, m ):
    
    b = deg2rad(just) # Winkel zwischen Laufseele und Visierlinie umgerechnet in rad
    a = deg2rad(ziel) # Elevationswinkel der Visierlinie umgerechnet in rad

    # Anfangsgeschwindigkeit
    vy0 = v0 * math.sin(b + a)
    vx0 = v0 * math.cos(b + a)

    # Abschusspunkt G
    x_0 = -d_z * math.sin(b + a)  + l * math.cos(a+b) # d_z ist negativ
    y_0 = d_z * math.cos(b + a) + l * math.sin(a+b)# d_z ist negativ

    # Anfangsbedingungen und Simulationszeitarray
    x0 = [x_0 , vx0, y_0, vy0]
    t = np.linspace(0, t_max , 1000)

    # Loesung des DGL-Systems 

    x = odeint(derivative,x0,t, args=(d,r,cw, m))
    return x
    
def zielachse(x, alpha):
    alpha = deg2rad(alpha)
    y = math.tan(alpha) * x
    return y

Simulation eines Schusses auf ein horizontal liegendes Ziel mit realer Jagdmunition

Es stellt sich nun die Frage, ob das Modell überhaupt in der Lage ist, die Bahn eines realen Geschosses abzubilden. Zur Überprüfung werden die Parameter eines Jagdgeschosses (Tabellenwerte von der Verpackung) verwendet, um Modell und Realität zu vergleichen. Der Cw-Wert wurde durch manuelles Fitten geschätzt und erscheint mit 0,65 für ein Hohlspitzgeschoss realistisch und plausibel.

Geschoss: Hornady Custom ETX 125 grain

m = 0.0081 # Geschossmasse in kg

v0 = 948.0 # Mündungsgeschwindigkeit in m/s

d = 7.62e-3 # Geschossdurchmesser in m

cw = 0.65 # Cw-Wert

In [30]:
# Physikalische Konstanten
r = 1.225 # Dichte der Luft auf Normalniveau
g = 9.81 # Fallbeschleunigung


# Waffe
just = 0.085 # Winkel zwischen Laufseele und Visierlinie in Winkelgraden (Justierung)
d_z = -0.05 # Abstand Laufseele am Patronenlager / Visierlinie an Zieloptik
l = 0.60 # 60 cm Lauf

# Geschoss: Hornady Custom ETX 125 grain
m = 0.0081 # Geschossmasse
v0 = 948.0 # Mündungsgeschwindigkeit
d = 7.62e-3 # Geschossdurchmesser in m
cw = 0.65 # Cw-Wert

# Elevationswinkel alpha  für ein horizontales Ziel = 0
alpha = 0 # Elevationswinkel des Ziels in Winkelgraden


x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
In [31]:
# Vergleich der Bahnkurven anhand der Herstellertabellen
# Hornady Custom ETX .308 125 grain
# S&B Training Full Metal Jacket FMJ .308 147 grain

etx_x = [50.0, 100, 150, 175, 200, 300]
etx_y = [1.2, 4, 2.6, 0, -4.2, -40.5]
etx_y_m = [0.012, 0.04, 0.026, 0, -0.042, -0.405]

v_etx_v = [948.0, 763.0, 598.0, 453.0]
v_etx_x = [0.0, 100.0, 200.0, 300.0]

sb_x = [50, 100, 171, 200, 300]
sb_y = [1.5, 3.8, 0, -4.2, -33.1]

# plot results
plt.rcParams['figure.figsize'] = [10, 5]
markersize = 16

plt.plot(x[:, 0], x[:, 2]*100, 'r-' ) # Geschossbahn 
plt.plot(x[:,0], 0*x[:,0], 'g-') # Horizontale
plt.plot( x[:,0], zielachse(x[:,0], 0) , 'k-')

plt.plot(etx_x, etx_y , 'b.', markersize = markersize)
plt.xlabel('x / m')
plt.ylabel('y / cm')
plt.title('Geschossbahn')
plt.grid()
plt.show()


# plot results
plt.plot(x[:,0] , x[:, 1] )
plt.plot(v_etx_x, v_etx_v, 'b.', markersize = markersize)
plt.xlabel('x / m')
plt.ylabel('v / m/s')
plt.title('Geschwindigkeit')
plt.grid()
plt.show()

Der Vergleich von Simulation und realen Daten zeigt bei der Bahnkurve und der Geschwindigkeitsabnahme eine überraschend gute Übereinstimmung für ein derart einfaches Modell. Durch numerisches curve-fitting mit den Parametern Cw und Justierwinkel $\beta$ ließe sich die Übereinstimmung wahrscheinlich noch verbessern. Dies wird aber vorerst zurückgestellt.

Schuss auf ein höher stehendes Ziel

In [32]:
plt.rcParams['figure.figsize'] = [15, 8]
markersize = 16


fig, ax = plt.subplots()

alpha = 0 # Elevationswinkel des Zielfernrohrs in Winkelgraden
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
h_0 = x[:, 2] #- z
ax.plot( x[:,0], h_0 , 'k-', label='0°')

alpha = 10 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_10 = x[:, 2] - z

xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_10 , 'r-', label='10°')


alpha = 20 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_20 = x[:, 2] - z
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_20 , 'b-', label='20°')


alpha = 30 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_30 = x[:, 2] - z
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_30 , 'g-', label='30°')


alpha = 40 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_40 = x[:, 2] - z
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_40 , 'c-', label='40°')

alpha = 50 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_50 = x[:, 2] - z
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_50 , 'm-', label='50°')




ax.set_yticks(np.arange(-0.4, 0.21, step=0.02), minor=True)
ax.set_yticks(np.arange(-0.4, 0.21, step=0.1), minor=False)
ax.set_xticks(np.arange(0, 350, step = 25))

#ax.set_yticks([0.3, 0.55, 0.7], minor=True)
ax.yaxis.grid(True, which='major', linewidth=3)
ax.yaxis.grid(True, which='minor')
ax.set_ylim([-0.4, 0.2])
ax.xaxis.grid(True)
plt.ylabel('h / m')
plt.xlabel('Gerader Abstand vom Ziel s / m')
plt.legend(title='Elevation')
plt.title('Höhe der Geschossbahn über der Visierlinie in Abhängigkeit \
vo Abstand zum Ziel und Elevationswinkel des Zielfernrohrs')
plt.show()

Aus der Graphik ist deutlich zu erkennen, wie die Höhe des Einschlagpunkts über der Visierlinie mit zunehmendem Elevationswinkel, also steilerem Schuss, zunimmt.

Beispiel:

Bei einem horizontal gelegenen Ziel mit $\alpha = 0°$ liegt der Einschusspunkt bei einer Entfernung von 100 m bei ca. 4 cm über dem Zielpunkt. Dies ist die bekannte Regel "Einschießen mit 4 cm Hochschuss auf 100 m Zieldistanz".

Bei einer Elevation von $\alpha = 50°$ liegt bei einer Zieldistanz von 100 m ca. 11 cm über dem Zielpunkt. Bei einer Zieldistanz von 150 m sind es 13 cm über dem Zielpunkt

Bei $\alpha = 0°$ schneidet das Geschoss die Visierlinie bei ca. 175 m Abstand, bei $\alpha = 40°$ sind es bereits ca. 220 m.

Die Regel "Bergauf und Berg runter - halte drunter" zeigt sich hier also deutlich und macht sich besonders bei größeren Zieldistanzen bemerkbar.

Tiefer stehendes Ziel

Die folgenden Simulationen zeigen die Höhe der Geschossbahn über der Visierlinie für einen Schuss bergab.

In [33]:
plt.rcParams['figure.figsize'] = [15, 8]
markersize = 16


fig, ax = plt.subplots()

alpha = 0 # Elevationswinkel des Zielfernrohrs in Winkelgraden
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
h_0 = x[:, 2] #- z
ax.plot( x[:,0], h_0 , 'k-', label='0°')

alpha = -10 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_10 = x[:, 2] - z
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_10 , 'r-', label='-10°')


alpha = -20 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_20 = x[:, 2] - z
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_20 , 'b-', label='-20°')


alpha = -30 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_30 = x[:, 2] - z
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_30 , 'g-', label='-30°')


alpha = -40 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_40 = x[:, 2] - z
#plt.plot( x[:,0], h_40 , 'c-', label='40°')
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_40 , 'c-', label='-40°')

alpha = -50 
x = simulate(0.5, alpha, just, d_z, l, d, r, cw, v0, m)
z = zielachse(x[:,0], alpha)
h_50 = x[:, 2] - z
#plt.plot( x[:,0], h_50 , 'c-', label='50°')
xx = ( x[:,0] ** 2 + x[:, 2]**2 ) ** 0.5
ax.plot( xx, h_50 , 'm-', label='-50°')




ax.set_yticks(np.arange(-0.4, 0.21, step=0.02), minor=True)
ax.set_yticks(np.arange(-0.4, 0.21, step=0.1), minor=False)

#ax.set_yticks([0.3, 0.55, 0.7], minor=True)
ax.yaxis.grid(True, which='major', linewidth=3)
ax.yaxis.grid(True, which='minor')
ax.set_ylim([-0.4, 0.2])
ax.xaxis.grid(True)
plt.ylabel('h / m')
plt.xlabel('Gerader Abstand vom Ziel s / m')
plt.legend(title='Elevation')
plt.title('Höhe der Geschossbahn über der Visierlinie in Abhängigkeit \
von Abstand zum Ziel und Elevationswinkel des Zielfernrohrs')
plt.show()

Auch hier zeigt sich, dass bei zunehmender Steilheit des Schusses (= negativer werdender Elevation) die Geschossbahn zumehmend über der Achse des Zielfernrohrs verläuft. Die Regel ".... Berg runter - halte drunter" ist klar erkennbar richtig.

Ausblick:

Weitere interessante Verbesserungen wären möglich durch eine genauere Modellierung der folgen den Größen:

Luftdruck:

Im vorliegenden Modell wurde nur der Luftdruck auf Meereshöhe verwendet. Dieser müsste für genauere Berechnungen korrigiert werden.

Cw-Wert:

Der Cw-Wert wurde als konstant angenommen, ist jedoch geschwindigkeitsabhängig. Die Cw(v)-Kurve ist für die meisten Geschosse nicht publiziert.

Weitere Größen, die bei genaueren ballistischen Modellen berücksichtigt werden:

Luftfeuchtigkeit, der Magnuseffekt aus Drall und Seitenwind, der Magnuseffekt aus Drall und Fallgeschwindigkeit und noch vieles mehr.

Literatur:

Poklukar F. 2005: Äußere Ballistik. URL: https://www.tiroler-schuetzen.at/uploads/ballistik_skriptum.pdf

Melchior E und Reuschel H. 1977: Äußere Ballistik. In: Rheinmetall, 1977: Waffentechnisches Taschenbuch. Rheinmetall GmbH, Düsseldorf

Tschannen M. Jahr unbekannt: Aussenballistik, Messtechnik und mathematische Modelle

Danksagung:

Vielen Dank an Herrn Heinrich Storchmeier aus Bamberg für die Anregungen und Verbesserungsvorschläge.