• 締切済み

最大値

2変数関数の最大値を求めるプログラムを現在作ろうとしているのですがなかなかうまくいきません。どなたかサンプルをいただけないでしょうか?もしくは教えていただけると非常に助かります。 また関数はz=x^2+y^2などなんでもよいです。よろしくお願いします。

みんなの回答

  • my3027
  • ベストアンサー率33% (495/1499)
回答No.2

(1)力ずくで数値的に解く方法 -1<x<1 0<y<2 なのでまず刻み幅h=0.1として、 x=-0.9,-0.8・・・・0.9 :(xmax+xmin)/h-1=19個 y=0.1,0.2,・・・1.9 :(ymax+ymin)/h-1=19個: これを配列に格納します。この2つの配列の各要素の全ての組み合わせ(19×19組)で、それをzに代入して最大値を求める。 (2)少し数学知識を使う方法 2変数の最大値は、zをxとyで編微分し各式が0となる点です。例の式だとすぐ答えが出てしまうので複雑にして、 z=2x^2+y^2+xyとすると ∂z/∂x=4x+2y=0 ∂z/∂y=2x+2y=0 これを数値的に解けばいいのです。解く方法の例は、 ・クラーメルの方法 ・ガウスの消去法 ・反復法(ヤコビ、ガウス-サイデル法等) があります。最後の2つは複雑なプログラムで、変数が1万個とかを解く方法になるのでライブラリとしてweb上にあったりします。ちなみに変数が多くなるとガウス消去法は精度悪くなるので、普通反復法です。 まあ上例は2式なので、簡単なクラーメルの方法をプログラムすればいいかと。数値計算のポイントとして、 1)式を行列の形にいかに置き換えるか(行列はプログラム上配列で対応できるので) 2)刻み幅、上例だとh、を小さくしていくと精度が上がる。 とかあります。詳しくは数値計算の参考書を見て下さい。あとは各言語で効率よく計算するだけです。

参考URL:
http://gandalf.doshisha.ac.jp/~kon/lectures/2006.linear-algebra-I/html.dir/node97.html
javabegin
質問者

お礼

ご回答ありがとうございます。非常に参考になりました。 とっかかりがどうしたらよいかわからなかったのですが、こういう思考回路で考えればよいのだということがわかりました。

  • my3027
  • ベストアンサー率33% (495/1499)
回答No.1

プログラム以前に、x,yに何の範囲制限も無いので、ただzは発散するだけではないでしょうか?

javabegin
質問者

お礼

回答ありがとうございます。例えば、定義域が-1<x<1,0<y<2とした場合のように定められた場合ではいかがですか?よろしくお願いいたします。