関数のある区間における最大値を求めたい

14 views (last 30 days)
MP
MP on 27 Sep 2021
Commented: MP on 14 Oct 2021
お世話になります.
シンボリック関数に値を代入したときの, ある区間における最大値を求める方法についてお教え頂けないでしょうか?
例えばy=a*x^2という式があり, 任意のaかつxが任意の区間(e.g.[3 5])のとき, 関数yの最大値とそのときのxを知りたいと思っています.(この場合xが大きいほどyが大きくなるので区間の上限を代入すれば良いですが, 実際にやろうとしているのは非常に複雑な関数であります)
微分して0となるときを求めることで極値を出すという手法は調べて見つけたのですが, 今回の場合極値を持つとは限りませんのでこの手法は使えないと考えています.
現状は, 事前に任意の区間を細かく分割した配列(e.g. x=3:1e-3:5)を用意して, それを関数に代入して出てきた配列からmaxで最大値を取得しています.
しかしこの方法だと, 正確な解を求めるには配列のステップを細かく刻む必要があり, そうすると計算時間が長くなってしまいます.
この最大値を求める作業を多数繰り返しますので, なるべく一回あたりの実行時間を短くしたいと考えています.
なにかうまい方法があるはずと思うのですが, 頭が固く思いつきません.
何卒知恵をお貸しください.

Answers (1)

Hernia Baby
Hernia Baby on 27 Sep 2021
Edited: Hernia Baby on 27 Sep 2021
逆数をとってその最小値を取るというのはいかがでしょうか
1変数関数であれば fminbnd 関数が使えると思います
g = @(x) x^2;
f = @(x) 1/g(x)
f = function_handle with value:
@(x)1/g(x)
x1 = 3;
x2 = 6;
xmin = fminbnd(f,x1,x2)
xmin = 6.0000
y = g(xmin)
y = 35.9995
  3 Comments
Hernia Baby
Hernia Baby on 30 Sep 2021
返信遅くなりました。やってみましたが、x*sin(x)の場合、取り方によってはうまくいかないケースがありました。 複雑な式と伺いましたので、やってみてうまくいかなければ再度ご質問頂けたらと思います。
MP
MP on 14 Oct 2021
ご返信遅くなり申し訳有りません.
やはり同様に, 極値が区間内に複数あるとうまくいかない結果となりました.
しっかり理解しているわけではないですが, アルゴリズムに黄金分割探索というものが用いられており, これが単峰関数を前提としているようです.
今回対象の関数が三角関数を含んでいるため, 適用が難しそうです.
別の手法を探したいと思います, ありがとうございました. もし他にもアイディアございましたらぜひご教授ください.

Sign in to comment.

Products


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!