Python で解く常微分方程式とグラフ
numpy と matplotlib.pylot の import を行っておく。
>>> import numpy
>>> import matplotlib.pyplot as plt
□ 関数の定義と作図
>>> def f(x):
return(x**2 - 4*x + 6)
>>> f(2)
>>> f(numpy.array([2, 3]))
>>> t = numpy.linspace(1, 3, 101)
>>> plt.plot(t, f(t))
>>> plt.grid('on')
>>> plt.show()
>>> t = numpy.logspace(-1, 2, 100)
>>> plt.semilogx(t, f(t))
>>> plt.grid('on')
>>> plt.show()
>>> plt.semilogy(t, f(t))
>>> plt.grid('on')
>>> plt.show()
>>> plt.loglog(t, f(t))
>>> plt.grid('on')
>>> plt.show()
□ 常微分方程式の解
x'' + 4*x' + 13*x = 0, x'(0) = 1, x(0) = 1
の解を求める.一階の常微分方程式に書き改めると次のようになる.
x1' = x2
x2' = -4*x2 - 13*x1
微分方程式の数値階の計算には scipy.integrate.odeint を用いるため、
import しておく。
>>> from scipy.integrate import odeint
>>> def xdot(x, t):
return (x[1], -4*x[1] - 13*x[0])
>>> x0 = numpy.array([1, 1])
>>> t = numpy.linspace(0, 4, 1000)
>>> y = odeint(xdot, x0, t)
>>> plt.plot(t, y)
>>> plt.grid('on')
>>> plt.show()
>>> plt.plot(t, y[:, 0])
>>> plt.grid('on')
>>> plt.show()
>>> plt.plot(t, y[:, 1])
>>> plt.grid('on')
>>> plt.show()
>>> plt.plot(y[:, 0], y[:, 1])
>>> plt.grid('on')
>>> plt.show()
強制振動系
x'' + 2*x' + (4*π)^2*x = sin(4πt), x'(0) = 0, x(0) = 0
の解を求める.一階の常微分方程式に書き改めると次のようになる.
x1' = x2
x2' = -2*x2 - (4*π)^2*x1 + sin(4πt)
>>> def xdot(x, t):
return (x[1], \
-2*x[1] - (4*numpy.pi)**2*x[0] + numpy.sin(4*numpy.pi*t))
>>> x0 = numpy.array([0, 0])
>>> t = numpy.linspace(0, 4, 1000)
>>> y = odeint(xdot, x0, t)
>>> plt.plot(t, y)
>>> plt.grid('on')
>>> plt.show()
>>> plt.plot(y[:, 0], y[:, 1])
>>> plt.grid('on')
>>> plt.show()
□ 3次元プロット
mpl_toolkits.mplot3d.Axes3 を使うので、import する。
>>> from mpl_toolkits.mplot3d import Axes3D
0 ≦ x ≦ 4 and 0 ≦ y ≦ 4 での sin(x)*sin(y) の図
>>> x = numpy.linspace(0, 4, 40)
>>> y = x
>>> X, Y = numpy.meshgrid(x, y)
>>> Z = numpy.sin(X)*numpy.cos(Y)
>>> fig = plt.figure(figsize = (8,8))
>>> ax = fig.add_subplot(111, projection='3d')
>>> ax.plot_surface(X, Y, Z)
>>> plt.show()
-π ≦ x ≦ π and -π/2 ≦ y ≦ π/2 での sin(x*y) の図
>>> x = numpy.linspace(-numpy.pi, numpy.pi, 40)
>>> y = numpy.linspace(-numpy.pi/2, numpy.pi/2, 40)
>>> X, Y = numpy.meshgrid(x, y)
>>> Z = numpy.sin(X * Y)
>>> fig = plt.figure(figsize = (8,8))
>>> ax = fig.add_subplot(111, projection='3d')
>>> ax.plot_surface(X, Y, Z)
>>> plt.show()
Python で数値計算
naniwa@rbt.his.u-fukui.ac.jp