Sei sulla pagina 1di 10

Numerical python book practice

May 16, 2016

In [1]: %lsmagic
Out[1]: Available line magics:
%alias %alias_magic %autocall
Available cell magics:
%%! %%HTML %%SVG %%bash

%automagic

%%capture

%autosave

%%debug

%%file

Automagic is ON, % prefix IS NOT needed for line magics.


In [2]: %run test.py
ok! you have succesfully run this script

In [3]: %reset
Once deleted, variables cannot be recovered. Proceed (y/[n])? n
Nothing done.

In [4]: %pylab notebook


Populating the interactive namespace from numpy and matplotlib

In [5]: data=array([[1,2],
[3,4],
[5,6]])
In [6]: data.shape
Out[6]: (3, 2)
In [7]: X=Y=linspace(1,10)
In [8]: type(X)
Out[8]: numpy.ndarray
1

%bookmark

%%html

%cat

%c

%%javascrip

In [9]: x,y=meshgrid(X,Y)
In [10]: from sympy import *
x=symbols('x')
func=lambda x:x**2 +2*x -3
func(x)
Out[10]: x**2 + 2*x - 3
In [11]: %reset
Once deleted, variables cannot be recovered. Proceed (y/[n])? n
Nothing done.

In [12]: %pylab notebook


from sympy import *
init_printing()
Populating the interactive namespace from numpy and matplotlib

WARNING: pylab import has clobbered these variables: ['test', 'floor', 'beta', 'sqr
`%matplotlib` prevents importing * from pylab and numpy
In [13]: x,y,z=symbols('x,y,z')
z=(x+y)**2
z
Out[13]:
(x + y)2
In [14]: x=y=linspace(1,3)
X,Y=meshgrid(x,y)
Z=(+Y)**2
Z
Out[14]: array([[ 1.
,
1.
,
[ 1.08329863,
1.08329863,
[ 1.1699292 ,
1.1699292 ,
...,
[ 8.51686797,
8.51686797,
[ 8.75676801,
8.75676801,
[ 9.
,
9.
,

1.
, 1.
, ...,
1.
],
1.08329863, 1.08329863, ...,
1.08329863],
1.1699292 , 1.1699292 , ...,
1.1699292 ],
8.51686797, 8.51686797, ...,
8.51686797],
8.75676801, 8.75676801, ...,
8.75676801],
9.
, 9.
, ...,
9.
]])
2

1.

1.08329863,
1.1699292 ,

8.51686797,
8.75676801,
9.

In [15]: Z[0:2]
Out[15]: array([[ 1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
[ 1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,

1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,

1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,

1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,

1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
,
1.
],
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863,
1.08329863]])

In [16]: Z[0:-1]
Out[16]: array([[ 1.
,
1.
,
[ 1.08329863,
1.08329863,
[ 1.1699292 ,
1.1699292 ,
...,
[ 8.28029988,
8.28029988,
[ 8.51686797,
8.51686797,
[ 8.75676801,
8.75676801,

1.
, 1.
, ...,
1.
],
1.08329863, 1.08329863, ...,
1.08329863],
1.1699292 , 1.1699292 , ...,
1.1699292 ],

1.

1.08329863,
1.1699292 ,

8.28029988, 8.28029988, ...,


8.28029988],
8.51686797, 8.51686797, ...,
8.51686797],
8.75676801, 8.75676801, ...,
8.75676801]])

8.28029988,

1.25989171, 1.25989171, ...,


1.25989171],
1.35318617, 1.35318617, ...,
1.35318617],
1.44981258, 1.44981258, ...,
1.44981258],

1.25989171,

8.51686797,
8.75676801,

In [17]: Z[3:]
Out[17]: array([[ 1.25989171,
1.25989171,
[ 1.35318617,
1.35318617,
[ 1.44981258,
1.44981258,
...,
[ 8.51686797,

8.51686797,
3

8.51686797, ...,

1.35318617,
1.44981258,

8.51686797,

8.51686797,
[ 8.75676801,
8.75676801,
[ 9.
,
9.
,

8.51686797],
8.75676801, 8.75676801, ...,
8.75676801],
9.
, 9.
, ...,
9.
]])

8.75676801,
9.

In [18]: Z[::-50]
Out[18]: array([[ 9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

In [19]: f=lambda a,b:a+10*b


F=fromfunction(f,[6,6])
F
Out[19]: array([[
[
[
[
[
[

0.,
1.,
2.,
3.,
4.,
5.,

10.,
11.,
12.,
13.,
14.,
15.,

20.,
21.,
22.,
23.,
24.,
25.,

30.,
31.,
32.,
33.,
34.,
35.,

40.,
41.,
42.,
43.,
44.,
45.,

4.,

5.])

50.],
51.],
52.],
53.],
54.],
55.]])

In [20]: F[:,0]
Out[20]: array([ 0.,

1.,

2.,

3.,

In [21]: F[:,3]
Out[21]: array([ 30.,

31.,

32.,

33.,

34.,

35.])

10.,

20.,

30.,

40.,

50.])

In [22]: F[0,:]
Out[22]: array([

0.,

In [23]: F[:3,:3]
Out[23]: array([[
[
[

0.,
1.,
2.,

10.,
11.,
12.,

20.],
21.],
22.]])

In [24]: F[:,0]
Out[24]: array([ 0.,

1.,

2.,

3.,

4.,

In [65]: F[1:4,2:4]
Out[65]: array([[ 21.,
[ 22.,
[ 23.,

31.],
32.],
33.]])
4

5.])

9.,
9.,
9.,
9.,

9.,
9.,
9.,
9.,

9., 9.,
9., 9.,
9., 9.,
9.]])

9.,
9.,
9.,

We can access data by issueing n:m which means from element in row and then call ,n:m to limit
it in specific column
In [26]: F[::-1]
Out[26]: array([[
[
[
[
[
[

5.,
4.,
3.,
2.,
1.,
0.,

15.,
14.,
13.,
12.,
11.,
10.,

25.,
24.,
23.,
22.,
21.,
20.,

35.,
34.,
33.,
32.,
31.,
30.,

45.,
44.,
43.,
42.,
41.,
40.,

55.],
54.],
53.],
52.],
51.],
50.]])

5.,
3.,
1.,

15.,
13.,
11.,

25.,
23.,
21.,

35.,
33.,
31.,

45.,
43.,
41.,

55.],
53.],
51.]])

In [27]: F[::-2]
Out[27]: array([[
[
[

In [28]: F[3::2,1::3]
Out[28]: array([[ 13.,
[ 15.,

43.],
45.]])

In [29]: r,h=symbols('r h')


In [30]: Area=2*pi*r**2 +2*pi*r*h
Area
Out[30]:
2hr + 2r2
In [31]: Volume=pi*r**2 *h
Volume
Out[31]:
hr2
In [32]: h_r=solve(Volume-1)[0]
h_r
Out[32]:


1
h: 2
r

In [33]: Area_r=Area.subs(h_r)
Area_r

Out[33]:
2r2 +

2
r

In [34]: rsol=solve(Area_r.diff(r))[0]
rsol
Out[34]:
2

23

23
In [35]: _.evalf()
Out[35]:
0.541926070139289
In [36]: Area_r.diff(r,2).subs(r,rsol)
Out[36]:
12
In [37]: Area_r.subs(r,rsol)
Out[37]:

3
3 23
In [38]: _.evalf()
Out[38]:
5.53581044593209
In [39]: func_r=lambdify(r,2*pi*r**2 +2/r)
func_r(r)
Out[39]:
6.28318530717959r2 +
In [68]: plotting.plot(func_r(r),(r,0,2))
<IPython.core.display.Javascript object>

<IPython.core.display.HTML object>

2
r

Out[68]: <sympy.plotting.plot.Plot at 0x7f76daf77898>


In [41]: from scipy.optimize import *
In [67]: min_r=minimize_scalar(func_r,bracket=[0.1,4])
min_r
Out[67]:

0.0.1

fun:
nfev:
nit:
success:
x:

5.5358104459320856
16
15
True
0.54192607725571351

Newtons method

In [43]: x=symbols('x')
x_k1,x_k,k=symbols('x_k1 x_k k')
f=Function('f')
x_k1=x_k -f(k).diff(k)/f(k).diff(k,2)
x_k1
Out[43]:
xk

0.0.2

d
dk f (k)
d2
f (k)
dk2

Newtons method for multivariate question

It should looks like this!


x_k1=x_k - hessian(f,x_k)**-1 *gradient(f)
In [44]: x1,x2=symbols('x_1 x_2')
In [45]: f_sym=(x1-1)**4 +5*(x2-1)**2 -2*x1*x2
f_sym
Out[45]:
2x1 x2 + (x1 1)4 + 5 (x2 1)2
In [46]: #Gradient
fprime_sym=Matrix([f_sym]).jacobian([x1,x2]).tolist()[0]
#fprime_sym=[f_sym.diff(x_) for x_ in (x1, x2)]
fprime_sym
Out[46]:
h
2x2 + 4 (x1 1)3 ,

i
2x1 + 10x2 10

In [47]: #Hessian
fhess_sym=hessian(f_sym,[x1,x2]).tolist()
#fhess_sym = [[f_sym.diff(x1_, x2_) for x1_ in (x1, x2)] for x2_ in (x1, x
fhess_sym
Out[47]:
hh

12 (x1 1)2 ,

i
2 ,

[2,

i
10]

In [48]: f_lmbda=lambdify([x1,x2],f_sym)
f_lmbda(x1,x2)
Out[48]:
2x1 x2 + (x1 1)4 + 5 (x2 1)2
In [49]: fprime_lmbda=lambdify([x1,x2],fprime_sym)
fprime_lmbda(x1,x2)
Out[49]:
h

2x2 + 4 (x1 1)3 ,

i
2x1 + 10x2 10

In [50]: fhess_lambda=lambdify([x1,x2],fhess_sym)
fhess_lambda(x1,x2)
Out[50]:
hh

12 (x1 1)2 ,

i
2 ,

[2,

i
10]

In [51]: def func_XY_to_X_Y(f):


"""
Wrapper for f(X) -> f(X[0], X[1])
"""
return lambda X:array(f(X[0],X[1]))
In [52]: f=func_XY_to_X_Y(f_lmbda)
fprime=func_XY_to_X_Y(fprime_lmbda)
fhess=func_XY_to_X_Y(fhess_lambda)
In [53]: x_opt=fmin_ncg(f,[0,0],fprime=fprime,fhess=fhess)
x_opt1=optimize.fmin_bfgs(f, (0, 0))
Optimization terminated successfully.
Current function value: -3.867223
Iterations: 8
Function evaluations: 10
Gradient evaluations: 17
Hessian evaluations: 8
8

Optimization terminated successfully.


Current function value: -3.867223
Iterations: 10
Function evaluations: 56
Gradient evaluations: 14

In [54]: x_opt.tolist(),x_opt1.tolist()
Out[54]:

([1.882926129296321,

1.3765852258592641] ,

[1.8829260403989003,

1.3765852205473148])

In [69]: fig, ax = plt.subplots(figsize=(6, 4))


x_ = y_ = linspace(-1, 4, 100)
X, Y = np.meshgrid(x_, y_)
c = ax.contour(X, Y, f_lmbda(X, Y), 50)
ax.plot(x_opt[0], x_opt[1], 'r*', markersize=15)
ax.set_xlabel(r"$x_1$", fontsize=18)
ax.set_ylabel(r"$x_2$", fontsize=18)
plt.colorbar(c, ax=ax)
show()
<IPython.core.display.Javascript object>

<IPython.core.display.HTML object>

In [56]: fig, ax = plt.subplots(figsize=(6, 4))


x_ = y_ = linspace(-1, 4, 100)
X, Y = np.meshgrid(x_, y_)
c = ax.contour(X, Y, f_lmbda(X, Y), 50)
ax.plot(x_opt1[0], x_opt1[1], 'r*', markersize=15)
ax.set_xlabel(r"$x_1$", fontsize=18)
ax.set_ylabel(r"$x_2$", fontsize=18)
plt.colorbar(c, ax=ax)
show()
<IPython.core.display.Javascript object>

<IPython.core.display.HTML object>

In [57]: x=x0,x1,x2,l=symbols('x_0 x_1 x_2 lambda')


x=[x0,x1,x2,l]
f=x0*x1*x2
f
9

Out[57]:
x0 x1 x2
In [58]: g=2*(x0*x1+x1*x2+x0*x2)-1
g
Out[58]:
2x0 x1 + 2x0 x2 + 2x1 x2 1
In [59]: L=f+l*g
L
Out[59]:
(2x0 x1 + 2x0 x2 + 2x1 x2 1) + x0 x1 x2
In [60]: grad_L=Matrix([L]).jacobian(x)
#grad_L = [diff(L, x_) for x_ in x]
grad_L
Out[60]:


(2x1 + 2x2 ) + x1 x2 (2x0 + 2x2 ) + x0 x2 (2x0 + 2x1 ) + x0 x1 2x0 x1 + 2x0 x2 + 2x1 x2 1
In [61]: sols=solve(grad_L)
sols
Out[61]:
"(

6
,
:
24

6
x0 :
,
6

6
x1 :
,
6

)
6
x2 :
,
6

6
:
,
24

6
x0 :
,
6

We can use *X to unpack the value in the given array or list.


In [62]: x=1,2,3,4,5
In [ ]:

10

6
x1 :
,
6

)#
6
x2 :
6

Potrebbero piacerti anche