Wst˛ep do SciPy

Transkrypt

Wst˛ep do SciPy
Wstep
˛ do SciPy
Janusz Szwabiński
[email protected]
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.1/29
Wstep
˛ do SciPy
Kilka uwag ogólnych
Macierze
Układy równań liniowych
Równania nieliniowe
Interpolacja
Całkowanie numeryczne
Przykłady (z list zadań)
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.2/29
Wymagania
gcc/g77
Python (2.1.x, 2.2x lub 2.3.x) z obsługa˛ biblioteki zlib
Numerical Python (
23.5)
biblioteki Atlas i FFTW (wydajność!)
WxPython, PyGist, Gnuplot
F2PY
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.3/29
Pierwsze kroki
zasoby w sieci
http://www.scipy.org
sposoby importowania
>>> from s c i p y import
>>> import s c i p y
pomoc
>>> s c i p y . i n f o ( s c i p y . o p t i m i z e . fmin )
kod źródłowy funkcji
>>> s c i p y . s o u r c e ( s c i p y . o p t i m i z e . fmin )
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.4/29
Moduły dostepne
˛
w pakiecie
cluster
algorytmy klasteryzacji danych
cow
pakiet do programowania równoległego
fftpack
domyślny pakiet FFT
fftw
pakiet do FFT oparty o bibliotek˛e FFTW
ga
algorytmy genetyczne
gplt
pakiet do wykresów w Gnuplocie
integrate
całkowanie numeryczne
interpolate
interpolacja
io
funkcje wejścia/wyjścia
linalg
algebra liniowa
optimize
zagadnienia optymalizacji
plt
pakiet do wykresów w WxPython
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.5/29
signal
przetwarzanie sygnałów
special
funkcje specjalne
stats
funkcje statystyczne
xplt
pakiet do wykresów w Gist
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.6/29
Macierze
Tworzenie macierzy
>>> A1= s c i p y . mat ( ’ [ 1 3 5 ; 2 5 1 ; 2 3 8 ] ’ )
>>> A1
Matrix ( [ [ 1 , 3 , 5 ] ,
[2 , 5 , 1] ,
[2 , 3 , 8]])
>>> A2= s c i p y . mat ( ’ [ 5 3 5 ; 2 3 1 ; 4 3 1 ] ’ )
Dodawanie macierzy
>>> A1+A2
Matrix ( [ [ 6 ,
6 , 10] ,
[ 4,
8,
2] ,
[ 6,
6,
9]])
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.7/29
Mnożenie przez skalar
>>> 2 A1
Matrix ( [ [ 2 ,
6 , 10] ,
[ 4 , 10 ,
[ 4,
2] ,
6 , 16]])
Mnożenie macierzy
>>> A1 A2
Matrix ( [ [ 3 1 , 2 7 , 1 3 ] ,
[24 , 24 , 16] ,
[48 , 39 , 2 1 ] ] )
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.8/29
Macierz odwrotna
>>> A = s c i p y . mat ( ’ [ 1 3 5 ; 2 5 1 ; 2 3 8 ] ’ )
>>> B = A. I
>>> A B
Matrix ( [ [
1 . 0 0 0 0 0 0 0 0 e +00 ,
5.55111512e
17 ,
4.85722573e
17] ,
[
1.38777878 e
16 ,
1 . 0 0 0 0 0 0 0 0 e +00 ,
7.63278329e
[
2.22044605 e
16 ,
5.55111512e
1.00000000e +00]])
17 ,
17] ,
>>> C= s c i p y . l i n a l g . inv (A)
>>> A C
Matrix ( [ [
00 ,
1.00000000e
6.93889390 e
17 ,
1.04083409e
16] ,
[
2.77555756 e
16 ,
1 . 0 0 0 0 0 0 0 0 e +00 ,
1.31838984e
16] ,
[
3.33066907 e
16 ,
0 . 0 0 0 0 0 0 0 0 e +00 ,
1.00000000e +00]])
>>> s c i p y . round (A C)
array ( [ [ 1 . ,
0. ,
0.] ,
[
0. ,
1. ,
0.] ,
[
0. ,
0. ,
1.]])
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.9/29
Wyznacznik macierzy
>>> A = s c i p y . mat ( ’ [ 1 3 5 ; 2 5 1 ; 2 3 8 ] ’ )
>>> s c i p y . l i n a l g . det (A)
25.000000000000004
Norma macierzy
>>> A = s c i p y . mat ( ’ [ 1 5 2 ; 2 4 1 ; 3 6 2 ] ’ )
>>> s c i p y . l i n a l g . norm (A, 2 )
9.918391609146008
>>> s c i p y . l i n a l g . norm (A, 1 )
15
>>> s c i p y . l i n a l g . norm (A, s c i p y . i n f )
11
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.10/29
Wartości i wektory własne
>>> A = s c i p y . mat ( ’ [ 1 5 2 ; 2 4 1 ; 3 6 2 ] ’ )
>>> l a , v = s c i p y . l i n a l g . e i g (A)
>>> l 1 , l 2 , l 3 = l a
>>> p r i n t l 1 , l 2 , l 3
(7.95791620491+0 j ) (
1.25766470568+0 j ) ( 0 . 2 9 9 7 4 8 5 0 0 7 6 7 + 0 j )
>>> p r i n t v [ : , 0 ]
[
0.5297175
0.44941741
0.71932146]
>>> p r i n t v [ : , 1 ]
[
0.90730751
0.28662547
0.30763439]
>>> p r i n t v [ : , 2 ]
[ 0.28380519
0.39012063
0.87593408]
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.11/29
Rozkład LU
>>> A = s c i p y . mat ( ’ [ 1 3 5 ; 2 5 1 ; 2 3 8 ] ’ )
>>> P , L ,U = s c i p y . l i n a l g . l u (A)
>>> P
array ( [ [ 0 . ,
1. ,
0.] ,
[ 0. ,
0. ,
1.] ,
[ 1. ,
0. ,
0.]])
>>> L
array ( [ [ 1 .
,
0.
,
0.
],
[ 1.
,
1.
,
0.
],
0.25 ,
1.
]])
[ 0.5 ,
>>> U
array ( [ [ 2 .
,
5.
,
1.
],
[ 0.
,
2.
,
7.
],
[ 0.
,
0.
,
6.25]])
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.12/29
Układy równań liniowych
>>> A = s c i p y . mat ( ’ [ 1 3 5 ; 2 5 1 ; 2 3 8 ] ’ )
>>> b = s c i p y . mat ( ’ [ 1 0 ; 8 ; 3 ] ’ )
>>> A. I b
Matrix ( [ [
9.28] ,
[ 5.16] ,
[ 0.76]])
>>> s c i p y . l i n a l g . s o l v e (A, b ) # l e p s z a metoda
array ( [ [
9.28] ,
[ 5.16] ,
[ 0.76]])
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.13/29
Równania nieliniowe
>>> def fun ( x ) :
...
return x
2
2
...
>>> s c i p y . o p t i m i z e . f s o l v e ( fun , 1 )
1.4142135623730947
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.14/29
Interpolacja
>>> x = s c i p y . arange ( 0 , 2 s c i p y . p i + s c i p y . p i /4 ,2 s c i p y . p i /8)
>>> y = s c i p y . s i n ( x )
>>> t c k = s c i p y . i n t e r p o l a t e . s p l r e p ( x , y , s =0)
>>> xnew = s c i p y . arange ( 0 , 2 s c i p y . pi , s c i p y . p i /50)
>>> ynew = s c i p y . i n t e r p o l a t e . s p l e v ( xnew , tck , der =0)
>>> s c i p y . g p l t . p l o t ( xnew , ynew , ’w l ’ , x , y , ’w p ’ )
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.15/29
Całkowanie numeryczne
>>> def fun ( x ) :
...
r e t u r n s c i p y . exp( x x )
...
>>> wynik = s c i p y . i n t e g r a t e . quad ( fun ,
scipy . Inf , scipy . Inf ) [ 0 ]
>>> dokladny_wynik = s c i p y . s q r t ( s c i p y . p i )
>>> wynik dokladny_wynik
2.2204460492503131 e 16
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.16/29
Przykłady (z list zadań)
1 2
1
1
2 3
1
2
4 1
0
1 1 0
1
0
Znajdź rozkład LU macierzy
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.17/29
>>> import s c i p y
>>> A= s c i p y . mat ( ’ [ 0 1 2
1; 1 2 3 1 ; 2 4 1 0 ;
1 1 0 1] ’)
>>> P , L ,U = s c i p y . l i n a l g . l u (A)
>>> P
array ( [ [ 0 . ,
0. ,
1. ,
0.] ,
[ 0. ,
0. ,
0. ,
1.] ,
[ 0. ,
1. ,
0. ,
0.] ,
[ 1. ,
0. ,
0. ,
0.]])
>>> L
array ( [ [ 1 .
,
0.
,
0.
,
0.
],
0.5
,
1.
,
0.
,
0.
],
[ 0.5
,
0.
,
1.
,
0.
],
[ 0.
,
0.33333333 ,
0.73333333 ,
1.
]])
[
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.18/29
>>> U
array ( [ [ 2 .
,
4.
,
1.
,
0.
],
[ 0.
,
3.
,
0.5
,
1.
],
[ 0.
,
0.
,
2.5
,
1.
],
[ 0.
,
0.
,
0.
,
2.06666667]])
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.19/29
4
1
4
9
16
1
8
27
64
2
Oblicz b A x̃
numerycznym
1 16 81 256
∞,
x
10
44
3
2
1
Rozwia˛ż układ równań
.
190
gdzie x̃ jest rozwiazaniem
˛
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.20/29
>>> import s c i p y
>>> A = s c i p y . mat ( ’ [ 1 2 3 4 ; 1 4 9 1 6 ; 1 8 27 6 4 ; 1 16 81 2 5 6 ] ’ )
>>> b = s c i p y . mat ( ’ [ 2 ; 1 0 ; 4 4 ; 1 9 0 ] ’ )
>>> r e s = s c i p y . l i n a l g . s o l v e (A, b )
>>> r e s
array ( [ [
1.] ,
[ 1.] ,
[
1.] ,
[ 1.]])
>>> norma = s c i p y . l i n a l g . norm ( b A r e s , s c i p y . i n f )
>>> norma
0.0
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.21/29
W tabeli podana jest liczba ludności na Ziemi w latach
1850-2025 (szacowanie):
rok
1850
1950
1960
1970
1985
2000
2025
ludność (mld)
1,402
2,486
3,014
3,683
4,842
6,127
8,177
Wyznacz interpolujac
˛ a˛ funkcj˛e sklejana˛
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.22/29
>>> import s c i p y
>>> from MyData import
# p a t r z p y t h o n _ i n t r o . pdf
>>> dane=Data ( )
>>> dane . f r e a d ( ’ lud . dat ’ )
>>> s p l i n e = s c i p y . i n t e r p o l a t e . s p l r e p ( dane . x , dane . y )
>>> xnew = s c i p y . arange ( 1 8 5 0 , 2 0 2 5 , 1 )
>>> ynew = s c i p y . i n t e r p o l a t e . s p l e v ( xnew , s p l i n e )
>>> s c i p y . g p l t . p l o t ( xnew , ynew , , dane . x , dane . y )
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.23/29
9
dane
f. sklejana
8
7
6
5
4
3
2
1
0
1840
1860
1880
1900
1920
1940
1960
1980
2000
2020
2040
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.24/29
2π
0
exp 2
1/2
sin x
1
2π
Oblicz całk˛e
dx
>>> import s c i p y
>>> def fun ( x ) :
...
r e t u r n s c i p y . exp ( s c i p y . s i n ( x )/ s c i p y . s q r t ( 2 ) ) / ( 2 s c i p y . p i )
...
>>> c a l k a = s c i p y . i n t e g r a t e . quad ( fun , 0 , 2 s c i p y . p i )
>>> c a l k a
( 1 . 1 2 8 9 6 0 9 2 9 4 5 4 1 9 0 2 , 7 . 4 2 9 0 7 0 8 8 9 8 6 4 7 6 1 2 e 09)
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.25/29
3x
Ustal punkt, w którym przecinaja˛ si˛e krzywe y
oraz y e x
>>> import s c i p y
>>> def fun ( x ) :
...
r e t u r n s c i p y . exp ( x) 3 x
...
>>> pp = s c i p y . o p t i m i z e . f s o l v e ( fun , 1 )
>>> pp
0.61906128673594507
>>> fun ( pp )
0.0
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.26/29
18x3
38x2
57x
9x4
14
Znajdź pierwiastki rzeczywiste równania
0
>>> import s c i p y
>>> w i e l = s c i p y . poly1d ( [ 9 , 1 8 , 3 8 ,
57 ,14])
>>> p r i n t w i e l
4
3
2
9 x + 18 x + 38 x
>>> f o r x i n w i e l . r :
...
57 x + 14
# w i e l . r zawiera w s z y s t k i e p i e r w i a s t k i
i f x . imag ==0: p r i n t x
...
(0.666666666667+0 j )
(0.333333333333+0 j )
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.27/29
Jest dana macierz hermitowska
2i 1
3i
2
2
i
2
2i
3
3
i
1
2i
2
i
1
3i 2
2i
3
i
1
1
i
1
A
1
i
4
Znajdź wartości i wektory własne macierzy A
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.28/29
>>> import s c i p y
>>> A = s c i p y . mat ( ’ [ 1 1 1 j 1 2 j 1 3 j ; 1+1 j 2 2 1 j 2 2 j ;
1+2 j 2+1 j 3 3 1 j ; 1+3 j 2+2 j 3+1 j 4 ] ’ )
>>> l a , v= s c i p y . l i n a l g . e i g (A)
>>> f o r l i n l a : p r i n t l
...
(10.3993569323
(
1 . 2 9 6 6 5 8 7 9 2 1 7e 17 j )
1 . 2 2 1 5 6 5 5 3 5 8 3 + 1 . 3 6 6 9 9 8 1 5 5 7 8 e 16 j )
( 0 . 5 1 8 6 6 7 1 7 0 8 0 7 + 1 . 4 6 0 8 9 1 2 6 5 7 e 16 j )
(0.303541432686
4 . 0 7 9 1 4 2 1 5 5 2 6 e 17 j )
Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński – p.29/29