• ベストアンサー

y=F(x)で、yの値からxの値を求めたい

y=F(x) の式でx=・・・の形にできれば問題ないのですが、できないときに、yの値でxの値を求めたいのですが、どうすればよいですか? 具体的には y=F(x)=A1exp(-x/t1)+A2exp(-x/t2)+A3(-x/t3) で、A1,t1などは、適当に入れる。 これでyの値を決めて、そのときのxの値を求めたいです。

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

  • ベストアンサー
  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.6

先の回答に訂正です。 while((f(x1-y)*(f(x1-y))>eps ではなく while (f(x1)-y)*(f(x1)-y)>eps です。 久しぶりにVBAで書いたので文法ミスがほかにもあるかもしれません。あとCやFORTRANなら実装例が結構あるかと。

murakkusu
質問者

お礼

回答ありがとうございます。 難しそうなので、じっくり勉強させてもらいます。

その他の回答 (5)

  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.5

ニュートン法については参考URLを参照してください。 VBAで組むとしたら function f(x as double)as double f=A1*exp(-x/t1)+A2*exp(-x/t2)+A3*(-x/t3) end function function df(x as double)as double df=-A1/t1*exp(-x/t1)-A2/t2*exp(-x/t2)+A3*(-1/t3) end function Function newton (y as double,eps as double)as double dim x0 as double dim x1 as double rem 初期値として適当な値を指定します。 x0=10.0 while((f(x1-y)*(f(x1-y))>eps x1=x0-f(x0)/df(x0) x0=x1 wend newton=x1 end function ここでepsは許容誤差です。小さくすればするほど精度は上がりますがそれだけループを繰り返すということを念頭に入れてください。ニュートン法では一階微分が必要ですが微分形が求まらない場合微分の代わりにその点を含むある区間での傾きが使えます。 実装例としては functio df(x as double)as double dim h as double dim k1 as double dim k2 as double dim k3 as double dim k4 as double rem 適当な範囲 h=1.0 k1=f(x) k2=f(x+h/2*k1) k3=f(x+h/2*k2) k4=f(x+h*k3) df=(k1+2*k2+2*k3+k4)/6 end function こんな感じでどうでしょう。

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E6%B3%95
  • cockerel
  • ベストアンサー率46% (253/548)
回答No.4

>求めたいyの値をすぐに知りたいです。 >データ量が膨大にあります。 それならばマクロを書くとよいでしょう。 yの値を挟み込むxを2つ(x1およびx2)決めます。 まず、x=(x1+x2)/2を代入して、求めたいyが左右どちらにあるかを判断します。 求めたいyが左にあるときは、x=(x1+(x1+x2)/2)/2を代入します。 求めたいyが右にあるときは、x=((x1+x2)/2+x2)/2を代入します。 これを繰り返し、誤差が一定の範囲になったときに終了します。 所望の分解能がエクセルの分解能を超えると解が振動します。その部分に気を付ければ単純なループ計算になると思われます。

murakkusu
質問者

お礼

マクロですか・・・ やったこと無いんですよね。 簡単に説明できそうでしたら教えてください。

  • haccyan
  • ベストアンサー率43% (27/62)
回答No.3

こんにちは。 さて、エクセルの「ゴールシーク」がつかえるのでは? エクセルが認識できる関数であれば、 目標値(Y)に収束する近似値を導いてくれます。 以下の、サイトをご参照ください。 もし見当違いだったらごめんなさい。

参考URL:
http://www.eurus.dti.ne.jp/~yoneyama/Excel/mous_jyo/jyo-8/#boolseek
murakkusu
質問者

お礼

回答ありがとうございます。 やってみたのですが、多分できないです。工夫すればできするかもしれませんが・・・ 変数が1つじゃないとできないですよね?

  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.2

直接逆関数を求められないなら、方程式としてニュートン法とかで数値解析的に解いちゃだめなの?

murakkusu
質問者

お礼

回答ありがとうございます。 ニュートン法ってどうやってやるんですか?

  • cockerel
  • ベストアンサー率46% (253/548)
回答No.1

逆関数は難しそうですね。やはり数値解析を使用しなければならないような気がします。 一例(とっさの思いつき): A1:値、A2:値、A3:値 A4:t1の値、A5:t2の値、A6:t3の値 B列:xの値 C列:A列の絶対参照+B列の相対参照によるyの式 定数が決定したら、グラフ(Grapher等を利用)を使用して概ねのxを求めます(振動しないようです)。 分解能に応じて増分を決定し、xの値をB列にフィルします。 yの値と調和するxの値を求めます。 (マクロ化することもできそうです) 以上、疲れた脳みそに思い浮かんだことを書きましたが実際には作っていません(起きて時間があったらやってみますが、それまでにどなたかがもっと賢い方法を見つけてくれるでしょう)。

murakkusu
質問者

お礼

回答ありがとうございます。 グラフをみる方法は最終手段として考えていました。でも面倒くさいなぁって・・・ A1からA6の値を決め、xの値を指定したら、求めたいyの値をすぐに知りたいです。 データ量が膨大にあります。

関連するQ&A