Każdy fizyk wie, że świat dookoła najłatwiej opisać równaniem różniczkowym. Reszta (“czyli większość pozostająca w opozycji”) zapewne nie wie, że wzory (np. na ruch wahadełka czy słynnej masy na sprężynce) wypisywane na ściągach w liceum i wcześniej są rozwiązaniami równań różniczkowych opisujących dany problem.
Z powyższego powodu (gloryfikacja równań różniczkowych) chciałbym napisać parę prostych przykładów rozwiązywania równań różniczkowych za pomocą programu Mathematica.
Ponownie sięgnę po zadanie z kolokwium z I roku. Mamy do rozwiązania równanie różniczkowe:
Niezbyt skomplikowane równanie pierwszego rzędu… dałoby się policzyć nawet w pamięci, ale po co?
Prosimy Mathematicę o rozwiązanie:
In: DSolve[x^2 y'[x] == (y[x])^2 + x y[x], y[x], x]
Out: y[x] -> x/(C[1] – Log[x])
Trochę wyjaśnienia o funkcji DSolve. Przyjmuje ona 3 argumenty: równanie (lub równania, o czym zaraz), funkcję jakiej rozwiązania szukamy oraz zmienną niezależną. W naszym przypadku interesuje nas rozwiązanie postaci funkcji y(x), gdzie x jest zmienną niezależną. Przy zapisywaniu równań należy pamiętać że y jest funkcją x (nie piszemy y” tylko y”[x]).
Mathematica zwróciła nam rozwiązanie ogólne:
W zadaniu poproszono nas jeszcze o rozwiązanie tego równania różniczkowego z uwzględnieniem warunku początkowego:
Możemy to zrobić na 2 sposoby:
- Podstawić x=1 do rozwiązania ogólnego i rozwiązać równanie na stałą C1
In: Solve[1/(C1-Log[1])==1,C1]
Out: C1 -> 1
- Uwzględnić warunek początkowy przy rozwiązywaniu równania poprzez DSolve (jako pierwszy argument podajemy dwa równania ujmując je w klamry {} i oddzielając przecinkiem):
In: DSolve[{x^2 y'[x] == (y[x])^2 + x y[x],y[1]==1}, y[x], x] //Simplify
Out: y[x]->x/(1-Log[x])
Jak widać obydwie metody prowadzą nas do tego samego wyniku:
Przy bardziej skomplikowanych równaniach mających więcej warunków początkowych druga metoda okazuję się być zdecydowanie bardziej efektywna.
Ostatnią rzeczą o którą prosił nas autor jest narysowanie otrzymanego rozwiązania:
In: Plot[x/(1 – Log[x]), {x, 0, 6}, {Exclusions -> {1 – Log[x] == 0},
ExclusionsStyle -> Dashing[Small], PlotRange -> 50}]
Otrzymujemy:
Tak więc wiemy już jak zabrać się za rozwiązywanie nieskomplikowanych równań różniczkowych. Następnym razem pobawimy sie macierzami
goto
adres |