関数の最小値を求める方法について教えてください。 – プログラミング – Home

関数の最小値を求める方法について教えて...
 
通知
すべてクリア

関数の最小値を求める方法について教えてください。


ぶるぶる
 ぶるぶる
(@ぶるぶる)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

はじめまして。C++を勉強し始めたばかりです。
いろいろなホームページを見させて頂いたのですが
どうしてもわかりません。
宜しくお願いします。

質問内容は
関数xとyで求まる式(例えば簡単な2次関数など)があるとします。
xをある範囲、例えば1~10まで変化させてyを求め、
その範囲の中のyの最小値と、そのときのxの値を求め表示させたいのですが
どうしたらよいのかわかりません。

for文でxを1~10まで繰り返してそれぞれのyの値を求めることはできるのですが・・・。

宜しくお願いします。


引用解決済
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

微分してNewton法というのが定石でしょうが、
直感的で効率も悪く複雑な関数には対応できない方法を。

f(1),f(2),,,f(10)を調べ、最小値を求める。
(仮にf(3)が最小とする)

f(2.0),f(2.1),,,f(4.0)を調べ、最小値を求める。
(仮にf(3.3)が最小とする)

f(3.20),f(3.21),,,f(3.40)を調べ、、、以下同様。


返信引用
ぶるぶる
 ぶるぶる
(@ぶるぶる)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

さっそくのお返事ありがとうございます。
あまりにも稚拙で申し訳ないのですが

f(1),f(2),,,f(10)を計算で求めたあと
min f(x)とそのときのxを求めるにはどうしたらよいでしょうか?

詳しく教えてくださると助かります。
本当にすみません。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

プログラミングから離れて考えてください。
10個の箱に1つずつ数字があり、1度に1つの箱しか中を見れないとき、
どうやって最小を見つけます?
3番目の箱の9という数字が今まで開けた箱の中では最小だと、
覚えておきながら箱を最後まで開けるでしょう、普通。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

プログラミングから離れて考えてください。
10個の箱に1つずつ数字があり、1度に1つの箱しか中を見れないとき、
どうやって最小を見つけます?
3番目の箱の9という数字が今まで開けた箱の中では最小だと、
覚えておきながら箱を最後まで開けるでしょう、普通。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

何故か重ねて投稿。失礼しました。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

最初に、保存用のxとyを初期化しておく。
yは予定データより大きい数字を設定しておく

あとは、保存用のyと計算したyを比較して小さかったらx,yを置き換える。
最後に残ったものが答えではないでしょうか


返信引用
myy_t
 myy_t
(@myy_t)
ゲスト
結合: 22年前
投稿: 5
 

シンプレックス法(滑降シンプレックス法)というアルゴリズムがあります。
調べてみてください。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

簡単に作ってみました。
ロジックは下記のようにすればよいと思います。

#include stdafx.h
#include stdlib.h

int main(int argc, char* argv[])
{
int x, y;
int save_x, save_y;
int i;

save_x = 0x7fffffff;
save_y = 0x7fffffff;
for( i = 0; i < 10; i++) {
x = rand();
y = x * 2;
printf( x = %d y = %d\n, x, y);
if( y < save_y) {
printf( 置き換え有り\n);
save_y = y;
save_x = x;
}
}
printf( x = %d y = %d\n, save_x, save_y);
return 0;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました