PythonとSympyで重積分


ここではPythonを使った重積分について書いていきたいと思います。

基本の形


from sympy import *

x = symbols('x')
y = symbols('y')

f = x**2 + y**2 + 1

integrate(f,(x, 0, 1),(y,0,1))

因みに


x = symbols('x')
y = symbols('y')

の部分は


x = Symbol('x')
y = Symbol('y')

または


x,y = symbols('x y')

でも大丈夫です。

また以下の様に書けばz=fの曲面を描けます。

import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

x = y = np.linspace(-5,5)
X,Y = np.meshgrid(x,y)
f = X**2 + Y**2 + 1
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(1,1,1,projection="3d")
ax.plot_surface(X, Y, f)

積分領域が三角形

from sympy import *

x = symbols('x')
y = symbols('y')

f = x**2 + x*y*2 + 1

#左に書いてある変数から積分する。
integrate(f,( x, 0, 2-y),(y, 0, 2))

積分領域が扇形

from sympy import *

x = symbols('x')
y = symbols('y')

f = x**2 + y**2 + 1

#積分領域を不等式で書いてもうまくいかない。
integrate(f,(x, 0, sqrt(1-y**2)),(y,0,1))

スカラー場の面積分


\vec{r}(u,v) = ( \cos u, \sin u, v)\\
D:0 \leq u \leq \pi,~~0 \leq v \leq 1\\
におけるスカラー場~f=\sqrt{x^2+y^2+z^2}の面積分の値を求めよ。
from sympy import *

u = symbols('u')
v = symbols('v')

r =Matrix([ cos(u), sin(u), v])

A = [0]*3
A[0] = diff(r,u)[0]
A[1] = diff(r,u)[1]
A[2] = diff(r,u)[2]
B = [0]*3
B[0] = diff(r,v)[0]
B[1] = diff(r,v)[1]
B[2] = diff(r,v)[2]

C = np.cross(A,B)
print(C)
#よってAとBの外積の長さは1

#pythonはcos(u)**2+sin(u)**2=1を使ってはくれないので自分で式変形。
f = sqrt(1+r[2]**2)
integrate(f,(v, 0, 1),(u,0,pi))