• ベストアンサー

3次曲線の長さの求め方

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

質問者が選んだベストアンサー

  • ベストアンサー
  • bob
  • ベストアンサー率50% (52/103)
回答No.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です。

hasami
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.4

近似値でよければ、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を累計すれば求める長さに近い値になります。

hasami
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • nikorin
  • ベストアンサー率24% (47/191)
回答No.3

Nickeeさん、積分するの忘れてますよ。 x=aからx=bまでの曲線の長さは   b S=∫√(f'(x)^2+1)dx   a で表されます。

hasami
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • Nickee
  • ベストアンサー率15% (14/93)
回答No.2

 再度、登場 微小の斜めの長さを微小でとって、積分しなきゃいけないですね。 まちがえていました。  だから、√((3ax^2+2bx+c)^2+1)をx1からx2まで、積分すればよいのかな。 計算は複雑になるのでかきません。 補足、質問があればどうぞ。

hasami
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • Nickee
  • ベストアンサー率15% (14/93)
回答No.1

√((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) だと、おもうのですが、その逆は上の式と=で求めたい数をむすんで、計算するだけとおもいますが、 あまり、自信がないので、参考までに

すると、全ての回答が全文表示されます。

関連するQ&A