• ベストアンサー

3次式の逆関数の求め方

3次式 y=Ax^3+Bx+C を x= の形に書き換えたいのですが、解法がさっぱりわかりません。 (x^3はxの3乗と思ってください) 類似の質問を検索してみても、回答中の参照先サイトがなくなっていたり、 難解すぎて理解できなかったりで解決しませんでした。 解法のわかる方、改めて教えていただけないでしょうか。 いまはエクセルのゴールシーク機能を使って、yの値からxの値を求めているのですが、 数が多いのでとても手間がかかります。 複数のyの値を、1操作でゴールシークできれば、あえて逆関数をもとめる必要もないんですが。 そういう手段もあれば教えてください。

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

  • ベストアンサー
回答No.1

三次関数のx^2の係数が0であることに着目すれば、”カルダノの公式”そのものです。 ”カルダノの公式”で検索してください。内容は理解できなくても、手順どおりにやればエクセルに実装できます。 反復法だと、”ニュートン法”もヒントになるでしょう。

heyzo
質問者

お礼

とりあえずエクセルで回答させることができました。ありがとうございました。 ただ虚数が発生するとエクセルではエラーになってしまうので、100%完成まではこぎつけてません。 そこらへんをもうちょっとつめてみます。

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

その他の回答 (1)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

マクロを作る手ですかね。 function gyakukansu(a,b,c,y) を自分で作れば、excelのセルの中から(組み込みの関数と同じように)利用できます。複数の解を出力するためには、 DIM solution(0 to 2) solution(0) = ... solution(1) = .... solution(2) = .... gyakukansu = solution のようにして配列を返すようにすればOKです。スプレッドシート上では、複数の数値を返す組み込み関数(minverseとかlinestとか)を使うのと同じ要領で利用します。 じゃ、マクロの中身です。 y = A x^3 + Bx + C の逆関数ってのは、 x^3 + (B/A)x + (C-y)/A = 0 という方程式の実数解を求めていることに他なりません。 p = B/A q = (C-y)/A f(x) = x^3 + px + q (ちなみに、y = a x^3 + b x^2 + cx + d の場合も、x=X-b/(3a)と変数変換すればこの形に帰着します。(チルンハウス変換)) とおくと、方程式は f(x) = 0 これを、解がどこにあるかによって分類します。そのために、fをxで微分したもの f'(x) = 3(x^2)+p を考えておきます。f'(x)=0となるxでf(x)は極大か極小になるわけですね。 (1) p>0 → f(x)には極大・極小がない。なので、f(x)=0には1つの実数解と2つの虚数解がある。  (1-1) q>0 → x<0の範囲に唯一の実数解がある。  (1-2) q=0 → x=0が唯一の実数解。  (1-3) q<0 → x>0の範囲に唯一の実数解がある。 (2) p=0 → x=(qの符号)×(|q|^(1/3))が唯一の実数解。 (3) p<0 → f(x)には極大・極小がひとつずつある。f'(x)=0を解いて 極大fmax = f(-√(-p/3)) 極小fmin = f(√(-p/3)) であると分かります。そして、  (3-1) fmin >0 → x<-√(-p/3)の範囲に唯一の実数解がある。  (3-2) fmin = 0 → 二重解 x=√(-p/3)のほかにもうひとつ、x<-√(-p/3)の範囲に実数解がある。  (3-3) fmax > 0 > fmin → x<-√(-p/3)の範囲、-√(-p/3)<x<√(-p/3)の範囲、および、                 x>√(-p/3)の範囲にそれぞれひとつずつ実数解がある。  (3-4) fmax = 0 → 二重解 x=-√(-p/3)のほかにもうひとつ、x>√(-p/3)の範囲に実数解がある。  (3-5) 0 > fmax → x>√(-p/3)の範囲に唯一の実数解がある。  「ある範囲に唯一の実数解がある」というその解の数値計算は簡単で、ニュートン法が使えます。すなわち: 適切な出発値x[0]を与えて、 x[n+1] = x[n] - f(x[n])/f'(x[n]) を繰り返せば、x[n]が解に収束する。最初もたついても、収束しはじめるととても速くて、繰り返す度に有効数字の桁数がおおむね倍になって行きます。なので|f(x[n])/f'(x[n])|がうんと小さくなったら打ち切れば良いわけです。  出発値は「範囲内であって範囲の境界から適当に離れたところ」をx[0]にすれば良い。適当って、(だいたい何でもいいんですけど、小さい定数だと|p|が0に近い場合にx[1]が大はずれの値になってなかなか収束が始まらないんで)たとえば(|q|^(1/3))+1ぐらい離れたところとか。  ただし、(3-3)における「-√(-p/3)<x<√(-p/3)の範囲にある解」を探す場合だけは、「適当に」じゃカオスに陥ることがありますんで、この場合は変曲点(f''(x)=0となるx)であるx=0を出発値にします。

heyzo
質問者

お礼

マクロは触れたことが無いのでちょっと勉強してみます。 ありがとうございました。

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

関連するQ&A