日々の研究生活での出来事,考えたことなどのメモ。あるいはお知らせ。

  お知らせのナビゲーター   トップページ > スポンサー広告> 情報 > ニュートン法で1変数関数を最適化  

スポンサーサイト

-- - --/-- [--] - --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ニュートン法で1変数関数を最適化

2009 - 11/19 [Thu] - 10:18

 今週の勉強会はニュートン法についてでした。これは誰もが知っている基本中の基本のアルゴリズムの中で,汎用性がかなり高いものですね。とは言え,アルゴリズム自体はすでに知っていることなので,勉強会はすぐに終わってしまいました。と,言うわけで,今回もC++で書いたコードを載せておきます。


/*****************************************
ニュートン法(1変量)

f(x) = x^3 - 6x^2 + 9x - 3
f'(x) = 3x^2 - 12x + 9
f''(x) = 6x - 12

解答
x = 1のとき,極大値 1
x = 3のとき,極小値 -3
*****************************************/

#include <iostream>
#include <cmath>

using namespace std;

double func( double x )
{
return x*x*x - 6*x*x + 9*x - 3;
}

double dfdx( double x )
{
return 3*x*x - 12*x + 9;
}

double dfdx2( double x)
{
return 6*x - 12;
}


double newton( double x )
{
double df, ddf, xprev;
double delta = 1.e-6;
int limit = 100;
int n = 0;

do {
n++;
df = dfdx( x );
ddf = dfdx2( x );
xprev = x;
x -= df/ddf;
cout << "n = " << n << ", x = " << x << ", f(x) = " << func(x) << endl;

} while( fabs(x - xprev) >= delta && n <= limit );

return x;
}


int main()
{
double a, x; ;

cout << "f(x) = x^3-6x^2+9x-3 を最適化します" << endl;
cout << "初期値を入力してください: ";
cin >> a;
cout << "\n初期値" << a << "で計算を開始します。" << endl;
cout << "-----------------------------------" << endl;

x = newton( a );

cout << "\n計算が終了しました。" << endl;
cout << "x = " << x << "のとき,極値は" << func(x) << "です。" << endl;

return 0;
}


スポンサーサイト

コメントの投稿





管理者にだけ表示を許可する

トラックバック

http://tarotwork.blog40.fc2.com/tb.php/78-cd6f21bf

 | HOME | 

プロフィール

管理者

 専門は心理統計学で構造方程式モデリングを中心に探索的分析法の研究をしています。

 ・著書:5冊
 ・翻訳:2冊
 ・査読論文:4本
 ・紀要論文:2本
 ・報告書等:2本
 ・国際発表:5回
 ・国内発表:12回

最近の記事+コメント

カテゴリ

全記事一覧表示

過去の記事

カウンタ

現在の閲覧者数

カレンダー

05 | 2018/06 | 07
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

ブログ内検索

リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。