MultiFun = Funkcje wielu zmiennych

Wykład

Prezentacja

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):

    \[u(r,t) = 8 \sum_{n=1}^\infty \frac{1}{x_n^3 \mathop{\mathrm{J}_1}(x_n)} \mathop{\mathrm{J}_0}(x_n r) \cos(x_n c t),\]

gdzie c=1 oznacza prędkość dźwięku w membranie, a x_n to n-ty pierwiastek funkcji Bessela \mathop{\mathrm{J}_0}. Wartości kilku pierwszych x_n można odczytać np. ze strony MathWorld, a pozostałe oszacować wiedząc, że odległość między kolejnymi x_n dla dużych n dąży do \pi. 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 x_n^3, przy czym x_n \approx n\pi \approx 3n, a więc np. x_{10}^3 \gtrsim 10^4. Ponadto \mathrm{J_0} i \cos 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

  1. Wykonaj rysunek funkcji \displaystyle f(x,y) = \exp(-x^2 - y^2).
  2. 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).
  3. (*) Ogólne równanie krzywych stożkowych (okręgu, elipsy, paraboli i hiperboli) we współrzędnych biegunowych wygląda następująco:

        \[r(\varphi) = \frac{l}{1 - e\cos \varphi},\]

    gdzie l i e są pewnymi (nieujemnymi) parametrami. Sprawdź, że dla e=0, 0.5, 1, 2 faktycznie otrzymuje się wykres okręgu, elipsy, paraboli i hiperboli. W ten sprytny sposób poćwiczysz posługiwanie się współrzędnymi biegunowymi.