質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1081閲覧

scipyのcurve_fitについて

EKA

総合スコア27

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2022/07/13 06:11

実現したいこと

(直交座標系の)曲線に対して対数螺旋近似して、 r = e^(bθ)のbを算出したい。

前提

手元に直交座標系(2次元)の曲線があります。
これを対数螺旋(極座標系で) r = e^(bθ)に近似したいのですが、関数を直交座標系にするとf(x,y)の形にできません。
scipy.curve_fitだと直交座標系しか適用できなさそうですが、何か知見があればご教授いただけないでしょうか。
自己相似の問題もあるため 0 ≦ θ ≦ π/2で定義しようと思っています。
が、ここの実装方法も思いつかないため、scipyの近似曲線の定義域についての知見もありましたら、併せてご教授ください。

直交座標系と極座標系の変換については理解しているつもりです。

ソースコードもなく大変恐縮ですが、何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • 直交座標系の曲線データから極座標系へ変換できる
  • 角度の範囲は 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 09:25

can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

EKA

2022/07/13 23:48

ありがとうございます!まさに求めていたものだと思います! まだ完全にはフォローできていませんが、参考にさせていただきます。 教えてもらっておいて恐縮なのですが、どういうプロセスで調べると参考URLにたどり着くのでしょうか、、? 一応自分でも調べたつもりでしたが、それらしいものは見つけられなかったもので、、 ご教授いただけると幸いです。
can110

2022/07/14 00:11

対数螺旋(logarithmic spiral)のフィッティングなので 「logarithmic spiral fitting」で検索すると上位に出てきました。 ただPythonのコードではなく内容もよく分からなかったので、ある程度前提知識は必要ですが 対数螺旋に限らず一般的な非線形関数の係数算出として最小二乗法が使えるのではないかと思い Scipyでのサンプルコードを探しました。
EKA

2022/07/14 07:50

まず英語で調べた方が良いということですね、、 近似に関しても体系的な理解が足りてないことを痛感しました、、 参考にさせていただきます。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問