Start zadania:)
This commit is contained in:
parent
87096d90ba
commit
967d4e9ad1
12
Analityka.py
Normal file
12
Analityka.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
import numpy as np
|
||||||
|
def analitycznePolozenie(v0, theta, h0, t):
|
||||||
|
# wartosc przyspieszenia ziemskiego
|
||||||
|
g = 9.81
|
||||||
|
# stopnie na radiany
|
||||||
|
theta_rad = np.radians(theta)
|
||||||
|
|
||||||
|
# Rownania parametryczne dla x(t) i y(t)
|
||||||
|
x = v0 * np.cos(theta_rad) * t
|
||||||
|
y = h0 + v0 * np.sin(theta_rad) * t - 0.5 * g * t**2
|
||||||
|
return x, y
|
||||||
24
Euler.py
Normal file
24
Euler.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Rozwiazanie numeryczne przy uzyciu metody Eulera
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def metodaEulera(v0, theta, h0, dt):
|
||||||
|
# wartosc przyspieszenia ziemskiego
|
||||||
|
g = 9.81
|
||||||
|
theta_rad = np.radians(theta)
|
||||||
|
|
||||||
|
# Inicjalizacja pozycji i predkosci
|
||||||
|
x, y = 0.0, h0
|
||||||
|
vx = v0 * np.cos(theta_rad)
|
||||||
|
vy = v0 * np.sin(theta_rad)
|
||||||
|
|
||||||
|
# lista punktow trajektorii
|
||||||
|
trajektoria = [(x, y)]
|
||||||
|
|
||||||
|
# Petla obliczajaca kolejne punkty az do upadku
|
||||||
|
while y >= 0:
|
||||||
|
x += vx * dt
|
||||||
|
y += vy * dt
|
||||||
|
vy -= g * dt
|
||||||
|
trajektoria.append((x, y))
|
||||||
|
|
||||||
|
return np.array(trajektoria)
|
||||||
12
Main.py
12
Main.py
@ -0,0 +1,12 @@
|
|||||||
|
from Parametry import v0, theta, h0, dt, dt_list
|
||||||
|
from Wykresy import rysujTrajektorie, analizaBledu
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Rysowanie trajektorii dla wybranego kroku czasowego
|
||||||
|
rysujTrajektorie(v0, theta, h0, dt)
|
||||||
|
|
||||||
|
# Analiza wplywu kroku czasowego na dokladnosc symulacji
|
||||||
|
analizaBledu(v0, theta, h0, dt_list)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
11
Parametry.py
Normal file
11
Parametry.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# v0 - predkosc poczatkowa m/s
|
||||||
|
#theta - kat rzutu
|
||||||
|
#h0 - wysokosc poczatkowa m
|
||||||
|
#dt - krok czasowy w sekundach do rysowania trajektori
|
||||||
|
#dt_list - lista do analizy bledu
|
||||||
|
# ------------------------------------------------------
|
||||||
|
v0 = 2
|
||||||
|
theta = 45
|
||||||
|
h0 = 0
|
||||||
|
dt = 0.01
|
||||||
|
dt_list = [0.1, 0.05, 0.01, 0.005, 0.001]
|
||||||
85
README.md
Normal file
85
README.md
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
|
||||||
|
# Symulacja i analiza rzutu ukośnego
|
||||||
|
|
||||||
|
## Cel projektu
|
||||||
|
|
||||||
|
Celem projektu jest stworzenie programu w Pythonie, który symuluje rzut ukośny w jednorodnym polu grawitacyjnym bez oporu powietrza. Program oblicza:
|
||||||
|
|
||||||
|
- trajektorie ruchu na podstawie **dokładnego rozwiązania analitycznego**,
|
||||||
|
- przybliżoną trajektorię metodą numeryczną – **metodą Eulera**,
|
||||||
|
- oraz porównuje obie metody, analizując dokładność w zależności od kroku czasowego `t`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Wymagania
|
||||||
|
|
||||||
|
Do uruchomienia projektu wymagane są biblioteki:
|
||||||
|
|
||||||
|
```
|
||||||
|
pip install numpy matplotlib
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Struktura plików
|
||||||
|
|
||||||
|
- `Main.py` – główny plik uruchamiający program
|
||||||
|
- `Analityka.py` – obliczenia dokładne (analityczne) na podstawie wzorów fizycznych
|
||||||
|
- `Euler.py` – implementacja metody Eulera
|
||||||
|
- `Wykresy.py` – rysowanie wykresów porównawczych
|
||||||
|
- `Parametry.py` – definiowanie parametrów początkowych (v0, kat, h0, dt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Uruchamianie programu
|
||||||
|
|
||||||
|
Po zainstalowaniu bibliotek, uruchom program wpisując:
|
||||||
|
|
||||||
|
```
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Wygenerowane wykresy
|
||||||
|
|
||||||
|
Program generuje dwa wykresy:
|
||||||
|
|
||||||
|
1. Porównanie trajektorii analitycznej i numerycznej (Euler)
|
||||||
|
2. Wykres błędu w zasięgu w zależności od wielkości kroku czasowego `t`
|
||||||
|
|
||||||
|
### Wykresy:
|
||||||
|
- Wykres 1: Trajektoria – analityczna vs Euler
|
||||||
|
- 
|
||||||
|
- Wykres 2: Blad zasięgu vs t
|
||||||
|
- 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Analiza dokładności
|
||||||
|
|
||||||
|
Program analizuje, jak krok czasowy wpływa na dokładność metody Eulera:
|
||||||
|
|
||||||
|
- im mniejsze t, tym mniejszy błąd w zasięgu rzutu,
|
||||||
|
- dla zbyt dużych kroków trajektoria znacząco odbiega od wzorcowej.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Wnioski
|
||||||
|
|
||||||
|
- Metoda Eulera przy małych krokach daje zadowalającą dokładność.
|
||||||
|
- Program pokazuje, jak ważny jest wybór kroku czasowego w metodach numerycznych.
|
||||||
|
- Prosta implementacja pozwala zrozumieć podstawy całkowania numerycznego i ruchu w fizyce klasycznej.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Uwagi techniczne
|
||||||
|
|
||||||
|
- Symulacja zatrzymuje się automatycznie, gdy ciało spadnie na ziemię (y < 0).
|
||||||
|
- Dla bardzo małych t program może działać wolniej (więcej iteracji).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Autor
|
||||||
|
|
||||||
|
Patryk Zamorski
|
||||||
@ -1 +0,0 @@
|
|||||||
Zainstalowac pip install numpy matplotlib
|
|
||||||
58
Wykresy.py
Normal file
58
Wykresy.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# 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()
|
||||||
BIN
resources/analVsEuler.png
Normal file
BIN
resources/analVsEuler.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
BIN
resources/error.png
Normal file
BIN
resources/error.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Loading…
Reference in New Issue
Block a user