Kurs z mechaniki ogólnej dostarcza zestaw materiałów w formie plików PDF oraz kodów w pythonie, obejmujących tematykę każdego działu. By skorzystać z udostępnionych kodów niezbędne jest pobranie biblioteki dynpy dostępnej w przycisku poniżej. Wybrany kod należy następnie wkleić do projektu Jupyter Notebook.
Biblioteka dynpy
Pobierz PDF z rozwiązanym zadaniem
Wyświelt kod źródłowy
1. Momenty bezwładności
Moment bezwładności koła
Powyższe zadanie stanowi szczegółową analizę jednorodnej, cienkiej płyty o kształcie koła. Prezentuje ono metodykę wyznaczania momentu bezwładności tego obiektu.
Przykład ten skutecznie opisuje metodę obliczania momentów bezwładności brył obrotowych poprzez identyfikację istniejących zależności, które pozwalają na usprawnienie procesu obliczeń.
Analiza klasycznego zadania z dziedziny statyki, dotyczącego problemu tarcia między obiektem ograniczonym dwoma płaskimi powierzchniami, przedstawia metodologię rozwiązywania układów statycznych.
// Importy
from sympy import*
from sympy.physics.mechanics import dynamicsymbols, init_vprinting
from sympy.abc import*
init_vprinting()
from dynpy.solvers.linear import ODESystem
import pandas as pd
from pylatex import Document, Section, Subsection, Itemize, Package, HorizontalSpace, Description, Marker, Command
from pylatex.section import Paragraph, Chapter
from pylatex.utils import italic, NoEscape
from dynpy.utilities.adaptable import *
from dynpy.utilities.templates.document import BeamerTemplate,
from dynpy.utilities.templates.tikz import TikzCaSCStandalone
from dynpy.utilities.report import ReportText, Markdown, Picture, SympyFormula, Frame, ObjectCode, Block, AlertBlock, ExampleBlock
from dynpy.utilities.report import (SystemDynamicsAnalyzer, DataPlot, AccelerationComparison, FFTComparison, ReportEntry, SimulationalBlock, ReportText, SimulationFFT, DataStorage, Markdown, SummaryTable, SympyFormula, SymbolsDescription, DescriptionsRegistry, ObjectCode,CurrentContainer)
from fractions import Fraction
// Biblioteka symboli
r=Symbol('r',positive=True)
P=Symbol('P',real=True)
a=Symbol('a',positive=True)
b=Symbol('b',positive=True)
h=Symbol('h',positive=True)
l=Symbol('l',positive=True)
mi=Symbol('mu',positive=True)
N1=Symbol('N_1',real=True)
N2=Symbol('N_2',real=True)
T=Symbol('T',real=True)
T1=Symbol('T_1',real=True)
T2=Symbol('T_2',real=True)
Fx=Symbol('F_x',real=True)
Fy=Symbol('F_y',real=True)
Mo=Symbol('M_o',real=True)
N=Symbol('N',real=True)
Ma=Symbol('M_A',real=True)
M=Symbol('M',real=True)
alfa=Symbol('alpha',real=True)
Mh=Symbol('M_h',real=True)
F=Symbol('F')
s=Symbol('Sigma')
FAB=Symbol('F_AB')
Q=Symbol('Q')
// Wzory potrzebne do wykonania zadania
display(ReportText('Pierwsza zasada dynamiki Newtona: Jeżeli na dane ciało nie działają żadne inne ciała, lub działania innych ciał równoważą się, to ciało pozostaje w spoczynku lub porusza się ruchem jednostajnym prostoliniowym:'))
display(SympyFormula(Eq(s*F,0)))
display(ReportText('Trzecia zasada dynamiki Newtona: Jeżeli ciało A działa na ciało B pewną siłą, to ciało B działa na ciało A siłą równą co do wartości bezwzględnej i o tym samym kierunku, ale o przeciwnym zwrocie:'))
display(SympyFormula(Eq(FAB,-FAB)))
display(ReportText('Przekształcenie siły tarcia z użyciem współczynnika tarcia:'))
Friction=Eq(T, mi*N)
display(SympyFormula(Friction))
// Obliczenia
equation_1 = Eq(Fx, 0)
display(SympyFormula(equation_1))
equation_2 = Eq(0, N1+T2*sin(alfa)-N2*cos(alfa))
display(SympyFormula(equation_2))
equation_3 = Eq(Fy, 0)
display(SympyFormula(equation_3))
equation_4 = Eq(0, -Q+T1+T2*cos(alfa)+N2*sin(alfa))
display(SympyFormula(equation_4))
equation_5 = Eq(Mo, 0)
display(SympyFormula(equation_5))
equation_6 = Eq(0, T1*r-T2*r)
display(SympyFormula(equation_6))
equation_7 = Eq(Fx, 0)
display(SympyFormula(equation_7))
equation_8 = Eq(0, -P+N2*cos(alfa)-T2*sin(alfa))
display(SympyFormula(equation_8))
equation_9 = Eq(Fy, 0)
display(SympyFormula(equation_9))
equation_10 = Eq(0, -T2*cos(alfa)-N2*sin(alfa))
display(SympyFormula(equation_10))
equation_11 = Eq(Ma, 0)
display(SympyFormula(equation_11))
equation_12 = Eq(0, N2*r*cot(alfa)-P*l*cos(alfa))
display(SympyFormula(equation_12))
equation_13 = Eq(0, N2*r*cot(alfa)-P*l*cos(alfa))
display(SympyFormula(equation_1))
n_sol_1= solve(equation_13,P)
n_eq_1=Eq(P,n_sol_1[0])
display(SympyFormula(n_eq_1))
equation_14 = Eq(Fx, 0)
display(SympyFormula(equation_14))
equation_15 = Eq(0, N1+T2*sin(alfa)-N2*cos(alfa))
display(SympyFormula(equation_15))
equation_16 = Eq(Mo, 0)
display(SympyFormula(equation_16))
equation_17 = Eq(0, T1*r-T2*r)
display(SympyFormula(equation_17))
equation_18 = Eq(T1, T2)
display(SympyFormula(equation_18))
equation_19 = Eq(mi*N1, T2)
display(SympyFormula(equation_19))
equation_20 = Eq(0, N1+mi*N1*sin(alfa)-N2*cos(alfa))
display(SympyFormula(equation_20))
n_sol_2= solve(equation_20,N1)
n_eq_2=Eq(N1,n_sol_2[0])
display(SympyFormula(n_eq_2))
equation_21 = Eq(Fy, 0)
display(SympyFormula(equation_21))
equation_22 = Eq(0, -Q+T1+T2*cos(alfa)+N2*sin(alfa))
display(SympyFormula(equation_22))
equation_23 = Eq(0, -Q+mi*n_eq_2.rhs+mi*n_eq_2.rhs*cos(alfa)+N2*sin(alfa))
display(SympyFormula(equation_23))
equation_24 = Eq(0, N2*(mi*cos(alfa)**2/(mi*sin(alfa)+1)+sin(alfa)+mi*cos(alfa)/(mi*sin(alfa)+1))-Q)
display(SympyFormula(equation_24))
ins = (mi*cos(alfa)**2/(mi*sin(alfa)+1)+sin(alfa)+mi*cos(alfa)/(mi*sin(alfa)+1))
equation_25 = Eq(N2, Q/ins)
display(SympyFormula(equation_25))
eq = simplify(equation_25)
display(SympyFormula(eq))
Równia pochyła
Typowe zadanie dla dzieziny statyki opisujące zjawisko tarcia między dwoma stykającymi się obiektami, prezentuje metodologię rozwiązywania układów statycznych.
// Importy
from sympy import*
from sympy.physics.mechanics import dynamicsymbols, init_vprinting
from sympy.abc import*
init_vprinting()
from dynpy.solvers.linear import ODESystem
import pandas as pd
from pylatex import Document, Section, Subsection, Itemize, Package, HorizontalSpace, Description, Marker, Command
from pylatex.section import Paragraph, Chapter
from pylatex.utils import italic, NoEscape
from dynpy.utilities.adaptable import *
from dynpy.utilities.templates.document import BeamerTemplate,
from dynpy.utilities.templates.tikz import TikzCaSCStandalone
from dynpy.utilities.report import ReportText, Markdown, Picture, SympyFormula, Frame, ObjectCode, Block, AlertBlock, ExampleBlock
from dynpy.utilities.report import (SystemDynamicsAnalyzer, DataPlot, AccelerationComparison, FFTComparison, ReportEntry, SimulationalBlock, ReportText, SimulationFFT, DataStorage, Markdown, SummaryTable, SympyFormula, SymbolsDescription, DescriptionsRegistry, ObjectCode,CurrentContainer)
from fractions import Fraction
// Biblioteka symboli
r=Symbol('r',positive=True)
P=Symbol('P',real=True)
a=Symbol('a',positive=True)
b=Symbol('b',positive=True)
h=Symbol('h',positive=True)
l=Symbol('l',positive=True)
mi=Symbol('mu',positive=True)
N1=Symbol('N_1',real=True)
N2=Symbol('N_2',real=True)
N3=Symbol('N_3',real=True)
N4=Symbol('N_4',real=True)
R1=Symbol('R_1',real=True)
R2=Symbol('R_2',real=True)
T=Symbol('T',real=True)
T1=Symbol('T_1',real=True)
T2=Symbol('T_2',real=True)
Fx=Symbol('F_x',real=True)
Fy=Symbol('F_y',real=True)
Mo=Symbol('M_o',real=True)
Ma=Symbol('M_A',real=True)
f1=Symbol('f_1',real=True)
f2=Symbol('f_2',real=True)
f4=Symbol('f_4',real=True)
N=Symbol('N',real=True)
Ma=Symbol('M_A',real=True)
M=Symbol('M',real=True)
alfa=Symbol('alpha',real=True)
Mh=Symbol('M_h',real=True)
F=Symbol('F')
s=Symbol('Sigma')
FAB=Symbol('F_AB')
Q=Symbol('Q')
// Wzory potrzebne do wykonania zadania
intro=Section('Wzory niezbędne do wykonania zadania:')
CurrentContainer(intro)
display(ReportText('Pierwsza zasada dynamiki Newtona: Jeżeli na dane ciało nie działają żadne inne ciała, lub działania innych ciał równoważą się, to ciało pozostaje w spoczynku lub porusza się ruchem jednostajnym prostoliniowym:'))
display(SympyFormula(Eq(s*F,0)))
display(ReportText('Trzecia zasada dynamiki Newtona: Jeżeli ciało A działa na ciało B pewną siłą, to ciało B działa na ciało A siłą równą co do wartości bezwzględnej i o tym samym kierunku, ale o przeciwnym zwrocie:'))
display(SympyFormula(Eq(FAB,-FAB)))
display(ReportText('Reguła działania tarcia tocznego: podczas toczenia kontakt między ciałami nie jest punktowy a zachodzi na pewnej powierzchni, w praktyce oznacza to że przesuwamy siłę reakcji o odległość f'))
display(ReportText('Przekształcenie siły tarcia z użyciem współczynnika tarcia:'))
Friction=Eq(T, mi*N)
display(SympyFormula(Friction))
// Obliczenia
equation_1 = Eq(Fx, 0)
display(SympyFormula(equation_1))
equation_2 = Eq(0,-P+R1+R2)
display(SympyFormula(equation_2))
equation_3 = Eq(Fy, 0)
display(SympyFormula(equation_3))
equation_4 = Eq(0, -Q+N3+N4)
display(SympyFormula(equation_4))
equation_5 = Eq(Fx, 0)
display(SympyFormula(equation_5))
equation_6 = Eq(0,R1-T1)
display(SympyFormula(equation_6))
equation_7 = Eq(Fy, 0)
display(SympyFormula(equation_7))
equation_8 = Eq(0, N1-N3)
display(SympyFormula(equation_8))
equation_9 = Eq(Fx, 0)
display(SympyFormula(equation_9))
equation_10 = Eq(0,R2-T2)
display(SympyFormula(equation_10))
equation_11 = Eq(Fy, 0)
display(SympyFormula(equation_11))
equation_12 = Eq(0, N2-N4)
display(SympyFormula(equation_12))
equation_13 = Eq(P,R1+R2)
display(SympyFormula(equation_13))
equation_14 = Eq(T1,R1)
display(SympyFormula(equation_14))
equation_15 = Eq(T2,R2)
display(SympyFormula(equation_15))
equation_16 = Eq(P,T1+T2)
display(SympyFormula(equation_16))
equation_17 = Eq(P,mi*N1+mi*N2)
display(SympyFormula(equation_17))
equation_18 = Eq(Ma, 0)
display(SympyFormula(equation_18))
equation_19 = Eq(0,-N4*(a+b-f4)+Q*a)
display(SympyFormula(equation_19))
equation_20 = Eq(f4,f2)
display(SympyFormula(equation_20))
equation_21 = Eq(0,-N2*(a+b-f2)+Q*a)
display(SympyFormula(equation_21))
n_sol_1= solve(equation_21,N2)
n_eq_1=Eq(N2,n_sol_1[0])
display(SympyFormula(n_eq_1))
equation_22 = Eq(0, -Q+n_eq_1.rhs+N3)
display(SympyFormula(equation_22))
equation_23 = Eq(0, -Q+n_eq_1.rhs+N1)
display(SympyFormula(equation_23))
n_sol_2= solve(equation_23,N1)
n_eq_2=Eq(N1,n_sol_2[0])
display(SympyFormula(n_eq_2))
equation_24 = StrictGreaterThan(P,mi*n_eq_1.rhs+mi*n_eq_2.rhs)
display(SympyFormula(equation_24))
Tarcie opasania
Zadanie z dziedziny statyki, skupiające się na analizie zjawiska tarcia występującego między dwoma ciałami, przedstawia metodologię rozwiązywania układów statycznych.
// Importy
from sympy import*
from sympy.physics.mechanics import dynamicsymbols, init_vprinting
from sympy.abc import*
init_vprinting()
from sympy import S
from dynpy.solvers.linear import ODESystem
import pandas as pd
from pylatex import Document, Section, Subsection, Itemize, Package, HorizontalSpace, Description, Marker, Command
from pylatex.section import Paragraph, Chapter
from pylatex.utils import italic, NoEscape
from dynpy.utilities.adaptable import *
from dynpy.utilities.templates.document import BeamerTemplate, TechThriveMechanicalCase
from dynpy.utilities.templates.tikz import TikzCaSCStandalone
from dynpy.utilities.report import ReportText, Markdown, Picture, SympyFormula, Frame, ObjectCode, Block, AlertBlock, ExampleBlock
from dynpy.utilities.report import (SystemDynamicsAnalyzer, DataPlot, AccelerationComparison, FFTComparison, ReportEntry, SimulationalBlock, ReportText, SimulationFFT, DataStorage, Markdown, SummaryTable, SympyFormula, SymbolsDescription, DescriptionsRegistry, ObjectCode,CurrentContainer)
// Biblioteka symboli
r=Symbol('r',positive=True)
P=Symbol('P',real=True)
a=Symbol('a',positive=True)
b=Symbol('b',positive=True)
h=Symbol('h',positive=True)
mi=Symbol('mu',positive=True)
S1=Symbol('S_1',real=True)
S2=Symbol('S_2',real=True)
Ma=Symbol('M_A',real=True)
M=Symbol('M',real=True)
alfa=Symbol('alpha',real=True)
Mh=Symbol('M_h',real=True)
F=Symbol('F')
s=Symbol('Sigma')
// Wzory potrzebne do wykonania zadania
display(ReportText('Pierwsza zasada dynamiki Newtona: Jeżeli na dane ciało nie działają żadne inne ciała, lub działania innych ciał równoważą się, to ciało pozostaje w spoczynku lub porusza się ruchem jednostajnym prostoliniowym.'))
display(SympyFormula(Eq(s*F,0)))
display(ReportText('Wzór niezbędny do rozwiązania zadania z tarciem opasania, jeżeli:'))
belt=StrictGreaterThan(S1,S2)
display(SympyFormula(belt))
display(ReportText('To:'))
display(SympyFormula(Eq(S1,S2*exp(mi*alfa))))
// Dane
unit_dict = {
h: ureg.meter,
P: ureg.newton,
r: ureg.meter,
a: ureg.meter,
b: ureg.meter
}
LatexDataFrame.set_default_units(unit_dict)
dane={r: 0.3, P:20, b:1.2, a:0.1, h: 0.05, mi:0.4, alfa:3*pi/2}
display(ReportText('Obliczyć moment hamowania hamulca taśmowego pokazanego na rysunku, jeżeli:'))
display(
LatexDataFrame.formatted(
data=dane,
index=['Wartość']).applymap(lambda x: f'${latex(x)}$').rename_axis(
'Parametr',
axis=1).reported(caption='Dane przyjęte do zadania'))
// Obliczenia
eq_e=Eq(S1,S2*exp(mi*alfa))
display(SympyFormula(eq_e))
eq_ma_sub=eq_ma.subs(S1,eq_e.rhs)
display(SympyFormula(eq_ma_sub))
s2_sol=solve(eq_ma_sub,S2)
s2=Eq(S2,s2_sol[0])
display(SympyFormula(s2))
s2_sub=s2.subs(dane).subs(pi,3.14).n(3)
display(SympyFormula(s2_sub))
display(SympyFormula(eq_e))
s1=eq_e.subs(dane).subs(S2,s2_sub.rhs).subs(pi,3.14).n(3)
display(SympyFormula(s1))
eq_mh=Eq(Mh,(S1-S2)*r)
eq_mh_sub=eq_mh.subs(dane_s).subs(r,0.3)
display(SympyFormula(eq_mh))
display(SympyFormula(eq_mh_sub))
3. Kinematyka
Ruch tłoka
Zadanie prezentuje schemat zachowania jednego z podstawowych systemów mechanicznych. Przeprowadzona analiza pozwala na zrozumienie zachowania tego obiektu oraz wyznaczenie kluczowych parametrów, takich jak przyśpieszenie i prędkość.
// Importy
from sympy import*
from sympy.physics.mechanics import dynamicsymbols, init_vprinting
from sympy.abc import*
init_vprinting()
from sympy import S
from dynpy.models.mechanics.engine import *
from dynpy.models.mechanics.projectile import *
from dynpy.solvers.linear import ODESystem
import pandas as pd
from pylatex import Document, Section, Subsection, Itemize, Package, HorizontalSpace, Description, Marker, Command
from pylatex.section import Paragraph, Chapter
from pylatex.utils import italic, NoEscape
from dynpy.utilities.adaptable import *
from dynpy.utilities.templates.document import BeamerTemplate, TechThriveMechanicalCase
from dynpy.utilities.templates.tikz import TikzCaSCStandalone
from dynpy.utilities.report import ReportText, Markdown, Picture, SympyFormula, Frame, ObjectCode, Block, AlertBlock, ExampleBlock
from dynpy.utilities.report import (SystemDynamicsAnalyzer, DataPlot, AccelerationComparison, FFTComparison, ReportEntry, SimulationalBlock, ReportText, SimulationFFT, DataStorage, Markdown, SummaryTable, SympyFormula, SymbolsDescription, DescriptionsRegistry, ObjectCode,CurrentContainer)
// Biblioteka symboli
l=Symbol('l',positive=True)
xa = dynamicsymbols('x_A')
ya = dynamicsymbols('y_A')
xb = dynamicsymbols('x_B')
yb = dynamicsymbols('y_B')
xm = dynamicsymbols('x_M')
ym = dynamicsymbols('y_M')
x=dynamicsymbols('x')
y=dynamicsymbols('y')
vb=Symbol('v_b',real=True)
va=Symbol('v_a',real=True)
vax=Symbol('v_ax',real=True)
vay=Symbol('v_ay',real=True)
vm=Symbol('v_m',real=True)
amt=Symbol('a_mt',real=True)
amn=Symbol('a_mn',real=True)
am=Symbol('a_m',real=True)
omg=Symbol('omega',positive=True)
omg2=Symbol('omega_2',positive=True)
t=Symbol('t')
s=Symbol('Sigma')
m=Symbol('m')
F=Symbol('F')
Fa=Symbol('F_A')
Fr=Symbol('F_R')
alfa=Symbol('alpha')
// Wzory potrzebne do wykonania zadania
display(ReportText('Pierwsza zasada dynamiki Newtona: Jeżeli na dane ciało nie działają żadne inne ciała, lub działania innych ciał równoważą się, to ciało pozostaje w spoczynku lub porusza się ruchem jednostajnym prostoliniowym.'))
display(SympyFormula(Eq(s*F,0)))
display(ReportText('Druga zasada dynamiki Newtona: Jeżeli na ciało działa stała siła wypadkowa, to ciało porusza się ruchem jednostajnie przyspieszonym z przyspieszeniem wprost proporcjonalnym do działającej siły, a odwrotnie proporcjonalnym do masy ciała.'))
display(SympyFormula(Eq(m*x.diff(t,2),s*F)))
display(SympyFormula(Eq(m*y.diff(t,2),s*F)))
display(ReportText('Trzecia zasada dynamiki Newtona: Oddziaływanie dwóch ciał jest zawsze wzajemne. Jeżeli jedno ciało działa na drugie pewną siłą, to drugie działa na ciało pierwsze siłą taką samą co do wartości i kierunku, a o zwrocie przeciwnym.'))
display(SympyFormula(Eq(Fa,-Fr)))
display(Markdown('''Kroki postępowania:
- Ułożenie równań ruchu punktu $A$
- Ułożenie równań ruchu punktu $B$
- Wyznaczenie prędkosci i przyspieszenia punktu $M$
'''))
// Obliczenia
xa_eq=Eq(xa,l*cos(omg*t))
ya_eq=Eq(ya,l*sin(omg*t))
display(ReportText(f'Równanie ruchu punktu $A$ względem osi $x$ ({AutoMarker(xa_eq)}) '))
display(SympyFormula(xa_eq))
display(ReportText(f'Równanie ruchu punktu $A$ względem osi $y$ ({AutoMarker(ya_eq)}) '))
display(SympyFormula(ya_eq))
v_ax=Eq(vax,xa_eq.rhs.diff(t))
display(ReportText(f'Prędkosć punktu $A$ względem osi $x$ ({AutoMarker(v_ax)}) '))
display(SympyFormula(v_ax))
v_ay=Eq(vay,ya_eq.rhs.diff(t))
v_ax=Eq(vax,xa_eq.rhs.diff(t))
display(ReportText(f'Prędkosć punktu $A$ względem osi $y$ ({AutoMarker(v_ay)}) '))
display(SympyFormula(v_ay))
v_a=Eq(va,sqrt(v_ay.rhs**2 + v_ax.rhs**2).simplify())
display(ReportText(f'Wypadkowa prędkosć punktu $A$: ({AutoMarker(v_a)}) '))
display(SympyFormula(v_a))
xb_eq=Eq(xb,l*cos(omg*t)+xa_eq.rhs)
yb_eq=Eq(yb,0)
display(ReportText(f'Równanie ruchu punktu $B$ względem osi $x$ ({AutoMarker(xb_eq)}) '))
display(SympyFormula(xb_eq))
display(ReportText(f'Równanie ruchu punktu $B$ względem osi $y$ ({AutoMarker(yb_eq)}) '))
display(SympyFormula(yb_eq))
v_b=Eq(vb,xb_eq.rhs.diff(t))
display(ReportText(f'Wypadkowa prędkosć punktu $B$: ({AutoMarker(v_b)}) '))
display(SympyFormula(v_b))
omg2_eq=Eq(v_b.rhs, v_a.rhs + omg2*l)
display(ReportText(f'Z zależnosci między prędkosciami punktów możemy stwierdzić że: ({AutoMarker(omg2_eq)}) '))
display(SympyFormula(omg2_eq))
omg2_sol=solve(omg2_eq,omg2)
omg_2=Eq(omg2,omg2_sol[0])
display(ReportText(f'A następnie wyliczyć: ({AutoMarker(omg_2)}) '))
display(SympyFormula(omg_2))
vm_eq=Eq(vm,v_b.rhs+omg_2.rhs*l/2)
display(ReportText(f'Po wyliczeniu tej wartosci bez problemu możemy wyliczyć prędkosć punktu $M$: ({AutoMarker(vm_eq)}) '))
display(SympyFormula(vm_eq))
amt_eq=Eq(amt,vm_eq.rhs.diff(t))
display(ReportText(f'Aby policzyć przyspieszenie naszego punktu, policzymy przyspieszenie styczne oraz normalne a następnie dzięki nim obliczymy przyspieszenie wypadkowe: ({AutoMarker(amt_eq)}) '))
display(SympyFormula(amt_eq))
amn_eq=Eq(amn,vm_eq.rhs**2/(l/2))
display(SympyFormula(amn_eq))
am_eq=Eq(am,sqrt(amt_eq.rhs**2 + amn_eq.rhs**2))
display(ReportText(f'Nasze ostateczne przyspieszenie wynosi: ({AutoMarker(am_eq)}) '))
display(SympyFormula(am_eq))
4. Dynamika
Ruch po lince
To zadanie obejmuje zagadnienia z dziedziny dynamiki. Dzięki dogłębnej analizie, pomaga zrozumieć, w jaki sposób zachowuje się dany mechanizm oraz jak można wykorzystać jego właściwości.
// Importy
from sympy import*
from sympy.physics.mechanics import dynamicsymbols, init_vprinting
from sympy.abc import*
init_vprinting()
from sympy import S
from dynpy.solvers.linear import ODESystem
import pandas as pd
from pylatex import Document, Section, Subsection, Itemize, Package, HorizontalSpace, Description, Marker, Command
from pylatex.section import Paragraph, Chapter
from pylatex.utils import italic, NoEscape
from dynpy.utilities.adaptable import *
from dynpy.utilities.templates.document import BeamerTemplate, TechThriveMechanicalCase
from dynpy.utilities.templates.tikz import TikzCaSCStandalone
from dynpy.utilities.report import ReportText, Markdown, Picture, SympyFormula, Frame, ObjectCode, Block, AlertBlock, ExampleBlock
from dynpy.utilities.report import (SystemDynamicsAnalyzer, DataPlot, AccelerationComparison, FFTComparison, ReportEntry, SimulationalBlock, ReportText, SimulationFFT, DataStorage, Markdown, SummaryTable, SympyFormula, SymbolsDescription, DescriptionsRegistry, ObjectCode,CurrentContainer)
from dynpy.models.mechanics.disk import*
// Biblioteka symboli
l1=Symbol('l_1',positive=True)
l2=Symbol('l_2',positive=True)
l3=Symbol('l_3',positive=True)
r=Symbol('r',positive=True)
x1=dynamicsymbols('x_1')
x2=dynamicsymbols('x_2')
S1=Symbol('S_1',real=True)
S2=Symbol('S_2',real=True)
S3=Symbol('S_3',real=True)
S4=Symbol('S_4',real=True)
S5=Symbol('S_5',real=True)
t=Symbol('t')
x=dynamicsymbols('x')
y=dynamicsymbols('y')
G=Symbol('G',real=True)
Q=Symbol('Q',real=True)
S=Symbol('S',real=True)
s=Symbol('Sigma')
m=Symbol('m')
F=Symbol('F')
Fa=Symbol('F_A')
Fr=Symbol('F_R')
// Wzory potrzebne do wykonania zadania
display(ReportText('Pierwsza zasada dynamiki Newtona: Jeżeli na dane ciało nie działają żadne inne ciała, lub działania innych ciał równoważą się, to ciało pozostaje w spoczynku lub porusza się ruchem jednostajnym prostoliniowym.'))
display(SympyFormula(Eq(s*F,0)))
display(ReportText('Druga zasada dynamiki Newtona: Jeżeli na ciało działa stała siła wypadkowa, to ciało porusza się ruchem jednostajnie przyspieszonym z przyspieszeniem wprost proporcjonalnym do działającej siły, a odwrotnie proporcjonalnym do masy ciała.'))
display(SympyFormula(Eq(m*x.diff(t,2),s*F)))
display(SympyFormula(Eq(m*y.diff(t,2),s*F)))
display(ReportText('Trzecia zasada dynamiki Newtona: Oddziaływanie dwóch ciał jest zawsze wzajemne. Jeżeli jedno ciało działa na drugie pewną siłą, to drugie działa na ciało pierwsze siłą taką samą co do wartości i kierunku, a o zwrocie przeciwnym.'))
display(SympyFormula(Eq(Fa,-Fr)))
display(Markdown('''Do prawidłowego wykonania zadania należy przyjąć następujące kroki:
- Zauważyć zależnosci wynikające z długosci nieroziągliwej nici
- Stworzyć wykres rozkładu sił
- Ułożyć równania ruchu oraz równania momentów sił
- Obliczenie prędkosci obu ciał jako funkcje czasu
- Obliczenie siłę napięcia nici
'''))
// Obliczenia
display(ReportText('Pierwszym krokiem jest przeanalizowanie jak działa mechanizm podany w zadaniu:'))
Picture._default_width = NoEscape('0.6\\columnwidth')
obraze = Picture('./images/Blety_13.png')
display(obraze)
nic_1=l1+l2+l3+(2*pi*r)
display(ReportText('Z powyższego obrazka widzimy, że łączna długosc nici przed wprawieniem mechanizmu w ruch (fragmenty opasające koło oraz fragmenty oznaczone symbolem $l$) to:'))
Picture._default_width = NoEscape('0.6\\columnwidth')
obraz = Picture('./images/Blety_14.png')
display(obraz)
display(ReportText('Natomiast po rozpoczęciu ruchu:'))
nic_2=l1+l2+l3+2*x1+x2+2*pi*r
display(ReportText('Równanie długosci nici mozna zapisac nastepujaco:'))
display(SympyFormula(nic_2))
display(ReportText('Z tresci zadania wiemy, że dlugosc nici sie nie zmienia, stąd:'))
nic_eq=Eq(nic_1,nic_2)
display(SympyFormula(nic_eq))
display(ReportText('Następnie upraszczając:'))
x2_sol=solve(nic_eq,x2)
x2_eq=Eq(x2,x2_sol[0])
display(SympyFormula(x2_eq))
display(ReportText('Stąd wiemy, że:'))
x_diff=Eq(x2.diff(t,2),-2*x1.diff(t,2))
display(SympyFormula(x_diff))
c1_eq=Eq(Q-S1,Q/g*x1.diff(t,2))
c2_eq=Eq(G-S4,G/g*x2.diff(t,2))
rr1_eq=Eq(S1,S2+S3)
rr2_eq=Eq(S5,S2+S3)
m1_eq=Eq(0,S2*r-S3*r)
m2_eq=Eq(0,S4*r-S3*r)
display(ReportText('Równania ruchu wyprowadzone z drugiego prawa dynamiki Newtona. \n Dla pierwszego ciężarka :'))
display(SympyFormula(c1_eq))
display(ReportText('Dla drugiego ciężarka :'))
display(SympyFormula(c2_eq))
display(ReportText('Dodatkowo:'))
display(SympyFormula(rr1_eq))
display(SympyFormula(rr2_eq))
display(ReportText('Równanie dla momentów sił (suma momentów sił jest równa $0$, gdyż nie występuje poslizg). Względem srodka pierwszego bloczka :'))
display(SympyFormula(m1_eq))
display(ReportText('Względem srodka drugiego bloczka :'))
display(SympyFormula(m2_eq))
display(ReportText('Z tego wynika, że :'))
s2_sol=solve(m1_eq,S2)
s2_eq=Eq(S2,s2_sol[0])
display(SympyFormula(s2_eq))
s3_sol=solve(m2_eq,S3)
s3_eq=Eq(S3,s3_sol[0])
display(SympyFormula(s3_eq))
display(ReportText(f'Aby uproscic obliczenia przyjmiemy te równe sobie wartosci jako $S$. Należy jedynie policzyć ${latex(S1)}$ :'))
display(SympyFormula(rr1_eq))
s1_eq=rr1_eq.subs(S2,S).subs(S3,S)
display(SympyFormula(s1_eq))
display(ReportText('Do policzenia prędkosci po obydwu osiach potrzebne nam są te 3 równania z podstawionymi odpowiendimi wartosciami $S$ :'))
display(SympyFormula(x_diff))
rrq=c1_eq.subs(S1,s1_eq.rhs)
rrg=c2_eq.subs(S4,S)
display(SympyFormula(rrq))
display(SympyFormula(rrg))
display(ReportText('Za pomocą pierwszego równania podstawić do równania trzeciego :'))
rrg_sub=rrg.subs(x2.diff(t,2),x_diff.rhs)
display(SympyFormula(rrg_sub))
display(ReportText('Następnie dla uproszczenia rachunków należy pomnożyć obie strony równania przez $-2$ :'))
rrg_eq=Eq(rrg_sub.lhs*(-2),rrg_sub.rhs*-2)
display(SympyFormula(rrg_eq))
display(ReportText('Dodając równania stronami :'))
r_eq=Eq(rrq.lhs+rrg_eq.lhs,rrq.rhs+rrg_eq.rhs)
display(SympyFormula(r_eq))
r_eq_sol=solve(r_eq,x1.diff(t,2))
x1_eq=Eq(x1.diff(t,2),r_eq_sol[0])
display(SympyFormula(x1_eq))
x1_sol=Eq(x1.diff(t),x1_eq.rhs*t)
display(ReportText('Z racji, że prawa strona równania to stała, aby scałkować wystarczy prawą stronę pomnożyć przez $t$ :'))
display(SympyFormula(x1_sol))
display(ReportText('Wiemy też, że :'))
display(SympyFormula(x_diff))
display(ReportText('Co odnosi się także do pierwszej pochodnej i z tego wyliczymy :'))
x2_sol=Eq(x2.diff(t),x1_sol.rhs*-2)
display(SympyFormula(x2_sol))
odesys=ODESystem(odes=Matrix([x1_eq.lhs-x1_eq.rhs]), dvars=Matrix([x1]), ode_order=2)
display(odesys)
display(ReportText('Do policzenia siły napięcia potrzebne nam są te 2 równania :'))
display(ReportText('Do policzenia siły napięcia potrzebne nam są te 2 równania :'))
display(SympyFormula(x1_eq))
display(SympyFormula(rrq))
display(ReportText('Należy podstawić pierwsze równanie do drugiego :'))
s_eq=rrq.subs(x1.diff(t,2),x1_eq.rhs)
display(SympyFormula(s_eq))
display(ReportText('Teraz jedynie wyliczyć z tego $S$ :'))
s_sol=solve(s_eq,S)
s_val=Eq(S,s_sol[0])
display(SympyFormula(s_val))
Ruch po nachylonej płaszczyźnie
Klasyczne zadanie z działu dynamiki, rozwiązanie opisuje siłę potrzebną do wepchnięcia obiektu na górę równi pochyłej
// Importy
from sympy import*
from sympy.physics.mechanics import dynamicsymbols, init_vprinting
from sympy.abc import*
init_vprinting()
from sympy import S
from dynpy.models.mechanics.engine import *
from dynpy.models.mechanics.projectile import *
from dynpy.solvers.linear import ODESystem
import pandas as pd
from pylatex import Document, Section, Subsection, Itemize, Package, HorizontalSpace, Description, Marker, Command
from pylatex.section import Paragraph, Chapter
from pylatex.utils import italic, NoEscape
from dynpy.utilities.adaptable import *
from dynpy.utilities.templates.document import BeamerTemplate
from dynpy.utilities.templates.tikz import TikzCaSCStandalone
from dynpy.utilities.report import ReportText, Markdown, Picture, SympyFormula, Frame, ObjectCode, Block, AlertBlock, ExampleBlock
from dynpy.utilities.report import (SystemDynamicsAnalyzer, DataPlot, AccelerationComparison, FFTComparison, ReportEntry, SimulationalBlock, ReportText, SimulationFFT, DataStorage, Markdown, SummaryTable, SympyFormula, SymbolsDescription, DescriptionsRegistry, ObjectCode,CurrentContainer)
// Biblioteka symboli
g=Symbol('g',positive=True)
v0=Symbol('v_0',real=True)
h=Symbol('h',real=True)
tw=Symbol('t')
m=Symbol('m',real=True)
mi=Symbol('mu',real=True)
F=Symbol('F',real=True)
alfa=Symbol('alpha',real=True)
N=Symbol('N',real=True)
x = dynamicsymbols('x')
y = dynamicsymbols('y')
vp=Symbol('v_p',real=True)
tp=Symbol('t_p',real=True)
s=Symbol('Sigma')
Fa=Symbol('F_A')
Fr=Symbol('F_R')
// Wzory potrzebne do wykonania zadania
display(ReportText('Pierwsza zasada dynamiki Newtona: Jeżeli na dane ciało nie działają żadne inne ciała, lub działania innych ciał równoważą się, to ciało pozostaje w spoczynku lub porusza się ruchem jednostajnym prostoliniowym.'))
display(SympyFormula(Eq(s*F,0)))
display(ReportText('Druga zasada dynamiki Newtona: Jeżeli na ciało działa stała siła wypadkowa, to ciało porusza się ruchem jednostajnie przyspieszonym z przyspieszeniem wprost proporcjonalnym do działającej siły, a odwrotnie proporcjonalnym do masy ciała.'))
display(SympyFormula(Eq(m*x.diff(t,2),s*F)))
display(SympyFormula(Eq(m*y.diff(t,2),s*F)))
display(ReportText('Trzecia zasada dynamiki Newtona: Oddziaływanie dwóch ciał jest zawsze wzajemne. Jeżeli jedno ciało działa na drugie pewną siłą, to drugie działa na ciało pierwsze siłą taką samą co do wartości i kierunku, a o zwrocie przeciwnym.'))
display(SympyFormula(Eq(Fa,-Fr)))
// Obliczenia
display(ReportText('Najpierw układamy równania ruchu dla wspołrzędnych $x$ i $y$'))
rr1=Eq(m*(x.diff(t,2)),F-mi*N-m*g*sin(alfa))
rr2=Eq(m*y.diff(t,2),N-m*g*cos(alfa))
display(SympyFormula(rr1))
display(SympyFormula(rr2))
display(ReportText('Czas lotu może być wyznaczony ze swobodnego spadku ze względu na pominiecie oporów ruchu.'))
h_eq=Eq(h,(g*t**2/2))
t_sol=solve(h_eq,tw)
t_eq=Eq(t,t_sol[1])
display(SympyFormula(t_eq))
beq=Eq(b,v0*t_eq.rhs)
beq
v0_sol=Eq(v0,solve(beq,v0)[0])
display(SympyFormula(v0_sol))
yeq=Eq(h,rr2.rhs/m*tp)
yeq
tp_solution=solve(yeq.subs(N,m*g*sin(alfa)),tp)[0]
display(SympyFormula(tp_solution))
v0eq=Eq(v0,vp-mi*m*g*tw)
v0eq
vp_sol=Eq(vp,solve(v0eq,vp)[0])
vp_sol_sub=vp_sol.subs(v0,v0_sol.rhs).subs(tw,tp_solution)
display(SympyFormula(vp_sol_sub))
display(ReportText('Rozwiązanie końcowe przedstawione w postaci siły.'))
vpeq=Eq(vp,(rr1.rhs)/m*tp_solution)
display(vpeq)
f_sol=solve(vpeq,F)[0]
f_eq=Eq(F,f_sol.subs(N,m*g*cos(alfa)).subs(tw,tp_solution))
f_eq_sub=f_eq.subs(vp,vp_sol_sub.rhs).expand().simplify()
display(SympyFormula(f_eq_sub))
Ruch obrotowy pralki
Zadanie przedstawia związek między ruchem obrotowym wirnika pralki a ruchem liniowym obudowy. Analiza ma na celu wyznaczenie równiania przemieszczenia obudowy.
// Importy
from sympy import*
from sympy.physics.mechanics import dynamicsymbols, init_vprinting
from sympy.abc import*
init_vprinting()
from sympy import S
from dynpy.models.mechanics.engine import *
from dynpy.models.mechanics.projectile import *
from dynpy.solvers.linear import ODESystem
import pandas as pd
from pylatex import Document, Section, Subsection, Itemize, Package, HorizontalSpace, Description, Marker, Command
from pylatex.section import Paragraph, Chapter
from pylatex.utils import italic, NoEscape
from dynpy.utilities.adaptable import *
from dynpy.utilities.templates.document import BeamerTemplate, TechThriveMechanicalCase
from dynpy.utilities.templates.tikz import TikzCaSCStandalone
from dynpy.utilities.report import ReportText, Markdown, Picture, SympyFormula, Frame, ObjectCode, Block, AlertBlock, ExampleBlock
from dynpy.utilities.report import (SystemDynamicsAnalyzer, DataPlot, AccelerationComparison, FFTComparison, ReportEntry, SimulationalBlock, ReportText, SimulationFFT, DataStorage, Markdown, SummaryTable, SympyFormula, SymbolsDescription, DescriptionsRegistry, ObjectCode,CurrentContainer)
// Biblioteka symboli
m1=Symbol('m_1',positive=True)
m2=Symbol('m_2',positive=True)
e=Symbol('e',positive=True)
g=Symbol('g',positive=True)
omg=Symbol('omega',positive=True)
t=Symbol('t')
x=dynamicsymbols('x')
y=dynamicsymbols('y')
Fc=Symbol('F_c',positive=True)
R=Symbol('R',positive=True)
k=Symbol('k',positive=True)
Fs=Symbol('F_s',positive=True)
s=Symbol('Sigma')
m=Symbol('m')
F=Symbol('F')
Fa=Symbol('F_A')
Fr=Symbol('F_R')
// Wzory potrzebne do wykonania zadania
display(ReportText('Pierwsza zasada dynamiki Newtona: Jeżeli na dane ciało nie działają żadne inne ciała, lub działania innych ciał równoważą się, to ciało pozostaje w spoczynku lub porusza się ruchem jednostajnym prostoliniowym.'))
display(SympyFormula(Eq(s*F,0)))
display(ReportText('Druga zasada dynamiki Newtona: Jeżeli na ciało działa stała siła wypadkowa, to ciało porusza się ruchem jednostajnie przyspieszonym z przyspieszeniem wprost proporcjonalnym do działającej siły, a odwrotnie proporcjonalnym do masy ciała.'))
display(SympyFormula(Eq(m*x.diff(t,2),s*F)))
display(SympyFormula(Eq(m*y.diff(t,2),s*F)))
display(ReportText('Trzecia zasada dynamiki Newtona: Oddziaływanie dwóch ciał jest zawsze wzajemne. Jeżeli jedno ciało działa na drugie pewną siłą, to drugie działa na ciało pierwsze siłą taką samą co do wartości i kierunku, a o zwrocie przeciwnym.'))
display(SympyFormula(Eq(Fa,-Fr)))
display(Markdown('''Do prawidłowego wykonania zadania należy przyjąć następujące kroki:
- Rozrysowanie rozkładu sił działających na system
- Korzystając z drugiego prawa dynamiki Newtona napisać równania ruchu systemu po osi $x$ i $y$
- Obliczyć siłę reakcji od podłoża
- Obliczenie prędkosci kątowej dla jakiej pralka oderwie się od ziemi
- Policzyć poziomy ruch obudowy pralki
'''))
// Obliczenia
eq_x=Eq(m1*x.diff(t,2),Fc*cos(omg*t)-(k*x)-m2*x.diff(t,2)).subs(Fc, m1*e*omg**2)
display(ReportText('Równania ruchu wyprowadzone z drugiego prawa dynamiki Newtona. \n Względem osi x:'))
display(SympyFormula(eq_x))
eq_y=Eq(m1*y.diff(t,2), R-g*(m1+m2)+Fc*sin(omg*t)).subs(Fc, m2*e*omg**2)
display(ReportText('Równanie ruchu względem osi y '))
display(SympyFormula(eq_y))
eq_r=eq_y.subs(y.diff(t,2),0).subs(sin(omg*t),1)
eq_r_sol=solve(eq_r,R)
eq_r_sol[0]
graph_dict={omg: sqrt((m2/e)), g:10, e:2, m1:40, m2: 25}
eq_r_sin=eq_y.subs(y.diff(t,2),0)
eq_r_sol_sin=solve(eq_r_sin,R)
display(ReportText('W zadaniu proszą nas o policzenie 3 wartosci, w tym celu podzielimy tę sekcję na 3 podsekcje, a aby stworzyć wykresy, przyjmiemy sobie następujące wartosci dla znanych nam zmiennych/stałych'))
display(
LatexDataFrame.formatted(
data=graph_dict,
index=['Wartość']).applymap(lambda x: f'${latex(x)}$').rename_axis(
'Parametr',
axis=1).reported(caption='Dane przyjęte do stworzenia wykresów'))
display(ReportText('Przyspieszenie po osi y jest równe 0, stąd możemy wyliczyć siłę reakcji od podłoża:'))
display(SympyFormula(Eq(R,eq_r_sol_sin[0])))
r_eq=Eq(R,eq_r_sol[0])
display(ReportText(f'W celu dalszych obliczeń, czyli obliczenia prędkosci kątowej potrzebnej do oderwania się pralki od ziemi, należy przyjąc najwyższe połozenie punktu ${latex(m2)}$, czyli wartosć kąta ${latex(pi/2)}$, a co za tym idzie, przyjąc wartosć sinusa jako $1$.({AutoMarker(r_eq)})'))
display(SympyFormula(r_eq))
r_eq_num=eq_r_sol_sin[0].subs(graph_dict).subs(graph_dict)
display(ReportText(f'Podstawiając przyjęte wczesniej dane otrzymujemy:({AutoMarker(Eq(R,r_eq_num))})'))
display(SympyFormula(Eq(R,r_eq_num)))
display(ReportText('Mając takie równanie możemy stworzyć wykres siły reakcji w zależnosci od czasu:'))
t_list=np.linspace(0.0001,10,200)
r_list=[float(r_eq_num.subs(t,t_sub).n(5)) for t_sub in t_list]
tab_sol=TimeDataFrame(data={t:t_list,R:r_list,})
tab_sol_new= TimeDataFrame(tab_sol.set_index(t))
table=tab_sol_new.to_latex_dataframe()
graph1 = table.to_pylatex_tikz().in_figure()
display(graph1)
eq_r_sol_sin[0]
omg_sol=solve(r_eq,omg)
omg_eq=Eq(omg,omg_sol[0])
omg_eq1=omg_eq.subs(R,0)
display(ReportText(f'W tej częsci zadania kluczowe jest, aby korzystając z trzeciego prawa dynamiki Newtona zauważyć, że warunkiem na oderwanie się pralki od podłoża jest siła reakcji równa 0. Na tej podstawie możemy bez problemu wyliczyć prędkosc kątową potrzebną do spełnienia tego warunku:({AutoMarker(omg_eq1)})'))
display(SympyFormula(omg_eq1))
display(ReportText('Następnie podstawiając znane nam dane, możemy stworzyć wykres, z którego możemy odczytać, że nasza pralka odrywa się od podłoża, a następnie znowu opada i tak w kółko'))
r1_list=[float(eq_r_sol_sin[0].subs(omg, omg_eq1.rhs).subs(graph_dict).subs(t,t_sub).n(5)) for t_sub in t_list]
tabsol=TimeDataFrame(data={t:t_list,R:r1_list,})
tabsol_new= TimeDataFrame(tabsol.set_index(t))
table=tabsol_new.to_latex_dataframe()
graph2 = table.to_pylatex_tikz().in_figure()
display(graph2)
display(ReportText(f'Aby wykonać takie obliczenie wystarczy rozwiązać rownanie ruchu względem osi $x$: ({AutoMarker(eq_x)})'))
display(SympyFormula(eq_x))
odesys=ODESystem(odes=Matrix([eq_x.lhs-eq_x.rhs]), dvars=Matrix([x]), ode_order=2)
display(ReportText('Równanie jednorodne:'))
display(SympyFormula(Eq(Symbol('x_g'),odesys.general_solution[0])))
display(ReportText('Równanie szczególne:'))
display(SympyFormula(Eq(Symbol('x_s'),odesys.steady_solution[0])))
display(ReportText('Ostateczne równanie ruchu po osi $x$:'))
display(SympyFormula(Eq(x,odesys.solution.with_ics([0.0,0.0])[0],evaluate=False)))