Skip to content
Snippets Groups Projects
Commit c913bd19 authored by Peter Istvan's avatar Peter Istvan
Browse files

Végleges

parent 876a0b2b
No related branches found
No related tags found
No related merge requests found
No preview for this file type
File added
File deleted
File added
from scipy.integrate import ode as ode
# Coulomb-állandó
K = 8.98e9
# Pálca paraméterei
PALCA_X = 0.0
PALCA_YMIN = 0.0
PALCA_YMAX = 1.0
PALCA_YMIN = -0.5
PALCA_YMAX = 0.5
LMBD = 1
PALCA_FELBONTAS = 10000
# Az iránymező integrálásának "idő-lépésköze"
# Az erővonalon a referenciapontok sűrűségét befolyásolja
T_LEPES = 0.005
# A vizsgált sík határai
XMIN = PALCA_X - 0.5
XMAX = PALCA_X + 0.5
YMIN = PALCA_YMIN - 0.5
YMAX = PALCA_YMAX + 0.5
# rToltés helyen található ponttöltés elektromos tere rHely-en
def tererosseg2Dtoltes(rToltes, qToltes, rHely):
rVektor = [rHely[0] - rToltes[0], rHely[1] - rToltes[1]]
rHossz = (rVektor[0] ** 2 + rVektor[1] ** 2) ** 0.5
return [K * qToltes * rVektor[0] / rHossz ** 3, K * qToltes * rVektor[1] / rHossz ** 3]
# A (0, 0) és (0, 1) végpontú adott töltéssűrűségű pálca által generált térerősség rHely helyzetvektorú pontban
# A felbontás(>=1) megadja, hogy a pálcát hány pontszerű darabra bontja fel a numerikus közelítés
# A (PALCA_X, PALCA_YMIN) és (PALCA_X, PALCA_YMAX) végpontú adott töltéssűrűségű pálca elektromos tere rHely-en
# A felbontás megadja, hogy a pálcát hány pontszerű darabra bontja fel a numerikus integrálás
def tererosseg2D(rHely, toltessuruseg, felbontas):
E = [0, 0]
if rHely[0] == PALCA_X and PALCA_YMAX >= rHely[1] >= PALCA_YMIN:
......@@ -21,6 +34,38 @@ def tererosseg2D(rHely, toltessuruseg, felbontas):
else:
for k in range(0, felbontas):
palca_hossz = PALCA_YMAX - PALCA_YMIN
dE = tererosseg2Dtoltes([0, k * palca_hossz / felbontas], toltessuruseg * palca_hossz / felbontas, rHely)
dE = tererosseg2Dtoltes([PALCA_X, PALCA_YMIN + k * palca_hossz / felbontas], toltessuruseg * palca_hossz / felbontas, rHely)
E[0], E[1] = E[0] + dE[0], E[1] + dE[1]
return E
# Az rHely-en a pálca által generált térerősség irányvektora (normált vektora)
# A t független valós paraméter, a mező statikussága miatt nem játszik szerepet
# Az f(t, vektor) alakot a SciPy csomag követeli meg az iránymező kezdőfeltételes integrálásakor
def irany(t, rHely):
vek = tererosseg2D(rHely, LMBD, PALCA_FELBONTAS)
if vek == [0, 0]:
return [0, 0]
else:
hossz = (vek[0]**2 + vek[1]**2)**0.5
return [vek[0]/hossz, vek[1]/hossz]
# Visszatéríti az irany(t, rHely) által megadott iránymező megfelelő erővonalát mint pontok irányított sorozatát
# Az adott kezdőpontot mint kezdőfeltételt a scipy.integrate.ode.integrate() függvény veszi át
def erovonal(kezdopont, dt):
# Ha negatív a töltéssűrűség, az integrálás iránya "időben visszafele" lesz
if LMBD < 0:
dt = -dt
ev = [kezdopont]
megoldo = ode(irany)
megoldo.set_integrator('vode')
megoldo.set_initial_value(kezdopont, 0)
while megoldo.successful():
megoldo.integrate(megoldo.t + dt)
ev.append([megoldo.y[0], megoldo.y[1]])
if megoldo.y[0] > XMAX or megoldo.y[0] < XMIN or megoldo.y[1] > YMAX or megoldo.y[1] < YMIN:
break
if LMBD < 0:
ev.reverse()
return ev
import src.fizika as fiz
import numpy as np
def fokuszpont_tavolsagkulonbseg(x, y, f1x, f1y, f2x, f2y):
d1 = ((x - f1x)**2 + (y - f1y)**2)**0.5
d2 = ((x - f2x)**2 + (y - f2y)**2)**0.5
return abs(d1 - d2)
def hiperbola():
print("Erővonal vizsgálata...")
print("----------------------")
KP_X = fiz.PALCA_X + 0.01
KP_Y = (fiz.PALCA_YMAX * 3 + fiz.PALCA_YMIN)/4
KP = [KP_X, KP_Y]
print("A vizsgált erővonal kezdőpontja: " + str(KP))
ev = fiz.erovonal(KP, 0.0005)
F1 = [fiz.PALCA_X, fiz.PALCA_YMIN]
F2 = [fiz.PALCA_X, fiz.PALCA_YMAX]
print("A feltételezett fókuszpontok: " + str(F1) + " és " + str(F2))
diffs = [fokuszpont_tavolsagkulonbseg(P[0], P[1], F1[0], F1[1], F2[0], F2[1]) for P in ev]
atlag = np.mean(diffs)
print("Az erővonal pontjaiban a fókuszpontoktól való távolságkülönbség átlaga: " + str(atlag) + " m")
ivhossz = 0
for i in range(0, len(ev)-1):
ivhossz += ((ev[i][0] - ev[i+1][0])**2 + (ev[i][1] - ev[i+1][1])**2)**0.5
max_elt = max(abs(val - atlag) for val in diffs)
print("Az átlagtól való maximális eltérés: " + str(max_elt) + " egy " + str(ivhossz) + " m hosszú görbe szakaszon")
if max_elt < 0.0001:
print("Az erővonal hiperbola")
import scipy.integrate as integrate
import matplotlib.pyplot as plt
import numpy as np
pi = np.pi
sqrt = np.sqrt
cos = np.cos
sin = np.sin
def deriv_z(z, phi):
u, udot = z
return [udot, -u + sqrt(u)]
phi = np.linspace(0, 7.0*pi, 2000)
zinit = [1.49907, 0]
z = integrate.odeint(deriv_z, zinit, phi)
u, udot = z.T
# plt.plot(phi, u)
fig, ax = plt.subplots()
ax.plot(1/u*cos(phi), 1/u*sin(phi))
ax.set_aspect('equal')
plt.grid(True)
plt.show()
\ No newline at end of file
This diff is collapsed.
import matplotlib.pyplot as plt
import src.fizika as fiz
from src.fizika import PALCA_X, PALCA_YMIN, PALCA_YMAX
VONALSURUSEG = 10
PALCA_VASTAGSAG = 0.02
def erovonal_rajzol(kezdopont, dt):
ev = fiz.erovonal(kezdopont, dt)
ev_x = [ev[i][0] for i in range(0, len(ev))]
ev_y = [ev[i][1] for i in range(0, len(ev))]
plt.plot(ev_x, ev_y, color='blue', linewidth=0.001)
hossz = len(ev)
idx = int((hossz - 1)/2)
kov = idx + 1
plt.arrow(ev_x[idx], ev_y[idx], (ev_x[kov] - ev_x[idx])/2, (ev_y[kov] - ev_y[idx])/2, color='blue', width=0.01, head_width=0.03)
def palca_rajzol():
plt.plot([PALCA_X, PALCA_X], [fiz.PALCA_YMIN, PALCA_YMAX], color='red', linewidth=2)
def rajzol():
dx = PALCA_VASTAGSAG/2
dt = fiz.T_LEPES
palca_rajzol()
lepeskoz = (PALCA_YMAX - PALCA_YMIN)/VONALSURUSEG
kezdopontok = [[PALCA_X, PALCA_YMIN - dx], [PALCA_X, PALCA_YMAX + dx]]
for k in range(0, VONALSURUSEG):
kezdopontok.append([PALCA_X + dx, PALCA_YMIN + (2*k + 1)/2*lepeskoz])
kezdopontok.append([PALCA_X - dx, PALCA_YMIN + (2*k + 1)/2*lepeskoz])
for kp in kezdopontok:
erovonal_rajzol(kp, dt)
plt.savefig("plot.svg")
print("Kirajzolás kész")
import matplotlib
import matplotlib.pyplot as plt
import src.fizika as fiz
from src.fizika import tererosseg2D
from scipy.integrate import ode as ode
toltessuruseg = 1
felbontas = 1000
vonalsuruseg = 10
XMIN = fiz.PALCA_X - 0.5
XMAX = fiz.PALCA_X + 0.5
YMIN = fiz.PALCA_YMIN - 0.5
YMAX = fiz.PALCA_YMAX + 0.5
def irany(t, rHely):
vek = tererosseg2D(rHely, toltessuruseg, felbontas)
if vek == [0, 0]:
return [0, 0]
else:
hossz = (vek[0]**2 + vek[1]**2)**0.5
return [vek[0]/hossz, vek[1]/hossz]
def iranymezo():
XDENSITY = 20
YDENSITY = 20
XRANGE = (XMAX - XMIN)/XDENSITY
YRANGE = (YMAX - YMIN)/YDENSITY
for i in range(0, XDENSITY):
for j in range(0, YDENSITY):
xcoord = XMIN + XRANGE * i
ycoord = YMIN + YRANGE * j
if xcoord != fiz.PALCA_X or (xcoord == fiz.PALCA_X and fiz.PALCA_YMAX < ycoord or ycoord < fiz.PALCA_YMIN):
# print(str([xcoord, ycoord]))
plt.quiver(xcoord, ycoord, irany(0, [xcoord, ycoord])[0], irany(0, [xcoord, ycoord])[1], width=0.01)
def erovonal(kezdopont, dt):
if toltessuruseg < 0:
dt = -dt
ev = [kezdopont]
r = ode(irany)
r.set_integrator('vode')
r.set_initial_value(kezdopont, 0)
while r.successful():
r.integrate(r.t + dt)
ev.append([r.y[0], r.y[1]])
if r.y[0] > XMAX or r.y[0] < XMIN or r.y[1] > YMAX or r.y[1] < YMIN:
break
return ev
def erovonal_rajzolas(kezdopont, dt):
ev = erovonal(kezdopont, dt)
ev_x = [ev[i][0] for i in range(0, len(ev))]
ev_y = [ev[i][1] for i in range(0, len(ev))]
plt.plot(ev_x, ev_y, color='black')
hossz = len(ev)
idx = int((hossz - 1)/2)
if toltessuruseg < 0:
kov = idx - 1
else:
kov = idx + 1
plt.arrow(ev_x[idx], ev_y[idx], (ev_x[kov] - ev_x[idx])/2, (ev_y[kov] - ev_y[idx])/2, color='black', head_width=0.02)#, head_length=0.02)
def tererovonalak():
dx = 0.01
dt = 0.008
# pálca belsejéből induló erővonalak
for k in range(1, vonalsuruseg):
# jobbra induló erővonal
erovonal_rajzolas([0.0 + dx, k/vonalsuruseg], dt)
# balra induló erővonal
erovonal_rajzolas([0.0 - dx, k/vonalsuruseg], dt)
print("Palca megvan")
# pálca [0, 1] végéből induló erővonalak
erovonal_rajzolas([fiz.PALCA_X + dx, fiz.PALCA_YMAX], dt)
erovonal_rajzolas([fiz.PALCA_X - dx, fiz.PALCA_YMAX], dt)
erovonal_rajzolas([fiz.PALCA_X, fiz.PALCA_YMAX + dx], dt)
print("[0, 1] megvan")
# pálca [0, 0] végéből induló erővonalak
erovonal_rajzolas([fiz.PALCA_X + dx, fiz.PALCA_YMIN], dt)
erovonal_rajzolas([fiz.PALCA_X - dx, fiz.PALCA_YMIN], dt)
erovonal_rajzolas([fiz.PALCA_X, fiz.PALCA_YMIN - dx], dt)
print("[0, 1] megvan")
def fokuszpont_tavolsagosszeg(x, y, f1x, f1y, f2x, f2y):
d1 = ((x - f1x)**2 + (y - f1y)**2)**0.5
d2 = ((x - f2x)**2 + (y - f2y)**2)**0.5
return abs(d1 - d2)
def hiperbola():
ivhossz = 0.0
P_X = fiz.PALCA_X + 0.01
P_Y = (fiz.PALCA_YMAX * 3 + fiz.PALCA_YMIN)/4
ev = erovonal([P_X, P_Y], 0.0005)
for p in ev:
print(str(fokuszpont_tavolsagosszeg(p[0], p[1], fiz.PALCA_X, fiz.PALCA_YMIN, fiz.PALCA_X, fiz.PALCA_YMAX)))
for i in range(0, len(ev)-1):
ivhossz += ((ev[i][0] - ev[i+1][0])**2 + (ev[i][1] - ev[i+1][1])**2)**0.5
print("Ivhossz = " + str(ivhossz))
# iranymezo()
toltessuruseg = float(input("lambda = "))
tererovonalak()
plt.savefig("plot.svg")
hiperbola()
print("Hiperbola megvan")
from src.fizika import PALCA_X, PALCA_YMIN, PALCA_YMAX, XMIN, XMAX, YMIN, YMAX, LMBD
import src.rajz as rjz
import src.hiperbola as hip
print("Szigetelő pálca erővonalainak kirajzolása...")
print("--------------------------------------------")
print("Pálca végpontjainak koordinátái: " + str([PALCA_X, PALCA_YMIN]) + " " + str([PALCA_X, PALCA_YMAX]))
print("Pálca töltéssűrűsége: " + str(LMBD) + " C/m")
print("Vizsgált terület határai: ")
print("\tx: " + str(XMIN) + "..." + str(XMAX) + " y: " + str(YMIN) + "..." + str(YMAX))
rjz.rajzol()
hip.hiperbola()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment