定積分の定義方法はリーマン積分やルベーグ積分など複数存在しますが、以下ではリーマン積分(Riemann integral)の考え方について詳しく見ていきます。
区間 $[a,b]$ を、
$$ a=x_0<x_1<x_2<\cdots<x_{n-1}<x_n=b $$によって $n$ 個の小区間 $[x_0,x_1],[x_1,x_2],\ldots,[x_{n-1},x_n]$ に分割します。
各 $i=1,\ldots,n$ に対して点 $t_i\in[x_{i-1},x_i]$ を与えるとき、
$$ \sum_{i=1}^n f(t_i)(x_i-x_{i-1}) $$を $f$ の考えている点付き分割に関するリーマン和(Riemann sum)と呼びます。下図のように、リーマン和は長方形の面積の和に相当します。
特に、各 $t_i$ を小区間の左端に取る(すなわち $t_i=x_{i-1}$ である)場合のリーマン和を左リーマン和、小区間の右端に取る(すなわち $t_i=x_i$ である)場合のリーマン和を右リーマン和と呼びます。
関数 $f$ が単調増加であるならば、左リーマン和は求める面積の下界、右リーマン和は求める面積の上界を与えます。
$n\to\infty$ としたときに点付き分割の取り方によらずにリーマン和が一定の値に収束するとき、その極限の値を関数 $f$ の区間 $[a,b]$ におけるリーマン積分と呼びます。
ここでは、上記の「単調増加関数に対する左リーマン和と右リーマン和の性質」を利用して、定積分の近似計算を行います。
例として、関数 $f(x)=\sqrt{x}+1$ の区間 $[0,1]$ における定積分を考えます。明らかに、$f$ は $[0,1]$ において単調増加です。
まず、$f(x)$ を計算する関数f(x)
および $f$ の $[0,1]$ におけるグラフを描画する関数draw_f()
を定義します。
import math
import matplotlib.pyplot as plt
def f(x):
return math.sqrt(x)+1
def draw_f():
x_list = []
y_list = []
for i in range(201):
x = i/200
x_list.append(x)
y_list.append(f(x))
plt.plot(x_list,y_list,"k-")
#後の都合のため、plt.show()は関数定義に含めない
draw_f() #関数draw_f()を呼び出してグラフを描画する
plt.show()
次に、分割数 $1$ の等分割(すなわち、$[0,1]$ のまま)に関する左リーマン和と右リーマン和を考えます。
このときの左リーマン和に対応する図は、次のようになります。
draw_f()
plt.fill([0,1,1,0],[0,0,f(0),f(0)],"r",alpha=0.5)
#点(0,0),(1,0),(1,f(0)),(0,f(0))で囲まれる領域を赤色(不透明度0.5)で塗りつぶす
plt.show()
ここで、関数plt.fill
は
plt.fill(x_list,y_list,色を表す文字列,alpha=不透明度)
のように使用し、x_listとy_listが表す複数の点によって囲まれる領域を指定の色と不透明度(0~1)で塗りつぶすことができます。ただし、点の順番には注意が必要であり、順番通りに線分で結んでできる領域の塗りつぶしになります。
左リーマン和の値はこの赤色の領域の面積に等しいので、次のように求まります。
print("分割数1の等分割に関する左リーマン和の値は",f(0)*1)
分割数1の等分割に関する左リーマン和の値は 1.0
右リーマン和に対応する図は、次のようになります。
draw_f()
plt.fill([0,1,1,0],[0,0,f(1),f(1)],"g",alpha=0.5)
#点(0,0),(1,0),(1,f(1)),(0,f(1))で囲まれる領域を緑色(不透明度0.5)で塗りつぶす
plt.show()
右リーマン和の値はこの緑色の領域の面積に等しいので、次のように求まります。
print("分割数1の等分割に関する右リーマン和の値は",f(1)*1)
分割数1の等分割に関する右リーマン和の値は 2.0
同様にして、分割数 $2$ の等分割に関する左リーマン和と右リーマン和を考えると、次のようになります。
draw_f()
plt.fill([0,1/2,1/2,0],[0,0,f(0),f(0)],"r",alpha=0.5)
plt.fill([1/2,1,1,1/2],[0,0,f(1/2),f(1/2)],"r",alpha=0.5)
plt.show()
print("分割数2の等分割に関する左リーマン和の値は",f(0)*(1/2)+f(1/2)*(1/2))
分割数2の等分割に関する左リーマン和の値は 1.3535533905932737
draw_f()
plt.fill([0,1/2,1/2,0],[0,0,f(1/2),f(1/2)],"g",alpha=0.5)
plt.fill([1/2,1,1,1/2],[0,0,f(1),f(1)],"g",alpha=0.5)
plt.show()
print("分割数2の等分割に関する右リーマン和の値は",f(1/2)*(1/2)+f(1)*(1/2))
分割数2の等分割に関する右リーマン和の値は 1.8535533905932737
関数 $f(x)=\sqrt{x}+1$ に対して、区間 $[0,1]$ の分割数 $3$ の等分割に関する左リーマン和と右リーマン和を考えます。
それぞれに対応する図を描画した上で値を求めるコードを書いてください。
#演習1のコード
import math
import matplotlib.pyplot as plt
def f(x):
return math.sqrt(x)+1
def draw_f():
x_list = []
y_list = []
for i in range(201):
x = i/200
x_list.append(x)
y_list.append(f(x))
plt.plot(x_list,y_list,"k-")
#ここに、コードを書く
関数 $f(x)=\sqrt{x}+1$ に対して、区間 $[0,1]$ の分割数 $n$ の等分割に関する左リーマン和と右リーマン和を考えます。
左リーマン和に対応する図を描画する関数draw_left_RS(n)
、左リーマン和の値を返す関数calc_left_RS(n)
、右リーマン和に対応する図を描画する関数draw_right_RS(n)
、右リーマン和の値を返す関数calc_right_RS(n)
を定義してください。
$n=4$ の場合に、定義したそれぞれの関数を呼び出してください。
#演習2のコード
import math
import matplotlib.pyplot as plt
def f(x):
return math.sqrt(x)+1
def draw_f():
x_list = []
y_list = []
for i in range(201):
x = i/200
x_list.append(x)
y_list.append(f(x))
plt.plot(x_list,y_list,"k-")
def draw_left_RS(n):
draw_f()
#ここに、関数の処理を書く
plt.show()
def calc_left_RS(n):
value = 0
#ここに、関数の処理を書く
return value
def draw_right_RS(n):
draw_f()
#ここに、関数の処理を書く
plt.show()
def calc_right_RS(n):
value = 0
#ここに、関数の処理を書く
return value
n = 4
draw_left_RS(n)
print("分割数",n,"の等分割に関する左リーマン和の値は",calc_left_RS(n))
draw_right_RS(n)
print("分割数",n,"の等分割に関する右リーマン和の値は",calc_right_RS(n))
関数 $f(x)=\sqrt{x}+1$ に対して、区間 $[0,1]$ の分割数 $n$ の等分割に関する左リーマン和と右リーマン和を考えます。
右リーマン和と左リーマン和の差が $0.01$ より小さくなるような最小の $n$ を求めるコードを書いてください。
また、定積分 $\int_0^1 \left(\sqrt{x}+1\right)\,dx$ の値を手計算で求め、上記の $n$ に対する左リーマン和および右リーマン和の値と比較して考察してください。
#演習3のコード
演習1~演習3に取り組んでください。