- ベストアンサー
指数関数の逆関数について
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
#1,#3です。 >a=7.39 >b=2.72 >u1=489 >c1=82.3 >u2=489 >c2=44.4 >0≦x≦489 における元の関数のグラフを見ると マクロ(アバウト)に見ると平均値u=u1=u2の正規分布密度関数f(x)の形状に似ています。 しかし、x≦uの広範囲にわたりf(x)をマクローリン展開やフーリエ級数展開はできても、逆関数f^(-1)(x)の方はx<<uになるとf'(x)>>1になって、級数展開が困難になる(収束性が悪くなる)ため、逆関数の展開は実用上計算誤差が大きくなってメリットがありません。 今回のケースも正規分布密度関数と形状が似ていますので逆関数をマクローリン展開してもべき乗関数展開では、0<ae^(-(u1/c1)^2)+be^(-(u2/c2)^4)≦x≦u=489の範囲で y'がx<<1およびx~u1=u2=a+dで 非常に大きくなりますので級数の収束が非常に悪くなるます。展開項数を制限すれば近似誤差が大きくなることを意味しまします。 具体的には y<300でy'>>1 y~489でもy'>>1 y=489でy'=∞ y=350~650位のところで比較的 y'が通常扱う数値の大きさの数値になります。 これをxの範囲で考えると x=ae^(-(u1/c1)^2)+be^(-(u2/c2)^4)>0 ←これはxの下限 からx≦0.1ではy'>>1となって級数展開の近似度が低下します(項数の打ち切りで)。 また x≧10でもy'>>1となって級数展開の近似度が低下します(項数の打ち切りで)。 したがって、 0<x≦489の範囲を単一のテイラー展開で逆関数を表すのは、実用的ではないでしょう。実用的にはxの範囲をy' が y'>>1の領域とy'がそうでない領域に分割し、各分割区間で別の逆関数近似式をして、逆関数の近似式を求めた方が良いでしょう。 具体的には、分割区間をいくつに分かるか、分割の境界をどう定めるか、の問題が発生します。分割すればするほど、各区間でのベキ級数展開項数を減らすことができます。でも今回の逆関数の近似ではテイラー展開では余り効率的ではありません。 適当と思われる区間分割による逆関数の近似式を求める方法としては、3次スプライン曲線補間による逆関数の近似曲線を導出して、逆関数として使うのが今回の逆関数を求める問題に適しているかと思います。 具体的には 0<ae^(-(u1/c1)^2)+be^(-(u2/c2)^4)≦x≦u=489の範囲で y=ae^(-((x-u1)/c1)^2)+be^(-((x-u2)/c2)^4) xを均等に分割して(間隔Δx≒20~30程度)…(●)、それに対するyを計算し、 そのxとyを交換したテーブルに対して3次スプライン近似曲線群{Sj(x)}を求めてやれば、それで逆関数y=g(x)の関数として使えるでしょう。 各Sj(x)はxの3次多項式になります。区間ごとにSj(x)が滑らかに曲線が連結され、xの分割区間のy'が急峻な所は細かく分割すること((●)の分割が該当)で近似誤差が小さくなります。3次スプライン近似ではx,yのテーブルの座標を近似曲線{Sj(x)}が全て通ります(テーブルの座標点では誤差=0ということです)。 3次スプライン補間関数{Sj(x)}の求め方については以下を参照下さい。 近似精度(補間精度)や関数の形状によって、それに合った分割数や分割の仕方を行って具体的な補間関数群{Sj(x)}を求めて逆関数g(x)=f^(-1)(x)の近似関数として使います。 http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/numeanal1/node16.html http://akita-nct.jp/~yamamoto/lecture/2004/5E/interpolation/text/html/node3.html 補間精度の考え方 http://www.cannula.jp/hokan.html エクセルでのスプライン補間 http://homepage1.nifty.com/gfk/Spline.htm
その他の回答 (9)
>>x が実数なら、w > 0 z < 1 でなければならない。 >.... 上記の部分がわかりませんでした。 ((x-u)/c1)^2 = w | w = -LN(z) …(1) ((x-u2)/c2)^4 = k*w^2 | k = (c1/c2)^4 e^(-w) = z …(2) という変数の書き換えで y = az + bz^(kw) | w = -LN(z) …(3) になる。 x が実数なら、(1) から明らかなように w≧0 、(2) から明らかなように z≦1 . …ということでした。 1≧z>0 の範囲で、(3) の y は 0 から a+b へ単調増大。区間 (0, a+b] 内の y を与えれば、非負の w が得られる。 ・Newton は収束が速い。 dy = {a + bkwz^(kw-1)}*dz ・まともな逐次代入は収束が遅い。中間値を逐次代入すれば Newton 並み。 …というわけです。
お礼
ご返答、ありがとうございます。 ご返答が遅くなりまして、申し訳ありませんでした。
> w = ((x-u)/c1)^2 >の解 x は一価じゃなさそう。 見落とし続きで、#6 へ蛇足追加。 ↓ >0≦x≦489 …(B) 開区間 (0, a+b) 内の y を与えれば、非負の w が得られる。(別スレッドの、Newton や逐次代入) w = ((x-u)/c1)^2 の解は x = u±c1*sqrt(w) だから、 u<c1*sqrt(w) であれば (B) の非負限定で x が一意的に…。
No2 Lycaon です。 お礼欄のコメント読みました。 確かにこの定数と範囲なら、元関数も逆関数も単調増加、つまり逆関数がありましたね。(下図) >数値計算での解法とは、どのような解法なのですか? >具体的に教えていただけると、ありがたいです。 Excel でマクロ(Visual Basic Editor)を使って解く方法を記します。(出力部分以外はVB6 でも同じコードで動きます。) Excel 2000 で作りましたが、それより新しいバージョンなら動く筈です。 質問者様が Excel をどこまでご存知か一々訊ねていては話が進まないので、対象を広げ Excel の入門者でマクロは全然使えないレベルの方に判るように、手順のみ記しました。 ★☆★☆★☆★☆★☆★☆★☆★☆ 【1】新しい Excel Book を開く。開いた空白シートの名前が "Sheet1" であることを確認。 【2】「ツール」-「マクロ」-「Visual Basic Editor」 をクリック(以下全て左クリック。)。 【3】 左上の「VBA project」-「Microsoft Excel Objects」-「Sheet1(Sheet1)」 をクリック。 【4】 右に大きな白紙画面(VBE画面)が出たら、次のコードをコピペして下さい。 Sub reverse() Dim x As Double, f1 As Double, f2 As Double, y(500) As Double Sheets("Sheet1").Activate With ActiveSheet .Cells.Clear '---------- .Cells(1, 1).Value = "【元関数】" .Cells(2, 1).Value = "x" .Cells(2, 2).Value = "y" .Cells(2, 3).Value = "f1" .Cells(2, 4).Value = "f2" For x = 0 To 489 f1 = 7.39 * Exp(-((x - 489) / 82.3) ^ 2) f2 = 2.72 * Exp(-((x - 489) / 44.4) ^ 4) y(x) = f1+ f2 .Cells(x + 3, 1).Value = x .Cells(x + 3, 2).Value = y(x) .Cells(x + 3, 3).Value = f1 .Cells(x + 3, 4).Value = f2 Next '---------- .Cells(494, 1).Value = "【逆関数】" .Cells(495, 1).Value = "y" .Cells(495, 2).Value = "x" For x = 0 To 489 .Cells(x + 496, 1).Value = y(x) .Cells(x + 496, 2).Value = x Next End With '--------- MsgBox ("終了") End Sub 【5】Sheet1のメニューバーに、右向き黒三角があるかを確認。 なければ、「表示」-「ツールバー」-「Visual Basic」をクリック。 右向き黒三角が出たら、クリック。「Sheet1.reverse」が選ばれているので「実行」させる。 【6】「終了」というメッセージが出る。 Sheet1 の 3~492 行に、x、y、元関数の右辺第1項、第2項が 4列に分けて計算されている筈。 Sheet1 の 496~985 行に、逆関数のx、yが 2列に分けて計算されている筈。(見出しの x,y は元のままです。) 【7】Sheet1 の A3セル(値は0)をクリック。Shiftキーを押し、そのまま「End」「↓」「→」キーを押して、A3~B492 セルを反転。 【8】メニューバーの(柱状)グラフのアイコンをクリック。(なければ「表示」-「ツールバー」-「標準」。) 「グラフの種類」-「散布図」で幾つかある中から好きな表示形式を選ぶ。 【9】できたグラフを右クリック。「グラフエリアの書式設定」でグラフの色・フォント・目盛などを適当に変える。 【10】Sheet1 の A496セル(値は 3.44E-15)をクリック。Shiftキーを押し、そのまま「End」「↓」「→」キーを押して、A496~B985 セルを反転。 【11】上の【9】【10】と同じ操作。(以上)
お礼
詳細でわかりやすい御説明ありがとうございました。 手順通り進めたところ、lycaonさんとおなじようなグラフを作ることができました。 確かに、逆関数は図のような形をつくりますね。
>ae^(-((x-u1)/c1)^2)+be^(-((x-u2)/c2)^4)=y >以下の定数や条件で求めたいと考えています。 >a=7.39 >b=2.72 >u1=489 >c1=82.3 >u2=489 >c2=44.4 >0≦x≦489 u1 = u2 = u とし、例によって w = ((x-u)/c1)^2 とする。 ((x-u2)/c2)^4 = k*w^2 : k = (c1/c2)^4 e^(-w) = z ↓ y = az + bz^(kw) : w = -LN(z) …(A) x が実数なら、w > 0 z < 1 でなければならない。 式(A) をプロットしてみると、y は +0 から a+b に到る単調増加な曲線。(逆関数の領域?) 開区間 (0, a+b) 内の y を与えれば、非負の w が得られるけど、 w = ((x-u)/c1)^2 の解 x は一価じゃなさそう。
お礼
>x が実数なら、w > 0 z < 1 でなければならない。 勉強不足で申し訳ありません。 上記の部分がわかりませんでした。
No.4 です。 関数が微妙に変わったの見逃してました! 見逃してくだされ。
お礼
いえ、こちらこそいつもお答えいただいて助かります。 ありがとうございます!!
>ae^(-((x-u1)/c1)^2)+be^(-((x-u2)/c2)^4)=y 前例を踏襲。 ((x-u1)/c1)^2 = w …(1) として、 y = ae^(-w) + be^(-w^2) さらに、e^(-w) = z とすれば、 y = az + b(z^w) : w = -LN(z) …(2) ここまで詰めても、逆関数には手が届きません。x が実数値になる範囲だけでも。 さしあたり a, b は正(非零)とすると、式(2) にて e^(-w) = z > 0 .また、w > 0 になるには、z < 1 . この範囲で式(2) をプロットしてみると、y は +0 から a+b に到る単調増加な曲線。 …てな調子で探るしかなさそう。
お礼
ご返答、ありがとうございます。 説明不足で申し訳ありませんでした。 一応、以下の定数や条件で求めたいと考えています。 a=7.39 b=2.72 u1=489 c1=82.3 u2=489 c2=44.4 0≦x≦489 この条件だとプロットすると1対1となるのですが...。 やはり、難しいでしょうか?
- info22
- ベストアンサー率55% (2225/4034)
#1です。 A#1の最後から2番目の文に誤植がありましたので訂正しておきます。 >しかし、その逆関数が所等関数で記述できるかは保証の限りではありません。 誤:所等関数 正:初等関数 なお、係数によってyの値によってxが4個存在する例のグラフを添付しておきます。 a=-3,b=4,c1=-1,c2=3,u1=2,u2=3の場合、黒い曲線が元のグラフでyの値よりxが0個~4個の値を持ちます。 この曲線のyとxを入れ替えた曲線が青い曲線です。 xの値によりyの値が最大4個が存在します。 このyの青線の曲線の方程式を y=g(x) の形で表現することは不可能でしょう。 つまり黒線の曲線の逆関数が存在しないということを表しています。
お礼
なるほど。 この図を見ると、逆関数が1対1でなければ、ならない理由がはっきりと理解できます。 青線で見たとき、関数で表せない事がすごく解ります。
y=ae^(-((x-u1)/c1)^2) + be^(-((x-u2)/c2)^4) に具体的数値 u1=1, u2=2, c1=3, c2=4, a=5, b=6 を入れて Excel で作図してみました。左図の赤線。 そのxとyを入れ替えたのが右図の赤線です。 各定数が上の組み合わせなら、1つのxに2つのyがあるので逆関数はなし。 変数の範囲を限定すれば、例えば左図でx≦0 に限れば、グラフの横転後にy≦0 部分でx対yが1対1対応になるので、逆関数あり。 勿論 各定数が別の組み合わせなら、別のグラフになります。 exp の中がxの 2乗と 4乗なので、#1 さんご記述の通り、逆関数をy=f(x) の形で求めることは不可能でしょう。 具体的に係数を与えて Excel などで数値計算するのが、採りうる唯一の解法と思います。
お礼
画像を含めたご回答、ありがとうございます。 また、説明不足を申し訳ありませんでした。 具体的な定数として、以下の定数、条件で求めたいと考えています。 a=7.39 b=2.72 u1=489 c1=82.3 u2=489 c2=44.4 0≦x≦489 この条件だとプロットすると1対1対応となるのではなります。 >exp の中がxの 2乗と 4乗なので、#1 さんご記述の通り、逆関数をy=f(x) の形で求めることは不可能でしょう。 やはり、expの中に2乗や4乗が含まれると難しいですか...。 >Excel などで数値計算するのが、採りうる唯一の解法と思います。 数値計算での解法とは、どのような解法なのですか? 具体的に教えていただけると、ありがたいです。
- info22
- ベストアンサー率55% (2225/4034)
逆関数が存在するための条件や逆関数の定義を確認してください。 y=f(x)の逆関数は xとyを入れ替えて x=f(y)とし、この時のxを与えた時にyが一意に決まるなら 逆関数y=g(x)=f^(-1)(x)で定義できます。 しかし、一意に決まらない場合は逆関数が定義できない、つまり 逆関数が存在しないことになります。 このことを元の関数 y=f(x)で考えると、任意のyに対して f(x)=yを満たすxがただ1つだけ存在することを意味します。 なので ae^(-((x-u1)/c1)^2)+be^(-((x-u2)/c2)^4)=y …(■) で考えれば y=dなどとした時にxが高々1つしか存在しないことが逆関数の存在条件になります。 (■)の関数に付いては、与えられた係数の条件では、yの値によってはxが0~6個まで存在しますので、逆関数の存在条件を満たしませんので、逆関数が存在しない場合が含まれ、一般的な逆関数の式を求めることは不可能です。 係数条件や変数の範囲を制限して、部分的な範囲で逆関数の条件を満たすことが出来れば、その部分的な範囲での逆関数の定義は可能ですが、 yに対してただ1個のxが一意的に定まるような条件やxの範囲を決めるためには、定数がたくさんありすぎて困難を伴うでしょう。 特定な定数のセットに対してなら、xの範囲を限定すれば、その範囲での逆関数が定義できるでしょう。しかし、その逆関数が所等関数で記述できるかは保証の限りではありません。その場合、数値計算で逆関数の近似曲線を求めることは可能でしょう。
お礼
ご回答、ありがとうございます。 >逆関数が存在するための条件や逆関数の定義を確認してください。 すみませんでした。 逆関数に対する、きちんとした認識がありませんでした。 [変数xに対してただ1つの値yが定まる。]という点について認識不足でした。 >係数条件や変数の範囲を制限して、部分的な範囲で逆関数の条件を満たすことが出来れば、その部分的な範囲での逆関数の定義は可能ですが、 yに対してただ1個のxが一意的に定まるような条件やxの範囲を決めるためには、定数がたくさんありすぎて困難を伴うでしょう。 説明不足で申し訳ありません。 一応、定数や条件の補足として、 a=7.39 b=2.72 u1=489 c1=82.3 u2=489 c2=44.4 0≦x≦489 において求めたいと考えています。 プロットすると、一応x,yは一対一で決まると思うのですが、この条件下でも難しいでしょうか? >数値計算で逆関数の近似曲線を求めることは可能でしょう。 申し訳ありませんが、この方法について少し詳しく知りたいです。
お礼
詳細な方法、ありがとうございます。 近似関数をつくることという発想がなかったので、その方向で進めてみたいと考えています。