- 直交座標系の曲線データから極座標系へ変換できる
- 角度の範囲は 0 ≦ θ ≦ π/2 限定
という制限内であれば、非線形最小二乗法にて極座標系での近似曲線の係数を求めることができそうです。
以下のテストコードでは、直交座標系の曲線データの極座標系での中心は既知(=原点)であるとしています。
参考:scipy.optimize.minimizeの使い方
なお、以下は参考まで。
Fit logarithmic spiral to x,y data
MATHEMATICAでそのものズバリの関数を作成している方がいるようです。ソースも探せばどこかにありそうです。
Fitting parametric Spiral Function to Data Points
これもMATLABでちゃんと読めてませんが、おそらく原点や角度の制限なく求める方法について記載されています。
Python
1import numpy as np
2import scipy.optimize as optimize
3import matplotlib.pyplot as plt
4
5# 対数螺旋
6def func(t,b):
7 return np.exp(b*t)
8
9# residual function
10def ls_res(param,t,r):
11 residual = r - func(t,param[0])
12 return residual
13
14np.random.seed(110)
15
16# 理想値:極座標
17bi = 0.123
18ti = np.radians(np.arange(0,90,1))
19ri = func(ti,bi)
20# 理想値:直交座標
21xyi = np.array((np.sin(ti)*ri,np.cos(ti)*ri)).T
22
23# 観測値:直交座標
24xyo = xyi * (0.2*np.random.rand(*xyi.shape)+0.9) # 少し乱す
25
26# 観測値を極座標に
27ro = np.sqrt((xyo**2).sum(axis=1))
28to = np.arctan2(xyo[:,0],xyo[:,1])
29
30# 係数を求める
31para = [0]
32le_lsq = optimize.leastsq(ls_res, para, args=(to,ro))
33bo = le_lsq[0][0]
34
35print(bi, bo)
36
37plt.plot(xyi[:,0], xyi[:,1])
38plt.plot(xyo[:,0], xyo[:,1])
39plt.savefig('ret.png')

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/13 23:48
2022/07/14 00:11
2022/07/14 07:50