黄金分割法とは?最適化にどのように利用されるのか

このQ&Aのポイント
  • 黄金分割法を用いて一変数関数の最小化をしようとしていますが、最小値を与える座標xminが求まりません。
  • 黄金分割法は、x座標上の4点を常に保持し、凹型になっている3点の中に次々とxminを追い込んでいく方法です。
  • 最適な結果を得るためには、初期状態でxminを囲っていることが重要です。
回答を見る
  • ベストアンサー

黄金分割法

現在、黄金分割法を用いて、一変数関数の最小化をしようとしています。 黄金分割法はx座標上の4点(xa<xb<xc<xd)を常に保持し、凹型になっている3点の中に次々とxminを追い込んでいく方法です。 文献を参考に黄金分割法のプログラムを作成し、二次関数を用いてテストをしたのですが、最小値を与える座標xminが求まりません。 一番離れている2点(xa,xd)がxminを常に囲っている状態ならば、求まると思うのですが、4点の値をトレースしたところ、4点とも、xminに対して片側に寄ってしまい(例えばxmin<xa<xb<xc<xdというような状態)、求まらないようなのです。 黄金分割法は原理的に上記のように最適化が失敗する可能性があると思うのですが、どうなのでしょうか? 初期状態でxminを囲っていれば、確実に最適化が可能なのでしょうか?

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

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

多分プログラムのどこかに虫が潜んでいるのでしょう。 しかし、ご質問の内容を見るとちょっと理解しにくい部分があるので、簡単に言うと、 ・適当にa,b,c(a<b<c)の区間を設定したときに、 f(a) > f(b) f(c) > f(b) であれば区間a,bに最小点がある 次に、 a-b 又は b-c の間に新しい点 x を用意する。 このとき、a-bとb-cで広い方の区間にx点を用意する。 たとえば b-c の場合は、b-c間に0.38197:0.61803の比率なるようにxを用意する。 f(b)>f(x)であればb-c間に極小があるので、 これにより、新しい区間a',b',c'は、 a'=b b'=x c'=c となり f(b)<f(x)であれば、a-b間に極小があるので、 a'=a b'= a-b間を黄金比率で分割するxを求める c'=b となるわけです。 あとはこの繰り返しです。 区間に複数の極小点がない限り論理的に考えて囲い込めないと言うのは考えられません。

0shiete
質問者

お礼

早速のご回答有難うございます。 やはりバグでした。 (関数の評価がうまくいっていませんでした) きちんと検証せずに質問し、たいへん 申し訳ありませんでした。

関連するQ&A

  • 黄金分割法のほかに

    一変数関数の最小値、最大値を求めるのに黄金分割法がありますが、これ以外の方法ご存知の方教えてください。

  • 座標値を求める計算式が知りたい!

    下図のように、点座標、点A(Xa,Ya)、点B(Xb,Yb)、点C(Xc,Yc)が与えられているとき、D点の座標値、Xd, Ydを求める式を教えてください。

  • 4点の座標がわかっているときの四角形の面積

    平面上の4点の座標がわかっていれば、四角形の形状は一義的に決まるものでしょうか。もし、きまるものなら、その面積の算出方法について教えてください。 点A(Xa、Ya) 点B(Xb、Yb) 点C(Xc、Yc) 点D(Xd、Yd) とします。 よろしくお願いします。

  • 点と直線に関する質問

    点A,Bを結ぶ直線ABと、直線AB上に無い点Cがあり、点Cから直線ABへ下ろした垂線Lと、直線ABとの交点Dを求める方法に関する質問です。 当方は、座標に経度・緯度を使っており、点A,B,Cの座標(位置情報)は既知です。まず、点A,Bを結ぶ直線を求め、次にその直線と垂直に交わる直線の傾きbを求め、傾きbで点Cを通る直線と直線ABとの交点を求め、点Dとしました。しかし、求めた点Dを地図ソフト(SIS)上にプロットしてみると、かなりのずれ(50~100m)が生じてしまいました。 距離は数十~数百メートル程度のオーダーです。 点の座標A(XA,YA),B(XB,YB),C(XC,YC),求める点D(XD,YD)とし、ABの傾きa=(YB-YA)/(XB-XA)、ABと垂直に交わる直線の傾きb=-(XB-XA)/(YB-YA)とおくと、点Dの座標は、XD=(a*XA-YB-b*XC+YC)/(a-b),YD=b*(XD-XC)+YCであるとして、求めました。 この問題はやはり球面座標で考えるべきなのでしょうか?当方、球面座標に関しては全くの無知でして、このような時はどのようにして求めればよろしいのでしょうか?式など示して頂ければありがたいですが、何か関連する情報やヒントでも結構ですので、アドバイスの方、どうぞ宜しくお願いします。

  • エクセルを用いた3次元座標の回転・平行移動の方法: 対応する座標点間距離の最小化

    対応する3つの3次元座標間の最小二乗距離の総和を最小化する方法を教えていただけないでしょうか。 それぞれ3座標点を含む2つのデータセットがあるとします。 片方のデータセットを回転・平行移動させることにより、 対応する3座標点間の最小二乗距離の総和を最小化したいのですが、 その方法を教えてください。 例: データセットA:(xa1, ya1, za1), (xa2, ya2, za2), (xa3, ya3, za3) データセットB:(xb1, yb1, zb1), (xb2, yb2, zb2), (xb3, yb3, zb3) データセットBを回転・平行移動したもの:(xb1', yb1', zb1'), (xb2', yb2', zb2'), (xb3', yb3', zb3') そして対応する3座標点間の最小二乗距離の総和: (xa1-xb1')^2+(xa2-xb2')^2+(xa3-xb3')^2+ (ya1-yb1')^2+(ya2-yb2')^2+(ya3-yb3')^2+ (ya1-yb1')^2+(ya2-yb2')^2+(ya3-yb3')^2 を最小化したい。 つまり、これを最小化するためのデータセットBの回転・平行移動の方法をしりたいのです。 よろしくお願いします。  

  • パターンマッチングの限界?(最大文字数)

    perl正規表現のパターンマッチングでは,対象文字列が長すぎると正しくマッチしないというような,perlの仕様あるいはバグが存在するのでしょうか? ■状況 CGIフォームから入力された文字列に機種依存文字(EUC未定義文字)が含まれていないかチェックするため,以下のようなスクリプトを書きました。テストでは,ほとんどの場合は正常に動作しましたが,定義文字=パターンマッチするはずの文字に,未定義文字が含まれていると誤判断されてしまうケースがありました。いろいろ試してみたところ,どうも文字数32,768バイトを超えた場合に限られるようだ,というところまで判りました。 ドキュメントなどを見ても,そのような仕様については見つからず,どなたかご存知ないでしょうか。 あるいはスクリプトに不備があればご指摘いただけたらと思います。 よろしくお願いいたします。 if (&is_undef($input_text)) { print "未定義文字が含まれています。"; } … sub is_undef { my ($text, $character_strict); $text = $_[0]; # EUC-JP文字(定義文字) $character_strict = '(?:[\x20-\x7E]|' # ASCII  . '[\xA1\xB0-\xCE\xD0-\xF3][\xA1-\xFE]|' # 1,16-46,48-83区  . '\xA2[\xA1-\xAE\xBA-\xC1\xCA-\xD0\xDC-\xEA\xF2-\xF9\xFE]|' # 2区  . '\xA3[\xB0-\xB9\xC1-\xDA\xE1-\xFA]|' # 3区  . '\xA4[\xA1-\xF3]|' # 4区  . '\xA5[\xA1-\xF6]|' # 5区  . '\xA6[\xA1-\xB8\xC1-\xD8]|' # 6区  . '\xA7[\xA1-\xC1\xD1-\xF1]|' # 7区  . '\xA8[\xA1-\xC0]|' # 8区  . '\xCF[\xA1-\xD3]|' # 47区  . '\xF4[\xA1-\xA6])'; # 84区 $text =~ s/\r//g; $text =~ s/\n//g; $text =~ s/\t//g; if ($text =~ /^$character_strict*$/) {  return; } else {  return 1; } }

    • ベストアンサー
    • Perl
  • Perlのデータ変換

    Perlでデータの変換で方法がわからず、悩んでおります。 $moji_1 = "A5A2A5B9A5D9A5B9A5C8"; ↑ ↓ @moji_2 = (0xA5, 0xA2, 0xA5, 0xB9, 0xA5, 0xD9, 0xA5, 0xB9, 0xA5, 0xC8); それぞれを変換するスマートな(関数や1行程度)でできる方法が知りたいのですが わかりません。 packやunpack?を使えば、できるということでしょうか? perlの取得がなかなかできずに悩んでおります。 Cがポインタが理解できれば初級をクリアしたといわれますが、 Perlの場合は、何をクリアすれば、初心者をクリアしたとなりますか? 皆さんの意見が知りたいです。 初級 中級 上級 達人 仙人 創始者 Perlを作った人 . . .

    • ベストアンサー
    • Perl
  • 2直線が直交する点の求め方が分かりません

    数学で分からない問題があるので質問させていただきます。 3つの点 A(Xa,Ya,Za)、B(Xb,Yb,Zb)、C(Xc,Yc,Zc)与えられているとして、 点A,Bを通る直線ABに、点Cから垂直に線を引く場合に、 2直線の交点D(X,Y,Z)の座標を求める方程式が分かりません。 (Xb-Xa)(X-Xc)+(Yb-Ya)(Y-Yc)+(Zb-Za)(Z-Zc)=0 一つは思いつきましたが、変数が3つあるのであと2つ 式が必要になると思います。 分かる方がいたら教えていただけませんか。 よろしくお願いします。

  • ゼネラルフローチャートの作り方。

    数値解析実習という授業で「補間法」をやっているのですが このプログラムのディテールフローチャートは書けるのですが ゼネラルフローチャートをどのようにかいていいのかがわかりません。 「開始」  ↓ 「変数宣言」  ↓ この先どうなるのでしょう??? #include <stdio.h> #include <math.h> void main(void) { double xa,xb,xc,h; double ya,yb,yc; double xx,yy,dela,delb,del2a; printf("3点のx座標a,b,c="); scanf("%lf%lf%lf",&xa,&xb,&xc); printf("3点のy座標fa,fb,fc="); scanf("%lf%lf%lf",&ya,&yb,&yc); printf("補間点のx座標x="); scanf("%lf",&xx); h=xb-xa; dela=yb-ya; delb=yc-yb; del2a=delb-dela; /*二次補間公式*/ yy=ya+dela/h*(xx-xa)+del2a/(2.0*h*h)*(xx-xa)*(xx-xb); printf("補間点f(%lf)=%lf\n",xx,yy); } ディテールは細かく書くだけっぽいのでそのまま出来たのですが・・・。 ゼネラルのほうがおおまかな流れを書くみたいですがどこを書いて良いのかわかりません。 教えてください。

  • 垂線の長さを求めたい。

     今、V.B.でプログラムを作っているんですが、『垂線の求め方』が分からなくて困っています。 問題は以下の通りです。 ・2点(xa,ya),(xc,xy)を通る直線Aと、2点(xb,yb),(xd,yd)を通る直線Bとの交点から、 2点(x1,y1),(x2,2)を通る直線におろす垂線の長さを求めたい。 回答の方、よろしくお願いします。