- ベストアンサー
曲線の長さ
平面上の曲線の任意の区間の長さを求める場合、 区間を細分化し直線や二次曲線で近似して総和を求める方法以外に 何か他の方法はありませんでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
例えば2次元ユークリッド平面上の三次ベジェ曲線上の点の座標(x,y)は、パラメータt∈[0,1]を用いて x(t) = Px[1] ((1-t)^3) + 3Px[2] ((1-t)^2) + 3 Px[3] (1-t)(t^2) + Px[4] (t^3) y(t) = Py[1] ((1-t)^3) + 3Py[2] ((1-t)^2) + 3 Py[3] (1-t)(t^2) + Py[4] (t^3) と表せます。ここに(Px[1],Py[1]),....,(Px[4],Py[4])は「アンカー」の座標です。 で、この曲線のながさ(「みちのり」と言います)は L=∫{t=0~1} √((dx/dt)^2 + (dy/dt)^2) dt で与えられます。 dx/dt = -3 Px[1] ((1-t)^2) - 6Px[2] (1-t) + 3 Px[3] (2- 3t) + 3Px[4] (t^2) dy/dtもおんなじことですね。 結局 L=∫{t=0~1} √(At^4+Bt^3+Ct^2+Dt+E) dt という形に整理できます。数値計算をするのなら、∫dtの代わりにΣΔtを使った区分求積法をやるだけの事ですから、特に問題はない。「答えが出なくなってしまう」なんてこと、全然ありません。 するってえと、この積分を解析的に解こうとすると一筋縄ではいかない、ということが問題なんでしょうか?
その他の回答 (4)
- stomachman
- ベストアンサー率57% (1014/1775)
桁落ち?それはまともに端から累計していく場合に起こり得ますね。 A+B (|A|>|B|)という足し算において桁揃えをする際に、もし|B|がAの丸め誤差以下であると、答はA+B=Aになってしまって、Bが無視される。この現象のことですね。 それを避けるには、部分和を作りながら足していくのが有効です。 どの部分和もだいたい同じ位の大きさの値になるようにするのが理想的ですが、簡単にやるなら、区間の数Kを2の冪乗にしておき(つまりK=2^M) S=Σ{k=1,...,2^P} a[k] を求めるのに a[1,n]=a[2n-1]+a[2n] (n=1,2,...,2^(M-1)) a[m,n]=a[m-1,2n-1]+a[m-1,2n] (n=1,2,...,2^(M-m)) とすればm=Mになると a[M,n] = a[M-1,2n-1]+a[M-1,2n] (n=1) となって、 S=a[M,1] ですね。こういう風にやると、足し算する二つの数の絶対値は大体同じ位の大きさになるので、桁落ちが生じにくくなります。 丸め誤差を避けるためには、もう一つ重要なポイントがあります。 必ず計算精度(有効桁数)を変えて2度計算して、両者の答が(予想される誤差の範囲内で)合うことを確認して下さい。 もし答が合えば、有効桁数の少ない方の計算で既に丸め誤差が問題になっていないことが分かります。 しかしもし合わない場合には、有効桁数の少ない方が誤っていることは勿論、有効桁数の多い方だってまだ桁数が足りない可能性がある訳です。
お礼
解決しました。 失礼な文章があったにもかかわらず再度回答いただき本当にありがとうございました。
- stomachman
- ベストアンサー率57% (1014/1775)
> 確かに出ますよね(苦笑) どういう意味でしょうね。 どうやら数値計算をやりたいだけのようですから、あとは区分求積法の意味をご理解になれば解決だと思うんですがね。 「直線近似」なる方法(どんな数学者に訊いたって知らんと言うと思いますけど)が区分求積法と違うと仰るのなら、その内容を補足してくださいな、苦笑する前にね。
お礼
最初に答えが出ないと書いたのは・・ 計算上では「答え」は出るのですが、それをプログラムとして組み込むと使えないものもあります。 曲線を分割して弧の長さを求めた場合、プログラムの中で使うと桁落ちしてしまう可能性があるのです。 「区分求積法」をそのようなやり方だと思っていまして・・なにせ専門外なので・・妙な質問の仕方しかできず 気を悪くされたようですいません。
- siegmund
- ベストアンサー率64% (701/1090)
状況がよくつかめないんですが... フラクタル曲線みたいなものは別にして, 解析的な式で書けている限り,y = f(x) 型なら私が書いた式, あるいはパラメーター表示なら stomachman さんが書かれた式で 曲線の長さが厳密に表現できます. 確かに微小範囲 x~x+Δx 間で直線近似していますが, Δx→0 の極限をとっていますので,積分形にした表現は厳密です. 積分が解析的にできなければ,数値積分で必要なだけ精度を上げられます. 本質的に stomachman さんの趣旨と同じことです. 状況をもっと具体的に書かれた方が,回答しやすいと思いますよ. 所詮専門外ですので,私がわかるとは限りませんが...
お礼
回答ありがとうございます。 プログラムの中で使うベジェの式なのです。 近似で答えは出るのですが「細分化」しない方法を要求されておりまして・・ 色々調べてみましたが「直線近似」以外では求められないようでした。 ありがとうございました。
- siegmund
- ベストアンサー率64% (701/1090)
y= f(x) の形で,曲線の関数形がわかっているんでしょうか? わかっているなら,x1~x2 の間の長さは (1) ∫_{x1}^{x2} √{ 1 + (dy/dx)^2 } dx ですが.... 円のように同じ x の値に対して y が2つ以上あるなら, 部分部分に分けて別々に長さを計算する必要があります.
お礼
早速の回答ありがとうございます。 しかしながら・・それじゃダメなのです・・・・・ 何故かと言うとその式は結局、直線近似を積分しているのでベジェの式を展開してその式にあてはめると、答えが出なくなってしまうのです。 やはり直線近似しか方法はないのですかね・・
補足
確かに出ますよね(苦笑) この式「L=∫{t=0~1} √(At^4+Bt^3+Ct^2+Dt+E) dt」 は結局「t」の値を細分化して積分してるんですよね? この式で計算すると直線近似とどのくらいの精度が違うものなんでしょうか?