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]),)
前のページに戻る
「Python」の目次ページに戻る