Mathematica (cz.2)

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

|

Odpowiedz