OKを、@HYRYは、ここでは主にあなたに基づいてコードスニペットです。私は成功するために必要なヒントを教えてくれました。「直角」の代わりに「クワッド」を使用してください。だから私はあなたの答えに少なくとも投票しますが、私はその話に追加したいと思います。
まず、コードは速く走っていましたが、私が過ぎた精度は5箇所ほどありませんでした。あなたの例にquadtolとopttolを追加して、直角位相と根の正確さの正確さの相互作用を説明しようとしました。私はまた、速度差を明らかにするためにデフォルトの高い公差に基づいてループを追加しました。
sinの例は、精度よりもはるかに円よりも敏感です。私はまた、弧の長さが超幾何関数によって与えられている麻痺カーブを追加しました。この例ではfsolveが失敗し、brentqでさえもこのタスクで同等かそれ以上の理由で「brentq」オプションがコメントアウトされました。
"quadrature"は遅いですが、予想される振る舞いを示しています。根の探索速度、精度、成功率は直交トレランスで変化します。
対照的に、「クワッド」は要求された公差を無視し、常により正確な答えを生成するようです。この無作為の正確さは、私の質問がもう面白いかどうかわからない例では非常に速く働くことを除いて、迷惑なものになるか、または説明を招くでしょう。ありがとう!
from scipy.integrate import quad, quadrature
from scipy.optimize import fsolve, brentq
from math import cos, sin, sqrt, pi, pow
def circle_diff(t):
dx = -sin(t)
dy = cos(t)
return sqrt(dx*dx+dy*dy)
def sin_diff(t):
dx = 1
dy = cos(t)
return sqrt(dx*dx+dy*dy)
def hypergeom_diff(t):
""" y = t^5 x = t^3 """
dx = 3*t*t
dy = 5*pow(t,4)
return sqrt(dx*dx+dy*dy)
def curve_length(t0, S, length,quadtol):
integral = quad(S, 0, t0,epsabs=quadtol,epsrel=quadtol)
#integral = quadrature(S, 0, t0,tol=quadtol,rtol=quadtol, vec_func = False)
return integral[0] - length
def solve_t(curve_diff, length,opttol=1.e-15,quadtol=1e-10):
return fsolve(curve_length, 0.0, (curve_diff, length,quadtol), xtol = opttol)[0]
#return brentq(curve_length, 0.0, 3.2*pi,(curve_diff, length, quadtol), rtol = opttol)
for i in range(1000):
y = solve_t(circle_diff, 2*pi)
print 2*pi
print solve_t(circle_diff, 2*pi)
print solve_t(sin_diff, 7.640395578)
print solve_t(circle_diff, 2*pi,opttol=1e-5,quadtol=1e-3)
print solve_t(sin_diff, 7.640395578,opttol = 1e-12,quadtol=1e-6)
print "hypergeom"
print solve_t(hypergeom_diff, 2.0,opttol = 1e-12,quadtol=1e-12)
print solve_t(hypergeom_diff, 2.0,opttol = 1e-12,quadtol=1e-6)
ちょうど状況を理解しようとしている:tは正しいですか?あなたの知られているものは、開始時刻、開始位置、終了時刻、終了カーブの長さ(t0、x0、y0、tF、S(tF)= D)です。あなたは、その変位の最終位置(xF、yF)を見つけたいと思っています。 xに明示的な関数としてカーブを書くことができますか?y = h(x)? – fraxel
こんにちはfraxel:tは、カーブをパラメータ化するダミー変数です。私は時間としてそれを考えても害はないと思う。ちなみに、私はHYRYが私のアプローチを正確に示すコードを投稿することによって私を助けたと思います。 –
しかし、あなたはtを取り除き、xで明示的な関数を得ることができますか?つまり、y = h(x)? (おそらくあなたができる)もしそうなら、私はこれを行うためのクールな方法があるかもしれません。 – fraxel