<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FWybrane_zagadnienia_numeryczne</id>
	<title>TI/Wybrane zagadnienia numeryczne - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FWybrane_zagadnienia_numeryczne"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Wybrane_zagadnienia_numeryczne&amp;action=history"/>
	<updated>2026-04-22T07:59:14Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Wybrane_zagadnienia_numeryczne&amp;diff=1664&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;==Rozwiązywanie równań liniowych== ; Przykład&lt;nowiki&gt;:&lt;/nowiki&gt;  Rozwiązanie układu równań liniowych: ::&lt;math&gt; \left\{ \begin{array}{l} x_1+3x_3=3\\ 2x_1+x_2+5x_...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Wybrane_zagadnienia_numeryczne&amp;diff=1664&amp;oldid=prev"/>
		<updated>2015-05-22T21:00:15Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;==Rozwiązywanie równań liniowych== ; Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;  Rozwiązanie układu równań liniowych: ::&amp;lt;math&amp;gt; \left\{ \begin{array}{l} x_1+3x_3=3\\ 2x_1+x_2+5x_...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Rozwiązywanie równań liniowych==&lt;br /&gt;
; Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie układu równań liniowych:&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{ \begin{array}{l}&lt;br /&gt;
x_1+3x_3=3\\&lt;br /&gt;
2x_1+x_2+5x_3=2\\&lt;br /&gt;
4x_1+8x_2+8x_3=1&lt;br /&gt;
\end{array} \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A = np.array([[1, 0, 3],&lt;br /&gt;
              [2, 1, 5],&lt;br /&gt;
              [4, 8, 8]])&lt;br /&gt;
b = np.array([3, 2, 1])&lt;br /&gt;
&lt;br /&gt;
x = np.linalg.solve(A, b)&lt;br /&gt;
print x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rezultat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='shell_example'&amp;gt;&lt;br /&gt;
[-12.75   1.25   5.25]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Jak to działa?&lt;br /&gt;
&lt;br /&gt;
Nasz wyjściowy układ równań liniowych możemy zapisać w postaci macierzowej &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt;:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{cccc}&lt;br /&gt;
\left( \begin{array}{ccc}1 &amp;amp; 0 &amp;amp; 3\\2 &amp;amp; 1 &amp;amp; 5\\4 &amp;amp; 8 &amp;amp; 8\end{array} \right)&amp;amp;&lt;br /&gt;
\left( \begin{array}{c}x_1\\x_2\\x_3\end{array} \right)&amp;amp;&lt;br /&gt;
=&amp;amp;&lt;br /&gt;
\left( \begin{array}{c}3\\2\\1\end{array} \right)\\&lt;br /&gt;
\ &amp;amp;\ &amp;amp;\ &amp;amp;\ \\&lt;br /&gt;
A&amp;amp;x&amp;amp;\ &amp;amp;b \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; konstruujemy ze współczynników mnożących zmienne &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x_3&amp;lt;/math&amp;gt; w poszczególnych równaniach &amp;amp;mdash; każdy wiersz macierzy &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; opisuje jedno równanie, każda jej kolumna opisuje kolejno jedną z niewiadomych zmiennych &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Po pomnożeniu &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; przez wektor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, którego każdy wiersz zawiera odpowiednią niewiadomą, otrzymamy lewą stronę naszego układu równań. Prawą stronę tworzy wektor &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, którego wiersze utworzone są odpowiednio z prawych stron poszczególnych równań układu.&lt;br /&gt;
&lt;br /&gt;
Funkcja &amp;lt;tt&amp;gt;solve&amp;lt;/tt&amp;gt; modułu Numpy zwraca nam listę zawierającą poszukiwane przez nas rozwiązanie układu równań: ''x''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = &amp;amp;minus;12,75, ''x''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = 1,25, ''x''&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; = 5,25.&lt;br /&gt;
&lt;br /&gt;
; Inne podejście&lt;br /&gt;
&lt;br /&gt;
Możemy zauważyć, że rozwiązanie układu równań można formalnie uzyskać mnożąc obie strony równania (lewostronnie) przez macierz odwrotną do ''A'':&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
Ax=b\quad\quad\quad\quad\quad\quad \mid A^{-1}\cdot \\&lt;br /&gt;
\underbrace{A^{-1}\cdot A}_{=1} \cdot x=A^{-1} \cdot b \\&lt;br /&gt;
x=A^{-1}b&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
W poniższym przykładzie do odwrócenia macierzy ''A'' stosujemy funkcję &amp;lt;tt&amp;gt;inv&amp;lt;/tt&amp;gt; z modułu &amp;lt;tt&amp;gt;numpy.linalg&amp;lt;/tt&amp;gt;. Mnożenie macierzy realizuje zaś funkcja &amp;lt;tt&amp;gt;dot&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A = np.array([[1, 0, 3],&lt;br /&gt;
              [2, 1, 5],&lt;br /&gt;
              [4, 8, 8]])&lt;br /&gt;
b = np.array([3, 2, 1])&lt;br /&gt;
&lt;br /&gt;
A1 = np.linalg.inv(A)&lt;br /&gt;
print &amp;quot;Macierz odwrotna do A:&amp;quot;&lt;br /&gt;
print A1&lt;br /&gt;
print &amp;quot;Sprawdzenie macierzy odwrotnej:&amp;quot;&lt;br /&gt;
print np.dot(A1, A)&lt;br /&gt;
x = np.dot(A1, b)&lt;br /&gt;
print &amp;quot;Rozwiązanie:&amp;quot;&lt;br /&gt;
print x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rezultat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='shell_example'&amp;gt;&lt;br /&gt;
Macierz odwrotna do A:&lt;br /&gt;
[[-8.    6.   -0.75]&lt;br /&gt;
 [ 1.   -1.    0.25]&lt;br /&gt;
 [ 3.   -2.    0.25]]&lt;br /&gt;
Sprawdzenie macierzy odwrotnej:&lt;br /&gt;
[[  1.00000000e+00   1.77635684e-15   1.77635684e-15]&lt;br /&gt;
 [ -1.11022302e-16   1.00000000e+00  -2.22044605e-16]&lt;br /&gt;
 [ -2.22044605e-16  -4.44089210e-16   1.00000000e+00]]&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
[-12.75   1.25   5.25]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wyrażenia lambda==&lt;br /&gt;
W takich obliczeniach jak te opisywane w niniejszym rozdziale, występuje potrzeba definiowania króciusieńkich funkcji.&lt;br /&gt;
Okazuje się, że można je definiować na dwa sposoby:&lt;br /&gt;
# zwyczajnie, z wykorzystaniem słowa kluczowego &amp;lt;tt&amp;gt;def&amp;lt;/tt&amp;gt;,&lt;br /&gt;
# jako tzw. ''wyrażenie &amp;amp;lambda;'', z wykorzystaniem słowa kluczowego &amp;lt;tt&amp;gt;lambda&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Po słowie kluczowym &amp;lt;tt&amp;gt;lambda&amp;lt;/tt&amp;gt; podajemy nazwy, które będą pełnić rolę zmiennych w naszej funkcji, a po dwukropku wypisujemy wyrażenie (używając podanych przed dwukropkiem nazw jako zmiennych).&lt;br /&gt;
&amp;lt;source lang='shell_example'&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def f(x): return x**3&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print f&lt;br /&gt;
&amp;lt;function f at 0x1c285f0&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; f1 = f&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print f1&lt;br /&gt;
&amp;lt;function f at 0x1c285f0&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; g = lambda x: x**3&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print g&lt;br /&gt;
&amp;lt;function &amp;lt;lambda&amp;gt; at 0x1c286e0&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W tym przykładzie, funkcje &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;f1&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt; działają tak samo &amp;amp;mdash; biorą jeden argument i&amp;amp;nbsp;zwracają jego sześcian.&lt;br /&gt;
Różnica jest taka, że funkcja &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; &amp;amp;bdquo;wie&amp;amp;rdquo; że nazywa się &amp;amp;bdquo;f&amp;amp;rdquo;, co widać w napisie wypisywanym po &amp;lt;tt&amp;gt;print f&amp;lt;/tt&amp;gt; czy &amp;lt;tt&amp;gt;print f1&amp;lt;/tt&amp;gt;. Natomiast funkcja &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt; nazywa się &amp;amp;bdquo;&amp;lt;lambda&amp;gt;&amp;amp;rdquo;, tak samo jak wszystkie inne funkcje zdefiniowane jako wyrażenie &amp;amp;lambda;, czyli nie ma swojej nazwy. Zmienna &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt; jest tylko dowiązaniem do obiektu funkcji, tak samo jak zmienna &amp;lt;tt&amp;gt;f1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Funkcja zdefiniowana jako wyrażenie &amp;amp;lambda; jest równoważna funkcji definiowanej zwyczajnie zwracającej to samo wyrażnie.&lt;br /&gt;
Niemniej, większości rzeczy które można zrobić w funkcji, nie można zrobić w wyrażeniu &amp;amp;lambda; ze względu na ograniczenia&lt;br /&gt;
składni: &lt;br /&gt;
# Wyrażenie &amp;amp;lambda; musi być pojedynczym wyrażeniem.&lt;br /&gt;
# Wyrażenie &amp;amp;lambda; nie może zawierać ''docstringa''.&lt;br /&gt;
&lt;br /&gt;
Wyrażenia &amp;amp;lambda; są wygodne ze względu na to, że wymagają mniej stukania w klawisze.&lt;br /&gt;
==Rozwiązywanie równań dowolnych==&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.optimize as so&lt;br /&gt;
&lt;br /&gt;
def func(x):&lt;br /&gt;
    return x**3 + 3. * x - 0.3&lt;br /&gt;
&lt;br /&gt;
print so.fsolve(func, 0.5)&lt;br /&gt;
print so.fsolve(lambda x: x**3 + 3*x - 0.3, 0.5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rezultat&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='shell_example'&amp;gt;&lt;br /&gt;
0.099669956223525716&lt;br /&gt;
0.099669956223525716&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Jak to działa?&lt;br /&gt;
&lt;br /&gt;
Funkcja &amp;lt;tt&amp;gt;fsolve&amp;lt;/tt&amp;gt; z modułu &amp;lt;tt&amp;gt;scipy.optimize&amp;lt;/tt&amp;gt; poszukuje miejsc zerowych funkcji, czyli takich wartości ''x'', dla których &amp;lt;math&amp;gt;f(x)=0&amp;lt;/math&amp;gt;. Załóżmy, że chcemy rozwiązać równanie:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;x^3+3x=0,3&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Po przepisaniu tego równania do postaci&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;x^3+3x-0,3=0&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
widzimy, że rozwiązanie tego równania jest równoważne poszukiwaniu miejsc zerowych funkcji:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;f(x)=x^3+3x-0,3&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Funkcja &amp;lt;tt&amp;gt;fsolve&amp;lt;/tt&amp;gt; oczekuje badanej funkcji jako pierwszego argumentu. Możemy tu przekazać nazwę funkcji osobno zdefiniowanej, jak na przykład &amp;lt;tt&amp;gt;func&amp;lt;/tt&amp;gt;. Jeśli chcemy szukać miejsc zerowych funkcji, którą da się zapisać prostym wyrażeniem złożonym z operacji na dostępnych wielkościach i funkcjach możemy użyć jako argumentu ''wyrażenia lambda''. Wyrażenie to zastępuje &amp;amp;bdquo;pełną&amp;amp;rdquo; definicję funkcji w momencie, gdy tak naprawdę taka pełna definicja nie jest nam potrzebna. W podanym przykładzie szukaną funkcję przekazaliśmy dwoma sposobami &amp;amp;mdash; raz z użyciem nazwy uprzednio zdefiniowanej funkcji &amp;lt;tt&amp;gt;func&amp;lt;/tt&amp;gt;, a raz z użyciem wyrażenia lambda.&amp;lt;br&amp;gt;&lt;br /&gt;
Drugim argumentem tej funkcji jest punkt startowy do poszukiwania miejsca zerowego. Powinniśmy najpierw zgrubnie oszacować położenie poszukiwanego miejsca zerowego i wpisać je tutaj. W zależności od funkcji parametr ten jest mniej lub bardziej istotny dla znalezienia poprawnego wyniku. Jest on zaś szczególnie istotny, jeśli badana funkcja ma więcej niż jedno miejsce zerowe (w tym przypadku wskazane może być wykreślenie funkcji).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Numeryczne obliczanie całek oznaczonych==&lt;br /&gt;
; Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.integrate as si&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def func(x):&lt;br /&gt;
    return x**3/(np.exp(x)-1)&lt;br /&gt;
&lt;br /&gt;
print 'Całka od',0,'do',1,'wynosi',si.quad(func,0,1)&lt;br /&gt;
print 'Całka od',0,'do','+∞','wynosi',si.quad(func,0,np.inf)&lt;br /&gt;
print 'Całka od',0,'do','π','wynosi',si.quad(lambda x: np.sin(x),0,np.pi)&lt;br /&gt;
print 'Całka od',0,'do',1,'wynosi',si.quad(lambda x: x,0,1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rezultat&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='shell_example'&amp;gt;&lt;br /&gt;
Całka od 0 do 1 wynosi (0.22480518802593821, 2.4958389580158414e-15)&lt;br /&gt;
Całka od 0 do +∞ wynosi (6.4939394022668298, 2.6284700289248249e-09)&lt;br /&gt;
Całka od 0 do π wynosi (2.0, 2.2204460492503131e-14)&lt;br /&gt;
Całka od 0 do 1 wynosi (0.5, 5.5511151231257827e-15)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Jak to działa?&lt;br /&gt;
&lt;br /&gt;
Do numerycznego obliczania całek oznaczonych używamy funkcji &amp;lt;tt&amp;gt;quad&amp;lt;/tt&amp;gt; z modułu &amp;lt;tt&amp;gt;scipy.integrate&amp;lt;/tt&amp;gt;. Funkcja ta jako pierwszego argumentu wywołania oczekuje funkcji, którą będziemy całkować. Podobnie jak w poprzednim przykładzie, możemy tu przekazać nazwę funkcji osobno zdefiniowanej (&amp;lt;tt&amp;gt;func&amp;lt;/tt&amp;gt;) albo wyrażenia lambda.&amp;lt;br&amp;gt;&lt;br /&gt;
Drugi i trzeci argument funkcji &amp;lt;tt&amp;gt;quad&amp;lt;/tt&amp;gt; to początek i koniec zakresu całkowania. Zauważ, że oprócz &amp;amp;bdquo;normalnych&amp;amp;rdquo; liczb możliwe są zakresy nieskończone, z użyciem stałej &amp;lt;tt&amp;gt;inf&amp;lt;/tt&amp;gt; z modułu &amp;lt;tt&amp;gt;numpy&amp;lt;/tt&amp;gt;. Rezultatem funkcji &amp;lt;tt&amp;gt;quad&amp;lt;/tt&amp;gt; jest krotka dwuelementowa. Pierwszy jej element to wynik całkowania, natomiast drugi określa dokładność, z jaką udało się wynik ten policzyć.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rozwiązywanie równań różniczkowych==&lt;br /&gt;
; Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie równania różniczkowego &amp;lt;math&amp;gt;\frac{dy(t)}{dt}=y&amp;lt;/math&amp;gt; z warunkiem początkowym &amp;lt;math&amp;gt;y(t=0)=1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.integrate as si&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as p&lt;br /&gt;
&lt;br /&gt;
df = lambda y, t: y&lt;br /&gt;
X = np.linspace(0, 5, 51)        # 51 punktów od 0 do 5 włącznie&lt;br /&gt;
wynik = si.odeint(df, 1, X)&lt;br /&gt;
&lt;br /&gt;
p.plot(X, np.zeros_like(X), 'ro',&lt;br /&gt;
       X, wynik, 'go',&lt;br /&gt;
       X, numpy.exp(X), '--')&lt;br /&gt;
p.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rezultat&lt;br /&gt;
&lt;br /&gt;
[[Grafika:ODE1.png]]&lt;br /&gt;
&lt;br /&gt;
; Jak to działa?&lt;br /&gt;
Poszukujemy funkcji &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; spełniającej nasze równanie różniczkowe &amp;lt;math&amp;gt;y^\prime=y&amp;lt;/math&amp;gt;. Funkcja &amp;lt;tt&amp;gt;odeint&amp;lt;/tt&amp;gt; (skrót ODE pochodzi z angielskiego określenia ''ordinary differential equation'' czyli równanie różniczkowe zwyczajne) oblicza wartości poszukiwanej przez nas funkcji w punktach podanych jako jej trzeci argument. &lt;br /&gt;
Z teorii wiemy, że równanie to spełnia funkcja &amp;lt;math&amp;gt;y(t)=\exp(t)&amp;lt;/math&amp;gt; (spełnia je również funkcja &amp;lt;math&amp;gt;y(t) \equiv0 &amp;lt;/math&amp;gt;, ale ze względu na przyjęty warunek początkowy ta funkcja nie może być naszym rozwiązaniem).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Równania wyższych stopni i układy równań różniczkowych ==&lt;br /&gt;
Poniższy przykład ilustruje jak można rozwiązać równanie różniczkowe zwyczajne wyższego rzędu. Jednocześnie będzie to przykład na rozwiązywanie układów równań różniczkowych.&lt;br /&gt;
&lt;br /&gt;
Rozważmy masę &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; umieszczoną na sprężynie o stałej sprężystości &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Siła działająca na masę zależna jest od jej wychylenia &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; z położenia równowagi i wynosi &amp;amp;minus;''kx''. Równanie ruchu tej masy to (kropka nad symbolem zmiennej oznacza jej różniczkowanie po czasie: jedna kropka &amp;amp;mdash; pierwszą pochodną, dwie kropki &amp;amp;mdash; drugą pochodną):&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m\ddot{x} = - k x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dzieląc to równanie stronami przez &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; otrzymujemy standardowe równanie oscylatora harmonicznego o częstości &amp;lt;math&amp;gt;\omega = \sqrt{\frac{k}{m}} &amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\ddot{x} = - \omega^2 x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcje całkujące równania różniczkowe w SciPy radzą sobie tylko z równaniami i układami równań pierwszego rzędu. Musimy zatem przepisać nasze równanie na układ równań pierwszego rzędu. Można to zrobić wprowadzając dodatkową zmienną. Tą zmienną jest &amp;lt;math&amp;gt;v = \dot{x}&amp;lt;/math&amp;gt; (prędkość masy).&lt;br /&gt;
Teraz nasz układ wygląda tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{ \begin{array}{l}&lt;br /&gt;
\dot{x} = v \\&lt;br /&gt;
\dot{v} = - \omega^2 x&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from scipy.integrate import odeint&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as p&lt;br /&gt;
&lt;br /&gt;
def prawa_strona_rownania(w, t, params):&lt;br /&gt;
    ''' Argumenty:&lt;br /&gt;
         w: wektor stanu (u nas x, v)&lt;br /&gt;
         t: czas&lt;br /&gt;
         params: wektor parametrów (u nas omega_kwadrat)&lt;br /&gt;
&lt;br /&gt;
     W wektorze f funkcja zwraca&lt;br /&gt;
              obliczone dla danego wektora stanu&lt;br /&gt;
              wartości prawej strony równania&lt;br /&gt;
    '''&lt;br /&gt;
    x, v = w                  # dla czytelności równania wypakowuję zmienne z wektora &amp;quot;w&amp;quot;&lt;br /&gt;
    omega_kwadrat, = params   # i podobnie z parametrami &amp;quot;params&amp;quot;&lt;br /&gt;
    # poniżej do tablicy f w kolejnych wierszach wpisuję&lt;br /&gt;
    # kolejne prawe strony równań stanowiących układ&lt;br /&gt;
    f = [v,                   # wartość pochodnej dx/dt&lt;br /&gt;
         -omega_kwadrat * x]  # wartość pochodnej dv/dt&lt;br /&gt;
    return f&lt;br /&gt;
&lt;br /&gt;
t = np.linspace(0, 5, 51)&lt;br /&gt;
params = [2]&lt;br /&gt;
w = [0, 3]                    # warunek początkowy (t=0) dla x i v&lt;br /&gt;
print &amp;quot;Wektor stanu w chwili początkowej: &amp;quot;,&lt;br /&gt;
print prawa_strona_rownania(w, t[0], params)&lt;br /&gt;
&lt;br /&gt;
# argumentami odeint są:&lt;br /&gt;
# - nazwa funkcji,&lt;br /&gt;
# - wektor stanu początkowego,&lt;br /&gt;
# - wektor zawierający chwile czasu, dla których ma być zwrócony stan układu&lt;br /&gt;
# - krotka zawierająca dodatkowe parametry, które mają być przekazane do funkcji&lt;br /&gt;
#           opisującej prawe strony równań&lt;br /&gt;
&lt;br /&gt;
wynik = odeint(prawa_strona_rownania, w, t, args=(params,) ) &lt;br /&gt;
&lt;br /&gt;
x = wynik[:, 0]&lt;br /&gt;
v = wynik[:, 1]&lt;br /&gt;
&lt;br /&gt;
p.plot(t,x, t,v)&lt;br /&gt;
p.legend(('x', 'v'))&lt;br /&gt;
p.grid(True)&lt;br /&gt;
p.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja &amp;lt;tt&amp;gt;odeint&amp;lt;/tt&amp;gt; oczekuje przynajmniej trzech parametrów: funkcji obliczającej pochodną poszukiwanej funkcji (albo pochodne poszukiwanych funkcji w przypadku układu równań), warunku początkowego dla szukanych funkcji oraz sekwencji punktów czasu, w których będzie obliczone rozwiązanie. W naszym przypadku będą to:&lt;br /&gt;
# nazwa funkcji obliczającej pochodne &amp;amp;mdash; &amp;lt;tt&amp;gt;prawa_strona_rownania&amp;lt;/tt&amp;gt;, zwraca wektor &amp;lt;math&amp;gt;[\dot{x},\ \dot{v}]&amp;lt;/math&amp;gt;, czyli &amp;lt;math&amp;gt;[v,\ -\omega ^2 x]&amp;lt;/math&amp;gt;;&lt;br /&gt;
# warunek początkowy &amp;amp;mdash; lista &amp;lt;tt&amp;gt;w = [0, 3]&amp;lt;/tt&amp;gt;, czyli [''x''(0), ''v''(0)];&lt;br /&gt;
# sekwencja punktów czasu &amp;amp;mdash; wektor &amp;lt;tt&amp;gt;t = np.linspace(0,5,51)&amp;lt;/tt&amp;gt;, czyli [0, 0,1, 0,2,... 4,9, 5].&lt;br /&gt;
U nas jest jeszcze czwarty parametr (nazwany, o nazwie &amp;lt;tt&amp;gt;args&amp;lt;/tt&amp;gt;). Powinna być to krotka zawierająca dodatkowe parametry, jakich może potrzebować funkcja obliczająca wartości pochodnych. U nas jest taki jeden dodatkowy parametr: &amp;amp;omega;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, która w naszym programie jest przechowywana w zmiennej &amp;lt;tt&amp;gt;params&amp;lt;/tt&amp;gt;. Tworzymy więc z niej krotkę jednoelementową i przekazujemy ją funkcji &amp;lt;tt&amp;gt;odeint&amp;lt;/tt&amp;gt; jako czwarty parametr. Zostanie ona użyta podczas liczenia prawej strony równań rozwiązywanego układu, czyli w funkcji &amp;lt;tt&amp;gt;prawa_strona_rownania&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Rezultat&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy wykres zmiennych ''x'' i ''v'' czyli położenia i prędkości masy zaczepionej na sprężynie. Ponieważ zastosowaliśmy  warunek początkowy ''x''(0) = 0, ''v''(0) = 3, więc w chwili początkowej masa mija punkt równowagi ''x''=0 z prędkością 3 jednostek. Otrzymujemy drgania z amplitudą teoretycznie 3/&amp;amp;omega; = 2,12 jednostek.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:ODE2.png]]&lt;br /&gt;
&lt;br /&gt;
==Transformata Fouriera==&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import pylab as p&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.fftpack as sf&lt;br /&gt;
&lt;br /&gt;
x = np.loadtxt('c4spin.txt')&lt;br /&gt;
&lt;br /&gt;
p.subplot(2,1,1)&lt;br /&gt;
p.plot(x)&lt;br /&gt;
p.subplot(2,1,2)&lt;br /&gt;
z=sf.fft(x)&lt;br /&gt;
widmo = np.abs(z[:len(z)/2])&lt;br /&gt;
p.plot(widmo)&lt;br /&gt;
p.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 http://brain.fuw.edu.pl/~jarek/SYGNALY/TF/c4spin.txt&lt;br /&gt;
&lt;br /&gt;
; Rezultat&lt;br /&gt;
&lt;br /&gt;
[[Grafika:FFT.gif]]&lt;br /&gt;
&lt;br /&gt;
===Jak to działa ===&lt;br /&gt;
Moduł &amp;lt;tt&amp;gt;scipy.fftpack&amp;lt;/tt&amp;gt; dostarcza narzędzi do liczenia transformaty Fouriera.&lt;br /&gt;
Transformata Fouriera pozwala wyznaczyć skład częstotliwościowy sygnału.&lt;br /&gt;
W powyższym przykładzie wczytujemy dane z pliku tekstowego poleceniem &amp;lt;tt&amp;gt;np.loadtxt('c4spin.txt')&amp;lt;/tt&amp;gt;. Dane te interpretujemy jako kolejne próbki pewnego sygnału.&lt;br /&gt;
&lt;br /&gt;
Na górnym panelu rysunku wykreślamy przebieg sygnału w czasie. &lt;br /&gt;
Funkcja &amp;lt;tt&amp;gt;sf.fft(x)&amp;lt;/tt&amp;gt; oblicza transformatę Fouriera sygnału &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zmienna &amp;lt;tt&amp;gt;z&amp;lt;/tt&amp;gt; zawiera pełną informację o transformacie Fouriera sygnału &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; &amp;amp;mdash; jest to wektor liczb zespolonych. Aby uzyskać informację o częstościach zawartych w sygnale &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; trzeba wziąć wartość bezwzględną liczb &amp;lt;tt&amp;gt;z&amp;lt;/tt&amp;gt;. Jeśli ponadto sygnał &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; składa się z liczb rzeczywistych (a tak jest w naszym przypadku) to wynikowy wektor &amp;lt;tt&amp;gt;z&amp;lt;/tt&amp;gt; zawiera pełną informację o składzie częstotliwościowym w swojej pierwszej połowie. Dlatego do zmiennej &amp;lt;tt&amp;gt;widmo&amp;lt;/tt&amp;gt; przepisujemy tylko wycinek &amp;lt;tt&amp;gt;z[:len(z)/2]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Na dolnym panelu wyrysowujemy zmienną &amp;lt;tt&amp;gt;widmo&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>