2014年4月23日(水)

数値解析演習
平成26年4月23日
超越方程式の解法
f ( x) = x − cos( x) = 0
(1)
問題1.ニュートン法のアルゴリズムを用いて、(1)式の解を求めよ。アルゴリズムの入力
は初期値 x ( 0 ) 、出力は解 x ( N ) である。ただし、上付き括弧の数字はアルゴリズムの繰り返
しの回数を表し、 N は解にたどり着くまでの回数である。また、解くべき超越方程式とそ
の一階微分はサンプルプログラムのように関数として定義しておく。
ヒント
x ( k +1) = x ( k ) −
f ( x(k ) )
, k = 0, 1, ...
f ' ( x(k ) )
これは、 x の更新式である。プログラムで記述すると、
x = x – f(x)/fdx(x);
と書ける。ただし、f(x)と fdx(x)はそれぞれ
f (x) と、一階微分 f ' ( x) の値を返す関数である。
問題2.ニュートン法のアルゴリズムを用いて、(2)式の非線形連立方程式の解を求めよ。
x + y2 = 0
x 2 + ( y − 1) 2 − 1 = 0
ヒント
∂f ( k ) ( k ) ⎞
⎛ ∂f ( k ) ( k )
( x , y ) ⎟
⎜ ( x , y )
(k )
(k )
⎛
⎞
∂y
⎜ ∂x
⎟ ⎛⎜ h1 ⎞⎟ = −⎜ f ( x , y ) ⎟
⎜
⎟
⎜ g ( x ( k ) , y ( k ) ) ⎟
⎜ ∂g ( k ) ( k ) ∂g ( k ) ( k ) ⎟ ⎝ h2 ⎠
⎝
⎠
⎜ ∂x ( x , y ) ∂y ( x , y ) ⎟
⎝
⎠
x ( k +1) = x ( k ) + h1 ,
y ( k +1) = y ( k ) + h2
(2)
サンプルプログラム(問題1)
/* サ ン プ ル プ ロ グ ラ ム 1
#include <stdio.h>
#include <m ath.h>
#include <stdlib.h>
2014/04/23 */
/* 超 越 関 数 f(x) = x - cos(x)
double f(double x)
{
return x - cos(x);
}
*/
/* 一 階 微 分
double fdx(double x)
{
return 1 + sin(x);
}
*/
/* メ イ ン プ ロ グ ラ ム
int m ain(int argc, char *argv[])
{
double x, th;
*/
/* 初 期 値 */
x = atof(argv[1]);
/* 終 了 条 件 */
th = atof(argv[2]);
/* ニ ュ ー ト ン 法 */
}
/* 結 果 の 表 示 */
printf("x = %10.8lf¥n", x);
printf("f(x) = %10.8lf¥n", f(x));
○ コンパイル
○ 実行
○ 実行(Linux)
$ gcc sample1.c -lm
$ ./a.exe
$ ./a.out
レポートは、「学籍番号」、「氏名」、「作成したプログラムの説明」をメールに書き、プログ
ラム、実行結果を添付した上、下記のアドレスへ提出してください。その際、メールの題
名に、「数値解析演習レポート」と書くこと。
提出先:[email protected]
〆切:平成26年4月30日(水曜日)