SimRzutUkosny/Wykresy.py
2025-05-16 19:01:31 +02:00

59 lines
1.9 KiB
Python

# wykresy.py
# Porownanie trajektorii oraz analiza bledu metody Eulera
import numpy as np
import matplotlib.pyplot as plt
from Analityka import analitycznePolozenie
from Euler import metodaEulera
# Funkcja rysujaca wykres porownawczy trajektorii
def rysujTrajektorie(v0, theta, h0, dt):
g = 9.81
theta_rad = np.radians(theta)
# Czas lotu z rozwiazania analitycznego
t_flight = (v0 * np.sin(theta_rad) + np.sqrt((v0 * np.sin(theta_rad))**2 + 2 * g * h0)) / g
t_vals = np.linspace(0, t_flight, 1000)
# Obliczenie trajektorii analitycznej i numerycznej
x_anal, y_anal = analitycznePolozenie(v0, theta, h0, t_vals)
traj_num = metodaEulera(v0, theta, h0, dt)
# Rysowanie wykresu
plt.figure(figsize=(10, 6))
plt.plot(x_anal, y_anal, label="Analityczna", color='blue')
plt.plot(traj_num[:, 0], traj_num[:, 1], label=f"Euler (dt={dt})", color='red', linestyle='--')
plt.xlabel("x [m]")
plt.ylabel("y [m]")
plt.title("Porownanie trajektorii rzutu ukosnego")
plt.legend()
plt.grid()
plt.show()
# Funkcja analizujaca blad koncowego zasiegu w zaleznosci od kroku czasowego
def analizaBledu(v0, theta, h0, dt_values):
g = 9.81
theta_rad = np.radians(theta)
# Obliczenie analitycznego zasiegu
t_flight = (v0 * np.sin(theta_rad) + np.sqrt((v0 * np.sin(theta_rad))**2 + 2 * g * h0)) / g
t_vals = np.linspace(0, t_flight, 1000)
x_anal, _ = analitycznePolozenie(v0, theta, h0, t_vals)
x_end_anal = x_anal[-1]
errors = []
for dt in dt_values:
traj_num = metodaEulera(v0, theta, h0, dt)
x_end_num = traj_num[-1, 0]
error = abs(x_end_num - x_end_anal)
errors.append(error)
# Rysowanie wykresu bledu wzgledem kroku czasowego
plt.figure(figsize=(8, 5))
plt.plot(dt_values, errors, marker='o')
plt.xlabel("Krok czasowy t [s]")
plt.ylabel("Blad zasiegu [m]")
plt.title("Zaleznosc bledu od kroku czasowego")
plt.grid()
plt.show()