中心差分を用いた接線の交点の求め方とPythonのライブラリであるmatplotlibによる可視化
この記事は、Qiitaにも投稿してます!!
詳しくは下のリンクから↓
はじめに
様々な関数の任意の2点の接線の交点を求めると面白そうだったので、2つの接線の交点のx座標とy座標の式を求めました。
また、Pythonのライブラリである matplotlib
を用いて関数のグラフ、任意の2点を通る2つの接線、2つの接線の交点を描画しました。
よろしければこちらもどうぞ!!
マイページについて
X(Twitter)について
Qiitaについて
実行環境
実行環境は次の通りです。
実行環境
-
環境
Windows 10
Python 3.10.5
-
ライブラリ
matplotlib 3.6.1
接線の交点の座標の求め方
微分係数を用いた接線の公式は、任意の
また任意の
これらの値から
ここで、新たに任意の
よって、
また、
一方で、
よって、
したがって、
微分係数の求め方
ここで、微分係数の定義式を考えると、
であり、hを0に近づけるという極限操作をしなければなりません。しかし、コンピュータ上では極限操作を行うことができません。
そこで、数値微分を行うことで近似的に微分係数を計算しました。
数値微分における3つの差分とその誤差についてを参照すると、
中心差分が最も接線の傾きに近い
らしいので中心差分を用いて微分係数を求めることにしました。ちなみに、中心差分は以下の式で求められるそうです。
ソースコード
実行環境で示した環境で実行すればおそらく動くはず。
ソースコード
#任意の関数の二接線の交点の座標を算出
#ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
#中心差分の式のhを定義
h = 10**(-4)
#aとbを定義
a = -2
b = 2
x = np.linspace(-10,10,1001) #xの値を定義
'''接線の交点を求めたい関数の宣言
本コードでは
y=x^2
とした'''
def func(x):
return x**2
#定義したa,bでの微分係数の計算
dydx_a = (func(a+h)-func(a-h))/(2*h) #x=aでの微分係数
dydx_b = (func(b+h)-func(b-h))/(2*h) #x=bでの微分係数
y_a = dydx_a*x-dydx_a*a+func(a) #x=aでの接線の計算
y_b = dydx_b*x-dydx_b*b+func(b) #x=bでの接線の計算
'''交点のx座標を計算
f(b)-f(a)-f'(b)b+f'(a)a
x_交点 = ----------------------
f'(a)-f'(b)
'''
x_inter = (func(b)-func(a)-dydx_b*b+dydx_a*a)/(dydx_a-dydx_b)
'''交点のy座標を計算
(a-b)f'(a)f'(b)+f'(a)f(b)-f'(b)f(a)
y_交点 = -----------------------------------
f'(a)-f'(b)
'''
y_inter = ((a-b)*dydx_a*dydx_b+dydx_a*func(b)-dydx_b*func(a))/(dydx_a-dydx_b)
#print("f(a) = {:.3f}".format(func(a))) #コメントアウトを外すとx=aでのy座標が出力される
#print("f'(a) = {:.3f}".format(dydx_a)) #コメントアウトを外すとx=aでの微分係数が出力される
#print("f(b) = {:.3f}".format(func(b))) #コメントアウトを外すとx=bでのy座標が出力される
#print("f'(b) = {:.3f}".format(dydx_b)) #コメントアウトを外すとx=bでの微分係数が出力される
#print("x_inter = {:.3f}".format(x_inter)) #コメントアウトを外すと2つの接線の交点のx座標が出力される
#print("y_inter = {:.3f}".format(y_inter)) #コメントアウトを外すと2つの接線の交点のy座標が出力される
#print("(%f,%f)" % (x_inter,y_inter)) #コメントアウトを外すと2つの接線の交点の座標が出力される
plt.xlim(-10,10) #x軸の表示範囲を制限
#plt.ylim(0,2) #y軸の表示範囲を制限
plt.plot(x,func(x)) #任意の関数のグラフを描画
plt.plot(x,y_a) #任意の関数のx=aでの接線を描画
plt.plot(x,y_b) #任意の関数のx=bでの接線を描画
plt.scatter(x_inter,y_inter) #2つの接線の交点を描画
#plt.plot(x,np.zeros(len(x))) #コメントアウトを外すとx=0の直線を描画
plt.show()
結果
ソースコードを実行した結果は次の通りです。
実行結果のグラフ
グラフ
実行結果のコマンドプロンプト上の表示
計算結果
まとめ
関数の任意の2点の接線の交点のPython
のライブラリである matplotlib
を用いて接線の交点を描画しました。
この記事が実際に役に立つかどうかは分からないですが、誰かの役に立ってくれると嬉しいです。
記事を執筆する余力があれば、次回も記事を投稿する予定です。
次回の予定としては、中心差分を用いて画像の画素ごとの微分を行ってその結果をPythonのライブラリであるOpenCV
を用いて表示させたのでそれに関する記事を投稿する予定です。
Discussion
質問があれば、Qiitaのコメント欄にて!!
可能な限り答えます。