Cauchyの積分定理というのは以下の通りです。
下図はZIPでダウンロードできるcurve2num.xlsmのSheet2になりますが、今回用いる積分経路はこの閉曲線\(C\)です。「4.1 フリーハンド曲線の頂点の座標取得」で紹介したVBAマクロ「Sub 第1曲線頂点()」をそのまま使って頂点の座標を取得しています。ここでは、被積分関数
画像を新しいタブで開くと高解像度で見ることができます。
式\eqref{e}の \(f(z)\) は原点においてのみ微分できません。従って、内側に原点を含まない閉曲線\(C\)に沿って積分すれば、結果は0になるはずです。この複素数値積分をするPythonプログラムは以下の通りです。基本的にはcplx_intgrl_2.pyと同じ構成ですが、積分経路が一つだけなので変数mに対するループはありません。それ以外の変更点は、4行目でsheet2を参照しており、21行目の被積分関数が式\eqref{e}になっていることです。26行目にある計算結果を見ると有効数字8~9桁で0 + 0jとなっており、Cauchyの積分定理通りになっています。
コードの表示にはPrism.jsを使用しています。
import openpyxl
wb = openpyxl.load_workbook('(path to the xlsm file)/curve2num.xlsm')
sheet = wb['Sheet2']
i0 = 12
div = 1000
vertNum = sheet.cell(row=1, column=i0+2).value
vertArX = []
vertArY = []
for n in range(vertNum):
vertArX.append(sheet.cell(row=n+3, column=i0+1).value)
vertArY.append(sheet.cell(row=n+3, column=i0+2).value)
Sum = 0. + 0.j
for k in range(vertNum - 1):
z1 = complex(vertArX[k], vertArY[k])
z2 = complex(vertArX[k+1], vertArY[k+1])
for p in range(div):
z3 = z1 + (z2 - z1) * (0.5 + p) / div
Sum += (1 / z3) * (z2 - z1) / div
print(f"{Sum.real:.10f} + {Sum.imag:.10f}j")
# ----- Output -----
# -0.0000000096 + -0.0000000359j
Cauchyの積分公式というのは以下の通りです。
積分経路には5節の閉曲線\(C\)を用いるので、その内側にある点を選んで \(z_{0} = -1 + 1j\) とします。\(f(z)\) には3節と4節で用いた式\eqref{h}を用いますが、ここに再掲します。
import openpyxl
import math
wb = openpyxl.load_workbook('(path to the xlsm file)/curve2num.xlsm')
sheet = wb['Sheet2']
i0 = 12
div = 1000
vertNum = sheet.cell(row=1, column=i0+2).value
vertArX = []
vertArY = []
for n in range(vertNum):
vertArX.append(sheet.cell(row=n+3, column=i0+1).value)
vertArY.append(sheet.cell(row=n+3, column=i0+2).value)
Sum = 0. + 0.j
z0 = complex(-1., 1.)
for k in range(vertNum - 1):
z1 = complex(vertArX[k], vertArY[k])
z2 = complex(vertArX[k+1], vertArY[k+1])
for p in range(div):
z3 = z1 + (z2 - z1) * (0.5 + p) / div
Sum += (pow(z3, 2) + 3 * z3 + 1) / (z3 - z0) * (z2 - z1) / div
print(f"Integral: {Sum.real:.10f} + {Sum.imag:.10f}j")
# Calculation for 2πj∙f(z0)
dpj_fz0 = complex(0., 2. * math.pi) * (pow(z0, 2) + 3 * z0 + 1)
print(f"2πj∙f(z0): {dpj_fz0.real:.10f} + {dpj_fz0.imag:.10f}j")
# ----- Output -----
# Integral: -6.2831852832 + -12.5663706052j
# 2πj∙f(z0): -6.2831853072 + -12.5663706144j
Cauchyの積分公式から導かれるGoursatの定理についても数値積分で確認します。Goursatの定理は以下の通りです。\(n = 0\) の時がCauchyの積分公式です(拡張された階乗の定義で \(0 \, ! = 1\))。
確認は1階微分などとケチ臭いことを言わず、2階微分にしてみます。
import openpyxl
import math
wb = openpyxl.load_workbook('(path to the xlsm file)/curve2num.xlsm')
sheet = wb['Sheet2']
i0 = 12
div = 1000
vertNum = sheet.cell(row=1, column=i0+2).value
vertArX = []
vertArY = []
for n in range(vertNum):
vertArX.append(sheet.cell(row=n+3, column=i0+1).value)
vertArY.append(sheet.cell(row=n+3, column=i0+2).value)
Sum = 0. + 0.j
z0 = complex(-1., 1.)
for k in range(vertNum - 1):
z1 = complex(vertArX[k], vertArY[k])
z2 = complex(vertArX[k+1], vertArY[k+1])
for p in range(div):
z3 = z1 + (z2 - z1) * (0.5 + p) / div
Sum += (pow(z3, 2) + 3 * z3 + 1) / pow((z3 - z0), 3) \
* (z2 - z1) / div
print(f"Integral: {Sum.real:.10f} + {Sum.imag:.10f}j")
# Calculation for 2πj
dpj = complex(0., 2. * math.pi)
print(f"2πj : {dpj.real:.10f} + {dpj.imag:.10f}j")
# ----- Output -----
# Integral: 0.0000001012 + 6.2831854978j
# 2πj : 0.0000000000 + 6.2831853072j
(以下、現在作成中・・・)