人に聞けない痔の悩み、これでスッキリ >>

Y=aX^3+bX^2+cX+dの3次曲線で,X1~X2間の長さ(弧長)の求め方を教えてください。また、弧長から,Xの値の求め方もお願いします(逆をやれば良いだけ?)。
生産設計のプログラムで必要になりました。30年ぶりに、数学の教科書を開きましたが、全く理解できません。宜しくお願いします。一筋縄でいかないようですが?
近似式でもかまわないのですが。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

S(x) = √( (f(x+dx) - f(x))^2 + dx^2 )


とおいて(要するに微少部分について三平方の定理)、

int step = 10000;
double dx = (X2 - X1)/step;
double sum = .0;

for( double x=X1; x<=X2; x+=dx ) {
sum += S(x);
}

のような感じで求める数値積分ができます。
(C Styleで書いてしまいましたが、まあわかりますよね。)

一般にはstepの数を大きくすると精度が上がりますが、計算機特有の誤差の問題がいろいろあるので、気をつけないと結構な誤差がたまります(これは解析的に解いた式を計算機に計算させても同様ですが)。
この辺りは経験をつむしかないので、計算機関係の本を読みながら試してみて下さい。

例えば、パラメータや積分範囲にもよるので簡単には言えませんが、
double f( double X ) {
return a*X*X*X + b*X*X + c*X + d;
}

よりも、

double f( double X ) {
return ((a*X + b)*X + c)*X + d;
}
とかにした方がいいかも。
まあ、いろいろ試して精度のいい方法を使えばOKです。
    • good
    • 0
この回答へのお礼

有難うございました。これが一番確実な方法ですね。
橋梁の生産設計に使います。誤差は、100mに対して0.5mm程度は許されますので、
理論的に正しければ、それでよしとします。
C++で構築します。

お礼日時:2001/09/19 09:06

近似値でよければ、sを適当に小さな数として、


x1 = x
x2 = x + s
y1 = a(x1)^3+b(x1)^2+c(x1)+d
y2 = a(x2)^3+b(x2)^2+c(x2)+d
l=sqrt((x2-x1)^2+(y2-y1)^2)
とすればlが微小区間xから(x+s)までの線分の長さを表わしますから、
xをX1からX2までの間で上記lを累計すれば求める長さに近い値になります。
    • good
    • 0
この回答へのお礼

有難うございました。BOBさんと同じ理論ですね。
これが確実のようです。

お礼日時:2001/09/19 09:11

Nickeeさん、積分するの忘れてますよ。


x=aからx=bまでの曲線の長さは
  b
S=∫√(f'(x)^2+1)dx
  a
で表されます。
    • good
    • 0
この回答へのお礼

有難うございます。この式を更に分解して、プログラムに組めるような方法は無いのですか?難しいようであれば、微小部に分割して求める?
宜しくお願いします。

お礼日時:2001/09/18 19:12

 再度、登場



微小の斜めの長さを微小でとって、積分しなきゃいけないですね。
まちがえていました。

 だから、√((3ax^2+2bx+c)^2+1)をx1からx2まで、積分すればよいのかな。
計算は複雑になるのでかきません。
補足、質問があればどうぞ。
    • good
    • 0
この回答へのお礼

有難うございます。これって相当難しいみたいですね。

お礼日時:2001/09/18 19:04

√((dy/dx)^2+(dy/dy)^2


の公式を使えばいいような気がするのですが、

dy/dx=3ax^2+2bx+c で領域はx1~x2
dy/dy=1
よって、√((3ax1^2+2bx1+c)-(3ax2^2+2bx2+c)+1)

だと、おもうのですが、その逆は上の式と=で求めたい数をむすんで、計算するだけとおもいますが、

あまり、自信がないので、参考までに
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qベジェ曲線(3次関数)の長さ

ベジェ曲線(3次関数)の長さを求めようと思っています。

p,q,r,sを位置ベクトルとする。
ベジェ曲線(p-q-r-s)の位置ベクトルbは
b=p+t(-3p+3q+t(3p-6q+3r+t(-p+3q-3r+s))) (定義域0≦t≦1)

例えば4点(10,20)-(20,40)-(80,10)-(50,80)で表現されるベジェ曲線は
bx=-140(t^3)+150(t^2)+30t+10
bx=150(t^3)-150(t^2)+60t+20
となります

この曲線の長さを求める式を教えてください。

Aベストアンサー

参考までに
bx=f(t)=-140(t^3)+150(t^2)+30t+10
by=g(t)=150(t^3)-150(t^2)+60t+20
として
Lの式を計算すると
L=∫[0,1]10√{225(t^6)-450(t^5)+2169(t^4)-2640(t^3)+624(t^2)+204t+13}dt (0<=x<=1)}dt
となります。この定積分を解析に計算する事は困難なので、数値積分して求めないといけませんね。
数値積分した結果は
L≒71.466
となりました。

Q曲線の長さ

平面上の曲線の任意の区間の長さを求める場合、
区間を細分化し直線や二次曲線で近似して総和を求める方法以外に 何か他の方法はありませんでしょうか。

Aベストアンサー

 例えば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を使った区分求積法をやるだけの事ですから、特に問題はない。「答えが出なくなってしまう」なんてこと、全然ありません。

 するってえと、この積分を解析的に解こうとすると一筋縄ではいかない、ということが問題なんでしょうか?

 例えば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...続きを読む

QBezier曲線の曲線長

3次のBezier曲線の曲線長を求めたいのですが、
なにぶん数学が苦手でして困っています。
長さを求めるには数値積分を行わないといけないと思うのですが、
どうも計算でつまづいてしまいます。
(シンプソンの公式を使おうと思ったのですが、行き詰まりました。)
どなたか良い解法をお教え下さい。お願いします。
最終的にはCでプログラミングしたいので、
それを踏まえた形で教えて頂ければ感謝感激です。。

Aベストアンサー

こちら↓は参考になりませんか?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=121473

Q弧長パラメータとは何?

弧長パラメータは、長さ関数の逆関数によってパラメータ変換することによって得られるそうですが、何故そうやって求められるのでしょうか?そもそも、弧長パラメータの概念が今一つ分からないです。

例えば、
x(t)=(asint,acost,bt)
の曲線があるとして、
これの長さ関数は
x'(t)=(acost,-bsint,0)より
int(0,t)||(x'(t))||dt
=int(0,t)sqrt(a^2+b^2)dt
=sqrt(a^2+b^2)t
より、t=x/sqrt(a^2+b^2)
ですから、x(t)の弧長パラメータ表示関数は、
x(s)=(asin(a/sqrt(a^2+b^2)),acos(s/sqrt(a^2+b^2)),
bs/sqrt(a^2+b^2))
となると解釈して宜しいのでしょうか?

分かる方がいましたら、回答宜しくお願いします。

Aベストアンサー

#1のKENZOUです。パソコンの調子がおかしくなり(←今もおかしいので古いのを使っている),レスが遅れました。

>長さ関数=弧長パラメータということでしょうか?
その通りと思います。
物理的イメージから迫って見ましょう。
 r(t)=(x(t),y(t),z(t))
を時間tのときの点の位置を表す位置ベクトルとしますと,それを時間で微分したdr/dtは点の速度ベクトルとなります。
 dr/dt=(dx/dt,dy/dt,dz/dt)
この点の軌跡の長さはt=0からt=tまでの間に動いた距離ですからそれをsとすると
 s=∫[0,t]|dr/dt|dt
つまりsはtの関数となります(←当たり前か)。時間tと共に距離sは(途中で止まることが無ければ)単純に増加していきますので,sはtの単調増加関数ということになり,tをsの関数として書くことが可能ですね。この結果
 r=r(t)=r(s)=r(x(s),y(s),z(s))
と表すことができます。つまり曲線rをパラメータsを使って表すことになりますので,このsを孤長パラメータと呼んでいます。

>tの関数をsの関数に変換したといったことになるのでしょうか?
仰る通りと思います。

#1のKENZOUです。パソコンの調子がおかしくなり(←今もおかしいので古いのを使っている),レスが遅れました。

>長さ関数=弧長パラメータということでしょうか?
その通りと思います。
物理的イメージから迫って見ましょう。
 r(t)=(x(t),y(t),z(t))
を時間tのときの点の位置を表す位置ベクトルとしますと,それを時間で微分したdr/dtは点の速度ベクトルとなります。
 dr/dt=(dx/dt,dy/dt,dz/dt)
この点の軌跡の長さはt=0からt=tまでの間に動いた距離ですからそれをsとすると
 s=∫[0,t]...続きを読む


人気Q&Aランキング