Mam homogeniczne rozwiązanie prostego rozwiązania ODE o drugiej kolejności, które, gdy próbuję rozwiązać początkowe wartości za pomocą Sympy, zwraca to samo rozwiązanie. Powinien zastąpić y (0) i y '(0) i dać rozwiązanie bez stałych, ale nie. Oto kod do ustawienia równania (jest równanie równowagi wiosennej, k = stała sprężyny i m = masa). Niektóre zbędne symbole, których używam gdzie indziej, przepraszam.Sympy drugiego rzędu od
%matplotlib inline
from sympy import *
m,k, x,t,s,T, omega,A,B = symbols('m k x t s T omega A B',float=True)
a = symbols('a', positive=True)
f,y,g,H,delta,S=symbols('f y g H delta S',cls=Function)
Eq1 = Eq(m*diff(y(t),t,2)+k*y(t))
Eq1
W rezultacie (prawidłowo) $ y {\ lewo (T \ prawej)} = C_ {1} e^{- T \ sqrt {- \ Frac {k} {m}}} + C_ {2} e^{t \ sqrt {- \ frac {k} {m}}} $
y (t) = C1e^(- t√ (-k/m)) + C2e^(t√ (-km)), który również ma y_n = c1.cos (√ (-k/m) t) + c2.sin (√ (-k/m) t).
Kiedy to równanie zostanie rozwiązane analitycznie i przekształcone w rozwiązanie za pomocą sinusów i cosinusów z omega = sqrt (-k/m), wówczas c1 = y (0) i c2 = y '(0)/omega. Tak więc, chociaż rozwiązanie częściowo dotyczy liczb zespolonych, oczywiście, funkcja dsolve po prostu zwraca oryginalne równanie homogeniczne jak powyżej. Mój kod ocenić ODE w y (0) i y '(0) wynosi:
Eq1_soln_IVP =dsolve(Eq1,y(t),x0=0, ics={y(0): a, y(t).diff(t).subs(t, 0): a})
Doceniam to dsolve po prostu może nie być w stanie obsłużyć tego IVP analitycznie, ale byłbym zaskoczony, gdyby tak jest w oparciu o jego inną pojemność. Pomocne będzie rozwiązanie tego problemu, a więc i innych analitycznych problemów drugiego rzędu. Sedno tej kwestii jest wokół:
ics={y(0): a, y(t).diff(t).subs(t, 0): a}
więc rozwiązanie próbowałem, który Dietrich potwierdza, było:
#Create IVP for y(0)
expr = Eq(Eq1_soln_IVP.rhs.subs(sqrt(-k/m),I*omega),y(0))
#Create IVP for y'(0)
expr2 = Eq(diff(y(t),t).subs(t,0),expr.lhs.diff(t))
#Maps all free variables and solves for each where t = 0.
solve([expr.subs(t,0),expr2.subs(t,0)])
Choć jest „a” rozwiązanie to wydaje się być bardzo zawiłe drogi znalezienie y (t) = y (0) cos (omega * t - phi) ... które odpowiada na ukryte pytanie o pewne ograniczenia tego solwera i bezpośrednie pytanie o to, jak rozwiązuje się ics arg. Dzięki.
Dziękuję Dietrichowi za zgłoszenie problemu 4720 i za niezależne potwierdzenie jedynego obejścia, które mogłem skonstruować. Odpowiedziałem z uznaniem. –
Problem matematyczny polega na tym, że solver nie wykorzystuje podstawień przy użyciu równań Eulera. Przekierowanie e^{\ pm i \ omega t} terminów do rozwiązania na formę m.cos (\ omega t) + ni sin (\ omega t) ma kluczowe znaczenie dla znalezienia rzeczywistego i fizycznego znaczenia tych równań, w tym przypadku sprężyna o masie zawieszonej na końcu, gdzie y (t) jest oscylującym przesunięciem. Sympy. fabuła radzi sobie z formą trygonometryczną, ale w ogóle nie ma złożonych form, co wyklucza również skuteczną wizualizację. –
To zależy od znaków 'm' i' k'. Jeśli napiszesz 'm, k = sy.symbols ('m k', positive = True)', otrzymasz prawdziwe (fizyczne) rozwiązanie. Istnieje wiele aplikacji, w których stosowane są złożone rozwiązania. BTW, będziesz musiał poradzić sobie z tym samym problemem, jeśli używasz Mathematica lub Maple. – Dietrich