# 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()