Poniżej znajdą Państwo kody źródłowe podsumowujące tematy omawiane przez nas na ćwiczeniach w laboratorium. Nie jest to kopia tego, co robiliśmy na ćwiczeniach. Nie jest to też stricte materiał dydaktyczny - raczej coś w rodzaju "bloga z kodami", ot dla zgrubnej informacji, co było robione.
Poniższe pliki źródłowe można pobierać, klikając w nazwę programu.
c5-harmosc.m
zapisac pod nazwa harmosc.m
span style="color: #228B22;">% Dla równania $x' = f(t,x), \quad t_0 < t \leq T$ z warunkiem początkowym $x(t_0) = x_0$ % wyznacza x(T) % metodą niejawną Eulera z krokiem $h = (T-t_0)/N$ % nowy x to x(t+h)
span style="color: #228B22;">% jesteśmy więc b. blisko punktu stacjonarnego, % gdzie wartości własne to 0 (skąd degeneracja Jakobianu i problem w fsolve) % oraz dwie ujemne: -0.405 oraz -2189.6 % ... dla Eulera % ... dla iEulera % wykonujemy JEDEN krok schematu...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % oscylator harmoniczny x'' + 2*p*x' + w0^2*x = F(t) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% p = 0; % tłumienie w0 = 6; % częstość własna A = 3; % amplituda wymuszenia w = 4; % częstość wymuszenia T = 100; % czas obserwacji % zewnętrzne wymuszenie % zamieniamy na układ równań: % % x' = v % v' = F(t) - 2*p*v - w0^2*x % % X = [X(1), X(2)] = [x,v] % wykres rozwiązania % wykres fazowy
% przed użyciem funkcji należy ją zapisać do pliku o nazwie `euler.m` %%%%%%%%%%%%%%%% % % Metoda Eulera % %%%%%%%%%%%%%%%% % Dla równania $x' = f(t,x), \quad t_0 < t \leq T$ z warunkiem początkowym $x(t_0) = x_0$ % wyznacza x(T) % metodą Eulera z krokiem $h = (T-t_0)/N$ % nowy x to x(t+h)
%%%%%%%%%%%%%%%%%%%%%% % % Testowanie schematów % %%%%%%%%%%%%%%%%%%%%%% % definicja problemu % % prawa strona równania, $f(t,x)$ t0 = 0; x0 = 1; T = 4; % dane zadania % definicja rozwiązania dokładnego, $x(T)$ - dla sprawdzenia błędu % % definicja parametrów schematu % N = 20; % liczba kroków % % cz. I: test schematu % %g\n\t Euler: %f | RK4: %f | dokł: %f\n', T, xe, xrk4, X(T)); % wartości w chwili T %g\n\t Euler: %e | RK4: %e | dokł: %e\n', T, [xe, xrk4,X(T)]-X(T)); % błędy w chwili T % % cz. II: wykres rozwiązania % % punkty do wykresu % wartości rozwiązania w chwilach $t_0,\ldots, T$ ... % ... dla Eulera xrk4 = xe; % ... dla RK4 % wykonujemy JEDEN krok schematu... %g\n\t Euler: %f | RK4: %f | dokł: %f\n', T, xe(end), xrk4(end), X(T)); % wartości w chwili T %g\n\t Euler: %e | RK4: %e | dokł: %e\n', T, [xe(end), xrk4(end),X(T)]-X(T)); % błędy w chwili T % rysujemy wykresy % % cz. III: sprawdzenie rzędu % % uwaga: jeśli weźmiemy za dużo, może okazać się, że rząd 'nie wychodzi' %f', log2(err_e(1:end-1)./err_e(2:end))); %f', log2(err_rk4(1:end-1)./err_rk4(2:end)));
% przed użyciem funkcji należy ją zapisać do pliku o nazwie `rk4.m` %%%%%%%%%%%%%%%% % % Metoda RK4 % %%%%%%%%%%%%%%%% % Dla równania $x' = f(t,x), \quad t_0 < t \leq T$ z warunkiem początkowym $x(t_0) = x_0$ % wyznacza x(T) % metodą RK4 z krokiem $h = (T-t_0)/N$ % nowy x to x(t+h)
span style="color: #808080; font-style: italic;">; ; /* definiujemy równanie */ ; /* wersja minimalistyczna */ ; /* równanie z dwoma parametrami - czy można je rozwiązać symbolicznie? */ "k=1,a=1""k=-1:1,a=-3:3"]);
span style="color: #808080; font-style: italic;">; /* definiujemy równanie */ ; /* rozwiązujemy */ method; /* sprawdzamy typ-metodę */ ; /* wyznaczamy stałe dla zadania Cauchy'ego */ ; /* sprawdzenie: podstawiamy do równania rozwiązanie... */ ; /* ...przykładamy pochodną... */ ; ; /* seria rozwiązań ze zmienną stałą %c */ ; ; /* rozwiązanie, wynik w postaci uwikłanej */ depends(x,t); /* koniecznie informujemy, że x jest funkcją t! */ ; /* różniczkujemy uwikłane wyrażenie */ ; /* rozwikłujemy względem pochodnej i ewentualnie upraszczamy */ ; /* zapominamy, czym jest x */ ; ; /* cała seria wartości stałych */ ; /* pakiet zawierający więcej metod rozwiązywania */ put('contrib_ode,true,'verbose); /* więcej diagnostyki */ f(dx) := dx^2; ; /* definiujemy równanie */ ; /*...i rozwiązanie, które tym razem jest listą */ method; ; /* ...i które łatwiej sprawdzić */ ; /* uwzględniamy warunek początkowy */ ; /* czyści pamięć */
span style="color: #808080; font-style: italic;">; ; /* arccos(1/2) nie zadziała! */ ; ; ; ; ; ; /* wartość numeryczna */ ; /* sprawdzamy rozwiązanie: podstawiamy do równania... */ ; /* ...rozwijamy */ ; ; da: ratsimp(da); /* całkowanie */ c: integrate(x^4/(x+n),x); /* nieoznaczona! */ c: integrate(x^4/(x+n),x,0,%pi); /* oznaczona! */ ; c: c, n=4; /* to samo inaczej i na skróty */ ; ; /* obcinamy za duże wartości */ ; /* dwa wykresy na jednym */ ; /* czyści pamięć */