プロが教えるわが家の防犯対策術!

3次式

y=Ax^3+Bx+C


x=
の形に書き換えたいのですが、解法がさっぱりわかりません。
(x^3はxの3乗と思ってください)
類似の質問を検索してみても、回答中の参照先サイトがなくなっていたり、
難解すぎて理解できなかったりで解決しませんでした。

解法のわかる方、改めて教えていただけないでしょうか。


いまはエクセルのゴールシーク機能を使って、yの値からxの値を求めているのですが、
数が多いのでとても手間がかかります。
複数のyの値を、1操作でゴールシークできれば、あえて逆関数をもとめる必要もないんですが。
そういう手段もあれば教えてください。

A 回答 (2件)

三次関数のx^2の係数が0であることに着目すれば、”カルダノの公式”そのものです。



”カルダノの公式”で検索してください。内容は理解できなくても、手順どおりにやればエクセルに実装できます。

反復法だと、”ニュートン法”もヒントになるでしょう。
    • good
    • 0
この回答へのお礼

とりあえずエクセルで回答させることができました。ありがとうございました。

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

お礼日時:2011/04/25 10:21

マクロを作る手ですかね。


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を出発値にします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/25 10:18

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