Równania różniczkowe wyższych rzędów
Wskazówki dotyczące rozwiązywania równań różniczkowych przedstawione w poprzednim wpisie w pełni wystarczą do rozwiązywania problemów opisanych równaniem różniczkowym pierwszego rzędu. W praktyce oznacza to, że są one przydatne w zasadzie... nigdy 🙂 Nie są bezużyteczne, ale na pewno są niewystarczające do rozwiązywania większości problemów obliczeniowych. Jeśli w rzeczywistości stykamy się z potrzebą rozwiązania równania różniczkowego, to jest to zazwyczaj równanie wyższego rzędu i wtedy potrzeba czegoś jeszcze. Weźmy dla przykładu problem swobodnie odbijającej się od podłoża sprężystej piłki.
Żartowałem, przykład z odbijającą się piłką jest już przedstawiony w dokumentacji MATLABa i kopiowany w różnych MATLABowych podręcznikach, więc dla odmiany coś innego.
Układ RLC
Banalny i klasyczny układ elektryczny. Jego schemat nie jest specjalnie skomplikowany
Problem: określić, jak będzie wyglądało napięcie na kondensatorze w ciągu kilku chwil od momentu włączenia zasilania obwodu. Jak dojść do rozwiązania z pomocą MATLABa? Metoda nr 1, prosta i niewątpliwie skuteczna: uruchomić Simscape.
Niestety, nie zawsze możemy pozwolić sobie na rozwiązywane problemów w ten sposób. Przede wszystkim, nie każdy problem można zamodelować tak łatwo, poza tym nie każdy posiada pakiet SimScape. Złożone równania różniczkowe można rozwiązywać z pomocą podstawowej wersji MALTABa, należy jednak wiedzieć, jak takie równanie zapisać.
Dla obwodu przedstawionego powyżej wygląda ono tak:
Zapisanie równania to jedno, sprawienie, by MATLAB je rozwiązał, to drugie. Niestety, przy pomocy metody odeXX w MALTABie można rozwiązywać wyłącznie równania i układy równań różniczkowych pierwszego rzędu. Oznacza to, że należy w pierwszej kolejności znaleźć sposób na zapisanie równania różniczkowego wyższego rzędu w zmienionej formie. Równanie różniczkowe n-tego rzędu można zapisać jako układ n równań pierwszego rzędu. W powyższym przypadku obwodu RLC można zastosować następujące podstawienie:
W związku z tym równanie przyjmuje postać:
No, to teraz można przepisać wszystko do MATLABa 🙂
% Parametry równania param.R = 5; param.L = 0.2; param.C = 0.001; param.Uwe = 5; [t, y] = ode45(@odefun,[0 .5], [0 0], [], param); plot(t, y(:,1)); grid; xlabel('Czas [s]'); ylabel('U_c [V]'); function dy = odefun(t, y, param) % Wektor wyjsciowy dy = zeros(2,1); % Zdefiniowanie równania / układu równań dy(1) = y(2); dy(2) = (param.Uwe - y(2)*param.R*param.C - y(1))... /(param.L*param.C); end