Numpy の ndarray の応用

import numpy as np
import matplotlib.pyplot as plt
import scienceplots
#Warning : As of version 2.0.0, you need to add import scienceplots before setting the style (plt.style.use('science')).
plt.style.use(['science', 'notebook'])

プロット

$y = e^{-x/20} \sin x$を求めると,
n = 1001
x = np.linspace(0,50,n)
y = np.exp(-x/20)*np.sin(x)
x,y
(array([ 0.  ,  0.05,  0.1 , ..., 49.9 , 49.95, 50.  ]),
 array([ 0.        ,  0.04985438,  0.0993355 , ..., -0.02948423,
        -0.02553269, -0.02153704]))
fig = plt.figure()
plt.plot(x,y)
fig.savefig("plot_ex4.pdf")

区間$[10,11]$のyの値を出力する場合,
y[(x>=1)*(x<=2)]
array([0.80043196, 0.82305828, 0.84351453, 0.86176042, 0.87776136,
       0.89148855, 0.90291902, 0.91203567, 0.91882724, 0.92328835,
       0.92541948, 0.92522691, 0.92272273, 0.91792472, 0.91085631,
       0.90154649, 0.89002972, 0.87634578, 0.86053969, 0.84266153,
       0.82276634])
最大値の値とインデックスは,
np.max(y) # 最大値
0.9254194764672986
x[np.argmax(y)] # 最大値のインデックス
1.5
微分は,
dydx = np.gradient(y, x) # 数値微分
プロットして,
fig = plt.figure()
plt.plot(x,dydx)
fig.savefig("plot_ex5.pdf")

次のようにすれば,if文やfor ループなしで計算することもできる.
mask = y[1:]*y[:-1]<0
x[1:][mask]
array([ 3.15,  6.3 ,  9.45, 12.6 , 15.75, 18.85, 22.  , 25.15, 28.3 ,
       31.45, 34.6 , 37.7 , 40.85, 44.  , 47.15])
引数 $x$, $y$ を省略した場合は、条件を満たす要素のインデックス(位置)を返す。
np.where(y[1:]*y[:-1]<0)
(array([ 62, 125, 188, 251, 314, 376, 439, 502, 565, 628, 691, 753, 816,
        879, 942]),)
x[1:][dydx[1:]*dydx[:-1]<0]
array([ 1.55,  4.7 ,  7.85, 10.95, 14.1 , 17.25, 20.4 , 23.55, 26.7 ,
       29.8 , 32.95, 36.1 , 39.25, 42.4 , 45.55, 48.65])
np.where(dydx[1:]*dydx[:-1]<0)
(array([ 30,  93, 156, 218, 281, 344, 407, 470, 533, 595, 658, 721, 784,
        847, 910, 972]),)