• ベストアンサー

10次の多項式を求めるプログラムについて

ARMコア(32bit)を使ったCPUで多項式を求める演算をさせています(C)。 Y軸0-4095、X軸0-4095の範囲にプロットされる点が(整数値)11点で、非線形の点の集りです。多項式近似を使ってこの式を求め、求まった式に対してXに0~4095の値を代入し、4096個のY値を求めます。 絶対条件として、0≦x≦4095の範囲では、接線の傾きは必ず0よりも大です。 曲線式: y=a + bx + cx^2 + dx^3 + ex^4 + fx^5 + gx^6 + hx^7 + ix^8 + jx^9 + kx^10 算出方法は、11点の(x,y)をfloat型の配列変数を使って行列を作成し、ガウスの消去法→後退代入させて求めてます。 この中でa~kの係数は、Windows上のCで同じソースで処理させたところ、ほぼ同一の結果が出ます。 Xの値を0から4095までひとつづつ代入して求めていくY値に対して、思った精度で結果が出ません。X値が大きい所で妙な計算結果が出ます。 係数a~kを使い、エクセル上でYを計算した結果、期待通りとなります。 例) X値 エクセル結果 CPUでの結果 期待値 2962 2525.434 2526 2525 2963 2526.543 2528 2527 2964 2527.652 2527 2527 ※2963⇒2964で接線の傾きがマイナスになる → おかしい べき乗の計算は、掛算で対処しています。 float型で10乗するような計算処理をすること自体、無謀なのでしょうか?  識者の方の意見をお伺いしたく思います。

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

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.6

No.1は数値計算で展開式を計算するときの標準的手法です。 これは演算量を削減するとともにオーダーの大きく異なる数の加減算による情報落ち(情報欠落)を防止するものでもあります。 質問の曲線式を使った場合、10次の項はx=1000のとき10^30オーダーになります。各係数のオーダーが同等だと仮定すると定数項~7次項くらいまでは情報落ちでないも同然です。 No.1の式ではオーダー差が大きくならないうちに加減算することで情報落ちを少なくしています。 実のところ係数の符号が揃っていたりするとNo.1の式でも情報落ちは免れないのですが、実際は正負の係数が適当に出てきて中間結果が(最終結果に対して)あまり大きくならないようにできてます。

参考URL:
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0
scheimpflug
質問者

お礼

実際にやってみましたが、↑の補足で書いたことはまったく的違いでした。情報落ちに対し、今回の10次の計算をしようとしたら、結構複雑な処理をさせないと実現しないのですね。 和算での積み残しをちょっとずつ拾って、最後に加える操作がいるようです・・・ きっかけを見出したので、もう少し調べてみたいと思います。ありがとうございました。

scheimpflug
質問者

補足

確かに、いろんな係数を求めて、結果を出したところ、まったく情報落ちがなくなるというわけでなく、4096データのうち数パーセント程度はでてくるようです。ちょっと試しにやってみたら、20個ほど情報落ちしたものがありました。 そこで、参考書にもかいていたのですが、式の各項bx , cx^2 , dx^3などを10個のfloat型変数に格納して、値の小さいものから順次足し合わせていくほうがもっと精度があがるのではないかと考えましたが、いかがでしょうか?

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

その他の回答 (5)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.5

0.123 0.000123 どちらも、有効桁は3桁です。 これらを加算すると 0.123123 になりますが、有効桁が3桁なので 0.123 になってしまいます。 これが、#4の方の言う 「大きな数値と小さな数値を加減算しようとしたことによる情報落ち」 だと思いました。 http://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE#.E8.A8.88.E7.AE.97.E8.AA.A4.E5.B7.AE.E3.81.AE.E7.A8.AE.E9.A1.9E

scheimpflug
質問者

お礼

情報落ちでいろいろ身の回りの参考書をみてますと、たくさんのってました。 クリアに理解できました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

#2です。 有効桁を勘違いされていませんか? たとえば有効桁が7桁ということはたとえ10^100 を表すことができたとしても、 1.234567*10^100 のように意味のある数字が7桁しかないということです。 つまり、12345678 と 12345679 を区別することができません。 #1の方のおっしゃるように式を変形することで解決したのであれば、 わたしの最初考えていたオーバーフロー/アンダーフローではなく、 大きな数値と小さな数値を加減算しようとしたことによる情報落ちでは ないでしょうか。

scheimpflug
質問者

お礼

ご回答ありがとうございます。 言われてみれば、そうですね。 ぼやっと理解してましたが、ご説明でクリアになりました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

float の上下限ですが、表現形式が、IEEE 754 で、単精度(32bit)であれば、10^38 程度(2^127 程度)の表現能力しかありません。 倍精度(64bit)であれば、10^300 を超えます(2^1023 程度)

scheimpflug
質問者

お礼

ご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> float型で10乗するような計算処理をすること自体、無謀なのでしょうか?  float だと十進6~7桁しか有効桁がありませんので、オーバーフローもしくは アンダーフローが起きているということはありませんか?

scheimpflug
質問者

お礼

ご回答ありがとうございます。 有効桁7桁というのは承知していましたが、指数表示されるはずで、float型は実質的に100乗あたりまでの数値を扱えたと、認識しています。

全文を見る
すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

> y=a + bx + cx^2 + dx^3 + ex^4 + fx^5 + gx^6 + hx^7 + ix^8 + jx^9 + kx^10 曲線の式をこれで計算しているなら精度は望めません。次の式に変形して計算してください。 y=a+x*(b+x*(c+x*(d+x*(e+x*(f+x*(g+x*(h+x*(i+x*(j+x*k)))))))))

scheimpflug
質問者

お礼

ありがとうございます! 上記式であれば、先に述べた奇妙な計算結果にならず、増加傾向の値が算出されました。 でもどうしてなんでしょうか・・・ こういうやり方でやるのだ、という方法論的なものでしょうか。 あるいはもっと理論的なことがあるんでしょうか。 もし、そこらへんをご存知であれば、ご説明いただきたく思います。

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

関連するQ&A

  • 多項式

    2点(x1,y1)=(1,3),(x2,y2)=(2,6)を通り、x=1における接線の傾きがy'(1)=1であるような放物線y(x)=ax^2+bx+cを求めよ。という問題です。多項式を用いて求めるみたいんなのですがわかりません。 わかる方、やり方と答えを教えてください。 お願いします。

  • √x+√y=1とその接線

    私の頭ではわかりそうでわからないいらいらする問題です。よろしくお願いします。 曲線√x+√y=1の任意の点(α、β)での接線がx軸、y軸と交わる点をP,Qとするとき、 (1)接線の式をα、βで表せ。 y=(1-√x)の2乗として 展開するとy=1-2√x+x 導関数を求めて y’=1+1/√xこれが接線の傾きになるので 求める接線は y-β=(1+1/√x)(xーα) (2)OP+OQ=1であることを示せ。(ただしOは原点) 座標点(p、0)と(0,Q)を(1)式に代入して |OP|+|OQ|を計算すると1になると予想したのですが・・・・・。 どうしたらよいでしょうか。

  • 数学II 積分

    数学II 積分 曲線 y=x^2 + x + 1 に原点から引いた2本の接線と、この曲線で囲まれた図形の面積Sを求めよ。 接点を(a,a^2 + a + 1)とおいて接線を求めると、y=(2a + 1)x - a^2 + 1 となります。 そしてこれが原点を通るから代入して計算すると a=1,-1 とでます。 よって接線は y=3x と y=-x とでます。 y軸を基準にして左側と右側に分けて考えて S=∫[-1~0] (x^2 + 2x + 1)dx + ∫[1~0] (x^2 - 2x + 1)dx ここまでが学校で言われた説明なんですが この積分の式が理解できません。 y軸の左側と右側では、囲む接線が違うから y軸より左と右で分けて計算して足すというのはわかるんですが 例えば左側を見たとき 囲んでいるのは曲線と接線とy軸じゃないですか? 「上の式 - 下の式」を積分して出る面積は 上の式と下の式だけで囲まれた面積ではないのですか? y軸も入れて3本の式で囲まれているのにこれでいいんですか?

  • 4次多項式のグラフ

    4次多項式のグラフをEXCELで書く問題で困っています。 式と完成したグラフはあるのですが、なぜこのグラフになるのか分かりません。 式:F(t)=t^4/4-2*t^3+11*t^2/3-6*t グラフ:y軸が-100~900まで100目盛りづつ、x軸は0~10まで1目盛りづつ グラフにはF(t)とf(t)、2つのグラフがあります。 F(t)は式が与えられているのでなぜこのグラフになるのか理解できますが、f(t)は式もないしなぜこのグラフになるのかわかりません。 f(t)はF(t)のy軸と同じ値(0)から始まりy軸の200辺りで収まっています。 F(t)を計算すると F(t) x軸 0→y軸 0 x軸 1→y軸 -4.0833 x軸 2→y軸 -9.3333 x軸 3→y軸 -18.75 x軸 4→y軸 -29.333 x軸 5→y軸 -32.083 x軸 6→y軸 -12 x軸 7→y軸 51.916 x軸 8→y軸 186.66 x軸 9→y軸 425.25 x軸10→y軸 806.66 になります。 数学は得意ではないので説明が分かりにくいですが、よろしくお願いいたします。

  • 放物線 接線

    Pを放物線y=x^2上の動点とする Pにおけるこの放物線の接線とこの接線へ点A(0、a)から下ろした垂線との交点が常にx軸上にあるようにaの値を定めよ 接線の接点を(α、α^2)とおくと接線の方程式はy=2α(x-α)+α^2となって、この方程式の傾きが、Aから接線へ下ろした垂線の方程式の傾きとかけると-1になることと、x軸上に交点があるから連立方程式の解がy=0となることは分かるのですが、それをすることができません 解き方を教えてください

  • 微分方程式 接線方程式

    曲線y=f(x)が任意の点Pでの接線が x軸と交わる点をQ、y軸と交わる点をRとするときPがQRの中点である。 y=f(x)を満たす微分方程式を求める問題で 解答は 接線の方程式 y=y'(x-a)+b    (1) 点Qのとき0=y'(x-a)+b       (2) 点PはQRの中点→a=x/2 b=y/2 (3) (3)を(2)に代入して微分方程式を立てています。 なぜですか? (1)を立式した時点で傾きy'と通過する点(3)がわかるので(1)に代入しませんか?

  • 多項式の変換

    お世話になります。 多項式y=a0x^0 + a1x^1 + a2x^2 + ... + anx^nという多項式があります。(a0...anは定数) この多項式をx=の形で表現したいのですが、どういった知識またはテクニックで実現するのでしょうか? ある曲線(多項式で表現)をy=xの直線に対して線対称な曲線にしたく、このようなことを考えています。 y=x^2+1 程度のものなら x = ±√(y-1)として簡単にもとまりますが・・・ アドバイスよろしくお願いします。

  • 多項式近似

    エクセルであるデータの散布図を作りました。 ばらつきがみられたので、近似曲線をどうしようかと思ったのですが、6次の多項式近似を行ったところ、プロットした点をほぼすべて正確に通る近似曲線がひけました。 その近似式の式は y==3E-10*x^6 - 8E-08*x^5 + 8E-06*x^4 - 0.0004*x^3 + 0.0091*x^2 - 0.0695x + 0.3314 でした。 R^2も0.999でほとんど1だったので、このデータ(曲線)の式=近似曲線の式とみなしてもいいと思ったのですが、ダメなのでしょうか? 実際のデータではx=97.12561のときy=6.37なのですが、この式に代入するとy=-14になってしまいます。 なぜでしょうか? E-10というのは10^(-10)ということで正しいですよね?

  • 楕円の接線の長さに関する問題

    こんにちは。数学の問題で分からないものがあります。 (x/a)^2+(y/b)^2=1の接線がX軸、およびY軸で交わる点をA、Bとする。この時、線分ABの長さの最小値を求めよ。 という問題です。 自分が考えた解法の手順は以下のようなものです。 ・楕円との接点を(s、t)とおくと接線は「(y-t)=-(s×b^2)(x-s)/(t×a^2)」と書くことができる ・接線の式にx=0、y=0を代入すれば交点BとAを求めることができる。 ・(s、t)は楕円上の点なので(s/a)^2+(t/b)^2=1が成り立つ ・A^2+B^2を上の式を利用してsかtの式で表す ・式を変形して最小値を求める これでうまくいくと思ったのですが、非常に計算が複雑になってしまいました。 複雑すぎるので他の解法があるのかもしれないと思ったのですが、あるのでしょうか? よろしくお願い致します。

  • 多変数多項式の係数の求め方

    y  = a0 + a11*x1 + a12*x1^2 + a13*x1^3 + ・・・ + a21*x2 + a22*x2^2 + a23*x2^3 + ・・・      ・      ・ 上記のような多変数多項式の各係数をエクセル2007で求めようとしているのですが、 やり方がわかりません。 単変数や1次の多変数の係数は、LINEST関数や回帰解析ツールを使えば、 求められることが分かったのですが、多変数多項式の各係数はどのようにして求めるのでしょうか。 どなたかご教授いただけると助かります。