MultiFun = Funkcje wielu zmiennych
Spis treści
Wykład
Khan Academy
Lekcje w Khan Academy uzupełniają zajęcia kursowe. Najważniejszą ich zaletą jest klarowność wywodu i koncentracja na kształtowaniu intuicji matematycznej. Przy okazji można doszlifować swój angielski.
Thinking about multivariable functions.
Quiz
W tym tygodniu niespodzianka. Oto przygotowany w Octave film ilustrujący drgania okrągłej idealnie sprężystej membrany:
Skrypt Octave, którego użyłem (zapisawszy go uprzednio w pliku animate.m
), wygląda nastepująco:
graphics_toolkit ("gnuplot"); % eliminuje buga w linuksie w trybie GUI set(0, 'defaultfigurevisible', 'off'); [x,y] = meshgrid([-1:0.01:1]); S = 10; % S: gdzie obcinamy szereg? % broot: pierwiastki funkcji bessela J0 broot = 14.9309 + pi*(-4:1:(S-4-1)); broot(1:4) = [2.4048, 5.5201, 8.6537, 11.7915]; r = sqrt(x.^2 + y.^2); counter = -1; % licznik klatek filmu for t = linspace (0, 2*pi, 1000) % 2*pi to niestety bledna hipoteza robocza counter = counter + 1 z = x - x; sum = z; theta = 1./(r <= 1); % maska kola for i=[1:S] % bierzemy S wyrazow szeregu xi = broot(i); coeff = 8/(xi^3 * besselj(1, xi)) * cos(xi*t); sum = sum + coeff .* besselj(0, xi .* r); end z = theta .* sum; % gotowe z(x,y), czyli to, co wyswietlamy surf(x,y,z); hold on; axis([-1 1 -1 1 -1.3 1.3]); caxis([-1.3, 1.3]); shading interp; xlabel("x"); ylabel("y"); zlabel("u(x,y)"); tit = sprintf('t = %.3f', t/pi/0.85); title(tit); tt = 0:0.05:2*pi; plot3(cos(tt), sin(tt), 0*tt, "k", "linewidth", 1); hold off; filename = sprintf('output/%d.png', counter); #pause(0.01); print (filename); end
Powyższy program wyznacza położenie poszczególnych punktów membrany z gotowego rozwiązania (por. Równanie drgań membrany swobodnej/Membrana kołowa/Przykład):
gdzie oznacza prędkość dźwięku w membranie, a to -ty pierwiastek funkcji Bessela . Wartości kilku pierwszych można odczytać np. ze strony MathWorld, a pozostałe oszacować wiedząc, że odległość między kolejnymi dla dużych n dąży do . Dobrą alternatywą są kalkulatory funkcji specjalnych lub wyznaczenie tych zer w Octave
numerycznie, np. funkcją fsolve
(ale to by zbytnio skomplikowało i zaciemniło program, mający mieć pewne walory demonstracyjne).
Powyższy program zakłada, że w bieżącym katalogu utworzono wcześniej podkatalog output
. W linuksie można go uruchomić następująco:
> octave animate.m
Ponieważ jego wykonanie może zająć ponad pół godziny, alternatywnie można go uruchomić na serwerze (np. na pracowni studenckiej) w następujący sposób:
> nohup octave animate.m > qq &
i powrócić do serwera po mniej więcej godzinie, by utworzyć film. Ja w tym celu posłużyłem się komendą
> avconv -i %d.png oo.mp4
A teraz zadanie:
- Przedyskutujcie w grupie sens powyższego programu w Octave. Po co są poszczególne instrukcje? Które z instrukcji matematycznych działają na skalarach, a które w sposób wektorowy?
- Przedyskutujcie w grupie sposób implementacji w Octave powyżej przedstawionych wzorów matematycznych. Czy program usiłuje wyznaczyć dokładne wartości rozwiązania, a jeśli nie, to w którym miejscu to widać i dlaczego można tak zrobić?
Wskazówka: w mianowniku jest , przy czym , a więc np. . Ponadto i są funkcjami ograniczonymi. - Czy dostrzegasz jakąś użyteczność funkcji specjalnych, np. użytych w tym przykładzie funkcji Bessela? Przedyskutuj ten problem.
- Przedyskutujcie w grupie instrukcje, które należy wykonać w linuksie, aby z klatek stworzyć film. Np. do czego służy polecenie
nohup
i znaki>
oraz&
? Do czego służy avconv i co oznacza zapis-i %d.png
? Z czym, znanym z programowania, kojarzy się%d
?
Uwaga. Powyższy skrypt Octave nie działa w Windows ani w Linuksie Ubuntu 14.4 w wersji GUI, działa doskonale w wersji terminalowej; prawdopodobnie w Octave i/lub GhostScripcie jest błąd; skrypt działa wszędzie, jeśli usunie się w nim instrukcję print
. Ja korzystałem z wersji terminalowej poprzez łącze ssh
/ putty
. Wygenerowanie 1000 klatek filmu zajmuje na moim komputerze ok. 40 minut. Octave jest aplikacją jednowątkową i pełne wykorzystanie procesorów wielordzeniowych wymagałoby pewnej pomysłowości.
Uaktualnienie (13.01.2016). Kłopot z powyższym skryptem Octave w Linuksie pracującym w trybie GUI wynika z buga w bibliotece FLTK i/lub ze sposobu jej podpięcia pod Octave. Dopisałem na samym początku skryptu komendę graphics_toolkit ("gnuplot");
, która wymusza użycie jako silnika graficznego biblioteki gnuplot. U mnie ta łatka całkowicie rozwiązuje problem.
Zadania
- Wykonaj rysunek funkcji .
- Narysuj elipsę jako krzywą parametryczną (może mieć osie skierowane wzdłuż osi x,y układu współrzędnych).
Wskazówka: zacznij od narysowania okręgu (było na wykładzie). - (*) Ogólne równanie krzywych stożkowych (okręgu, elipsy, paraboli i hiperboli) we współrzędnych biegunowych wygląda następująco:
gdzie l i e są pewnymi (nieujemnymi) parametrami. Sprawdź, że dla faktycznie otrzymuje się wykres okręgu, elipsy, paraboli i hiperboli. W ten sprytny sposób poćwiczysz posługiwanie się współrzędnymi biegunowymi.