Taro-数値計算の基礎Ⅱ(公開版)

Similar documents
Microsoft PowerPoint - 4.pptx

Taro-再帰関数Ⅱ(公開版).jtd

スライド 1

Taro-再帰関数Ⅲ(公開版).jtd

Taro-リストⅢ(公開版).jtd

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

Taro-リストⅠ(公開版).jtd

Taro-最大値探索法の開発(公開版

C による数値計算法入門 ( 第 2 版 ) 新装版 サンプルページ この本の定価 判型などは, 以下の URL からご覧いただけます. このサンプルページの内容は, 新装版 1 刷発行時のものです.

kiso2-09.key

Microsoft Word - NumericalComputation.docx

スライド 1

Taro-プログラミングの基礎Ⅱ(公

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

スライド 1

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

Taro-2分探索木Ⅰ(公開版).jtd

ープのロープ長以下であれば実現可能である ケース 3: 3 本のロープの杭の位置を点 P 1 = (x 1, y 1, 0), 点 P 2 = (x 2, y 2, 0), 点 P 3 = (x 3, y 3, 0) とする 点 P 1 = (x 1, y 1, 0), 点 P 2 = (x 2,

£Ã¥×¥í¥°¥é¥ß¥ó¥°ÆþÌç (2018) - Â裵²ó ¨¡ À©¸æ¹½Â¤¡§¾ò·ïʬ´ô ¨¡

Microsoft PowerPoint - NA03-09black.ppt

Taro-スタック(公開版).jtd

Taro-2分探索木Ⅱ(公開版).jtd

C 2 / 21 1 y = x 1.1 lagrange.c 1 / Laglange / 2 #include <stdio.h> 3 #include <math.h> 4 int main() 5 { 6 float x[10], y[10]; 7 float xx, pn, p; 8 in

Microsoft PowerPoint - program.ppt [互換モード]

kiso2-06.key

解答編 第 7 章実数型の計算と標準数学関数 演習問題 7.1 文法事項 1 ) 暗黙の型変換とは何か答えなさい 代入演算子 (=) や算術演算子 (+,-,*,/,%) では 2 つの演算項のデータ型が揃っている事が必要です 2 つの演算項のデータ型が異なる場合 可能ならば 演算項のデータ型を変換

超初心者用

スライド 1

C 2 2.1? 3x 2 + 2x + 5 = 0 (1) 1

フローチャートの書き方

関数のグラフを描こう

cp-7. 配列

演習1

情報実習Ⅱ

#define N1 N+1 double x[n1] =.5, 1., 2.; double hokan[n1] = 1.65, 2.72, 7.39 ; double xx[]=.2,.4,.6,.8,1.2,1.4,1.6,1.8; double lagrng(double xx); main

x(t) + t f(t, x) = x(t) + x (t) t x t Tayler x(t + t) = x(t) + x (t) t + 1 2! x (t) t ! x (t) t 3 + (15) Eular x t Teyler 1 Eular 2 Runge-Kutta

Taro-再帰関数Ⅰ(公開版).jtd

プログラミング基礎

Microsoft PowerPoint - kougi9.ppt

講習No.9

モデリングとは

Microsoft Word - 3new.doc

x h = (b a)/n [x i, x i+1 ] = [a+i h, a+ (i + 1) h] A(x i ) A(x i ) = h 2 {f(x i) + f(x i+1 ) = h {f(a + i h) + f(a + (i + 1) h), (2) 2 a b n A(x i )

Microsoft PowerPoint - guidance.ppt

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

kiso2-03.key


数値計算

実際の株価データを用いたオプション料の計算

プログラミング基礎

講習No.10

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

PowerPoint プレゼンテーション

#6 : ( 8-13) URL : j inoue/index.html : Neugart

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

< F2D837C E95CF CF68A4A94C5816A2E6A>

Informatics 2014

Microsoft PowerPoint - 13th.ppt [互換モード]

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

C¥×¥í¥°¥é¥ß¥ó¥° ÆþÌç

Microsoft PowerPoint - lec4.ppt

sqrt( )= 精度 :1.0e-6 のとき sqrt( )= 精度 :1.0e-8 のとき sqrt( )= 精度 :1

C言語による数値計算プログラミング演習

I ASCII ( ) NUL 16 DLE SP P p 1 SOH 17 DC1! 1 A Q a q STX 2 18 DC2 " 2 B R b

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

スタートアップガイド_応用編

物質工学科 田中晋

comment.dvi

ゲームエンジンの構成要素

P05.ppt

A/B (2010/10/08) Ver kurino/2010/soft/soft.html A/B

FX ) 2

FX自己アフリエイトマニュアル

PowerPoint Presentation

応用数学特論.dvi

Informatics 2010.key

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

C言語によるアルゴリズムとデータ構造

Microsoft PowerPoint - 3.pptx

ポインタ変数

(2 Linux Mozilla [ ] [ ] [ ] [ ] URL 2 qkc, nkc ~/.cshrc (emacs 2 set path=($path /usr/meiji/pub/linux/bin tcsh b

Taro-ファイル処理(公開版).jtd

プログラミング基礎

c-all.dvi

Microsoft PowerPoint - kougi2.ppt

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

18 C ( ) hello world.c 1 #include <stdio.h> 2 3 main() 4 { 5 printf("hello World\n"); 6 } [ ] [ ] #include <stdio.h> % cc hello_world.c %./a.o

PowerPoint プレゼンテーション

Microsoft Word - Cプログラミング演習(3)

£Ã¥×¥í¥°¥é¥ß¥ó¥°(2018) - Âè11²ó – ½ÉÂꣲ¤Î²òÀ⡤±é½¬£² –

Microsoft PowerPoint - C_Programming(3).pptx

「住宅に関する防犯上の指針」案

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

Taro-ポインタ変数Ⅰ(公開版).j

Microsoft Word - Cプログラミング演習(8)

数理.indd

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft Word - Training10_プリプロセッサ.docx

Transcription:

0. 目次 1. 2 分法 2. はさみうち法 3. 割線法 4. 割線法 ( 2 次曲線近似 ) 5. ニュートン法 ( 接線近似 ) - 1 -

1. 2 分法 区間 [x0,x1] にある関数 f(x) の根を求める 区間 [x0,x1] を xm=(x0+x1)/2 で 2 等分し 区間 [x0,xm],[xm,x1] に分割する f(xm) の絶対値が十分小さい値 eps より小さいとき xm を根とする そうでないとき 分割された 2 つの区間の内 根の存在する区間に対して 同様の操作を繰り返す x0 xm x1 プログラム ( rf111.c) f(x) = x 3 - a の根を求める 1 /* << rf111.c >> */ 2 /* 2 分法 */ 3 #include <stdio.h> 4 #include <math.h> 5 6 int main() { 7 int n; /* 繰り返し回数 */ 8 double a, /* aの値 */ 9 eps, /* 誤差 */ 10 fm, /* f(xm) の値 */ 11 x0, /* 区間の左端 */ 12 x1, /* 区間の右端 */ 13 xm; /* 中央値 xm=(x0+x1)/2 */ 14 15 /* データ入力 ( 例 a=8.0) */ 16 scanf("%lf",&a); 17 printf("%lf の立方根 ",a); 18 19 /* 初期設定 */ 20 x0 = 0.0; x1 = 3.0; 21 eps = 1.0e-3; 22 printf(" 初期区間 [%6.2lf,%6.2lf] eps = %6.2le\n\n",x0,x1,eps); 23 printf(" n 近似値 "); 24 printf(" 関数値 \n"); 25 26 /* 計算過程と途中経過出力 */ 27 n = 0; - 2 -

28 while( 1 ) { 29 n++; 30 31 /* 近似値 xm を求める */ 32 xm = (x0 + x1)/2; 33 34 /* 近似値に対応する関数値を求める */ 35 fm = xm*xm*xm - a; 36 printf("%5d%24.16lf%24.16lf \n",n,xm,fm); 37 38 /* 解として出力 */ 39 if( fabs(fm) < eps ) { 40 printf(" 根 : %lf \n",xm); break; 41 } 42 43 /* 根の存在する区間 [x0,x1] を更新する */ 44 if( fm > 0 ) { 45 x1 = xm; 46 } else { 47 x0 = xm; 48 } 49 } 50 } 実行結果 % cc rf111.c -lm % a.out 8 8.000000 の立方根 初期区間 [ 0.00, 3.00] eps = 1.00e-03 n 近似値 関数値 1 1.5000000000000000-4.6250000000000000 2 2.2500000000000000 3.3906250000000000 3 1.8750000000000000-1.4082031250000000 4 2.0625000000000000 0.7736816406250000 5 1.9687500000000000-0.3691711425781250 6 2.0156250000000000 0.1889686584472656 7 1.9921875000000000-0.0933842658996582 8 2.0039062500000000 0.0469666123390198 9 1.9980468750000000-0.0234146192669868 10 2.0009765625000000 0.0117244729772210 11 1.9995117187500000-0.0058579446049407 12 2.0002441406250000 0.0029300451424206 13 1.9998779296875000-0.0014647543448518 14 2.0000610351562500 0.0007324442269692 根 : 2.000061-3 -

2. はさみうち法 区間 [x0,x1] にある関数 f(x) の根を求める 点 (x0,f(x0)) と点 (x1,f(x1)) を結ぶ直線と x 軸との交点 (xm,0) で区間 [x0,x1] を区間 [x0,xm],[xm,x1] に分割する f(xm) の絶対値が十分小さい値 eps より小さいとき xm を根とする そうでないとき 分割された 2 つの区間の内 根の存在する区間に対して 同様の操作を繰り返す (x1,f(x1)) x0 xm x1 (x0,f(x0)) プログラム ( rf121.c) f(x) = x 3 - a の根を求める 1 /* << rf121.c >> */ 2 /* はさみうち法 */ 3 #include <stdio.h> 4 #include <math.h> 5 6 int main() { 7 int n; /* 繰り返し回数 */ 8 double a, /* aの値 */ 9 eps, /* 誤差 */ 10 f0, /* f(x0) の値 */ 11 f1, /* f(x1) の値 */ 12 fm, /* f(xm) の値 */ 13 x0, /* 区間の左端 */ 14 x1, /* 区間の右端 */ 15 xm; /* x 軸との交点 */ 16 17 /* データ入力 ( 例 a=3.0) */ 18 scanf("%lf",&a); 19 printf("%lf の立方根 ",a); 20 21 /* 初期設定 */ 22 x0 = 0.0; x1 = 3.0; 23 eps = 1.0e-3; 24 printf(" 初期区間 [%6.2lf,%6.2lf] eps = %6.2le\n\n",x0,x1,eps); 25 printf(" n 近似値 "); 26 printf(" 関数値 \n"); - 4 -

27 28 /* 計算過程と途中経過出力 */ 29 n = 0; 30 f0 = x0*x0*x0 - a; 31 f1 = x1*x1*x1 - a; 32 while( 1 ) { 33 n++; 34 35 /* x 軸との交点 xm を求める */ 36 xm = x0 - f0*(x1-x0)/(f1-f0); 37 38 /* xm に対応する関数値を求める */ 39 fm = xm*xm*xm - a; 40 printf("%5d%24.16lf%24.16lf \n",n,xm,fm); 41 42 /* 解として出力 */ 43 if( fabs(fm) < eps ) { 44 printf(" 根 : %lf \n",xm); break; 45 } 46 47 /* 根の存在する区間 [x0,x1] を求める */ 48 if( fm > 0 ) { 49 x1 = xm; f1 = fm; 50 } else { 51 x0 = xm; f0 = fm; 52 } 53 } 54 } 実行結果 % cc rf121.c -lm % a.out 8 8.000000 の立方根 初期区間 [ 0.00, 3.00] eps = 1.00e-03 n 近似値 関数値 1 0.8888888888888888-7.2976680384087791 2 1.4747274529236867-4.7927316770215107 3 1.7819734703922894-2.3414689644553830 4 1.9156086630638791-0.9705656832068890 5 1.9683098752124191-0.3742877386484231 6 1.9882408770124156-0.1402814400263273 7 1.9956561821205037-0.0520126839937651 8 1.9983980770838818-0.0192076821620288 9 1.9994096045728158-0.0070826539314401 10 1.9997824569261708-0.0026102329463118 11 1.9999198486188070-0.0009617780293674 根 : 1.999920-5 -

3. 割線法 2 点 (x0,f(x0)),(x1,f(x1)) を結ぶ直線と X 軸との交点 (xm,0) を求め 根の近似値とする f(xm) の絶対値が十分小さい値 eps より小さいとき xm を根とする そうでないとき 点 (x1,f(x1)) と点 (xm,f(xm)) を 2 点として同様の操作を繰り返す (x1,f(x1)) x0 xm x1 (x0,f(x0)) 区間 [x0,x1] に根が存在していない場合でも 自動的に根の存在する区間をさがしていくことができる (x0,f(x0)) x0 x1 (x1,f(x1)) xm (xm,f(xm)) プログラム ( rf131.c) f(x) = x 3 - a の根を求める 1 /* << rf131.c >> */ 2 /* 割線法 */ 3 #include <stdio.h> 4 #include <math.h> 5 6 int main() { 7 int n; /* 繰り返し回数 */ 8 double a, /* aの値 */ 9 eps, /* 誤差 */ 10 f0, /* f(x0) の値 */ 11 f1, /* f(x1) の値 */ 12 fm, /* f(xm) の値 */ 13 x0, /* 区間の左端 */ 14 x1, /* 区間の右端 */ 15 xm; /* x 軸との交点 */ - 6 -

16 17 /* データ入力 ( 例 a=8.0) */ 18 scanf("%lf",&a); 19 printf("%lf の立方根 \n\n",a); 20 21 /* 初期設定 */ 22 x0 = 0.0; x1 = 3.0; 23 eps = 1.0e-3; 24 printf(" 初期区間 [%6.2lf,%6.2lf] eps = %6.2le \n\n",x0,x1,eps); 25 printf(" n 近似値 "); 26 printf(" 関数値 \n"); 27 28 /* 計算過程と途中経過出力 */ 29 n = 0; 30 31 /* x0,x1の関数値を求める */ 32 f0=x0*x0*x0 - a; 33 f1=x1*x1*x1 - a; 34 while( 1 ) { 35 n++; 36 37 /* x 軸との交点 xm を求める */ 38 xm = x0 - f0*(x1-x0)/(f1-f0); 39 40 /* xm に対応する関数値を求める */ 41 fm = xm*xm*xm - a; 42 printf("%5d%24.16lf%24.16lf \n",n,xm,fm); 43 44 /* 解として出力 */ 45 if( fabs(fm) < eps ) { 46 printf(" 根 : %lf \n",xm); break; 47 } 48 49 /* 新たな区間 ( 根が存在しない場合もある ) を求める */ 50 x0 = x1; f0 = f1; 51 x1 = xm; f1 = fm; 52 } 53 } - 7 -

実行結果 % cc rf131.c -lm % a.out 8 8.000000 の立方根 初期区間 [ 0.00, 3.00] eps = 1.00e-03 n 近似値 関数値 1 0.8888888888888888-7.2976680384087791 2 1.4747274529236867-4.7927316770215107 3 2.5956210160301723 9.4873436900274264 4 1.8509258936452322-1.6588636283051441 5 1.9617571044256743-0.4501955634842156 6 2.0030386777882758 0.0365195628933375 7 1.9999412087904005-0.0007054737769598 根 : 1.999941-8 -

4. 割線法 ( 2 次曲線近似 ) 3 点 (x0,f(x0)),(x1,f(x1)),(x2,f(x2)) を通る 2 次曲線と x 軸との交点 (xm,0) を求め 根の近似値とする 2 次曲線が虚根を持つときは 軸の x 座標を根の近似値とする f(xm) の絶対値が十分小さい値 eps より小さいとき xm を根とする そうでないとき 点 (x1,f(x1)),(x2,f(x2)),(xm,f(xm)) を 3 点として同様の操作を繰り返す プログラム ( rf141.c) f(x) = x 3 - a の根を求める 1 /* << rf141.c>> */ 2 /* 割線法 ( 2 次曲線近似 ) */ 3 #include <stdio.h> 4 #include <math.h> 5 6 int main() { 7 int n; /* 繰り返し回数 */ 8 double a, /* aの値 */ 9 d, /* 2 次曲線の判別式 d=q*q-4*p*r */ 10 eps, /* 誤差 */ 11 f0,f1,f2, /* f(x0),f(x1),f(x2) の値 */ 12 fm, /* f(xm) の値 */ 13 p,q,r, /* 2 次曲線の係数 */ 14 t0,t1, 15 x0,x1,x2, /* x0,x1,x2の値 */ 16 xm, /* 2 次曲線と x 軸との交点 */ 17 z0,z1; /* 2 次曲線の実根 */ 18 19 /* データ入力 ( 例 a=8.0) */ 20 scanf("%lf",&a); 21 printf("%lf の立方根 ",a); 22 23 /* 初期設定 */ 24 x0 = 0.0; x1 = 1.0; x2 = 3.0; 25 eps = 1.0e-10; 26 printf(" 初期値 x0 =%6.2lf x1 =%6.2lf x2 =%6.2lf ",x0,x1,x2); 27 printf("eps = %6.2le \n\n",eps); 28 printf(" n 近似値 "); 29 printf(" 関数値 \n"); 30 31 /* 計算過程と途中経過の出力 */ 32 n = 0; 33 34 /* x0,x1,x2 に対応する関数値を求める */ 35 f0 = x0*x0*x0 - a; 36 f1 = x1*x1*x1 - a; - 9 -

37 f2 = x2*x2*x2 - a; 38 while( 1 ) { 39 n++; 40 41 /* 2 次曲線 : y=p*x*x+q*x+r を求める */ 42 t0 = (f1 - f0)/(x1 - x0); 43 t1 = (f2 - f1)/(x2 - x1); 44 p = (t0 - t1)/(x0 - x2); 45 q = t0 - p*(x0 + x1); 46 r = f0 - p*x0*x0 - q*x0; 47 48 /* 2 次曲線の根から近似値を求める */ 49 /* 虚根の場合 2 次曲線の軸を近似値とする */ 50 /* 実根の場合 2 根 z0,z1の内 絶対値 x2-z0, x2-z1 の */ 51 /* 小さい方を新近似値とする */ 52 d = q*q - 4*p*r; 53 if( d < 0 ) { /* 虚根の場合 */ 54 xm = -q*(2*p); 55 } else { /* 実根の場合 */ 56 if( q > 0 ) { 57 z0 = (-q - sqrt(d))/(2*p); z1 = (r/p)/z0; 58 } else { 59 z0 = (-q + sqrt(d))/(2*p); z1 = (r/p)/z0; 60 } 61 if( fabs(x2-z0) < fabs(x2-z1) ) { 62 xm = z0; 63 } else { 64 xm = z1; 65 } 66 } 67 68 /* xm に対応する関数値を求める */ 69 fm = xm*xm*xm - a; 70 printf("%5d%24.16lf%24.16lf \n",n,xm,fm); 71 72 /* 解として出力 */ 73 if( fabs(fm) < eps ) { 74 printf(" 根 : %lf \n",xm); break; 75 } 76 77 /* 3 点を更新する */ 78 x0 = x1; f0 = f1; 79 x1 = x2; f1 = f2; 80 x2 = xm; f2 = fm; 81 } 82 } - 10 -

実行結果 % cc rf141.c -lm % a.out 8 8.000000 の立方根 初期値 x0 = 0.00 x1 = 1.00 x2 = 3.00 eps = 1.00e-10 n 近似値 関数値 1 1.8380874888399532-1.7899008098476195 2 1.9874747382256139-0.1493638131879352 3 1.9998333784254341-0.0019992923229223 4 2.0000000281638264 0.0000003379659213 5 1.9999999999999951-0.0000000000000586 根 : 2.000000-11 -

5. ニュートン法 ( 接線近似 ) 根の近似値 x1 から始め 点 (x1,f(x1)) を通る関数 f(x) の接線と x 軸との交点 (x2,0) を求める f(x2) の絶対値が十分小さい値 eps より小さいとき x2 を根とする そうでないとき x2 を近似値として 同様のことを繰り返す 関数 f(x) = x*x - a = 0 の根を求める場合 (x1,f(x1)) x2 x1 プログラム ( rf151.c) f(x) = x 3 - a の根を求める 1 /* << rf151.c >> */ 2 /* ニュートン法 ( 接線近似 ) */ 3 #include <stdio.h> 4 #include <math.h> 5 6 int main() { 7 int n; /* 繰り返し回数 */ 8 double a, /* aの値 */ 9 eps, /* 誤差 */ 10 fx, /* f(x2) の値 */ 11 x1,x2; /* x1,x2の値 */ 12 13 /* データ入力 ( 例 a=8.0) */ 14 scanf("%lf",&a); 15 printf("%lf の立方根 ",a); 16 17 /* 初期設定 */ 18 x1 = 1.0; eps = 1.0e-10; 19 printf(" 初期値 x1 = %6.2lf eps = %6.2le \n\n",x1,eps); 20 printf(" n 近似値 "); 21 printf(" 関数値 \n"); 22-12 -

23 /* 計算過程と途中経過の出力 */ 24 n = 0; 25 while( 1 ) { 26 n++; 27 28 /* 近似値 x2 を求める */ 29 x2 = (2*x1*x1*x1 + a)/(3*x1*x1); 30 31 /* x2 に対応する関数値を求める */ 32 fx = x2*x2*x2 - a; 33 printf("%5d%24.16lf%24.16lf \n",n,x2,fx); 34 35 /* 解として出力 */ 36 if( fabs(fx) < eps ) { 37 printf(" 根 : %lf \n",x2); break; 38 } 39 x1 = x2; 40 } 41 } 実行結果 % cc rf151.c -lm % a.out 8 8.000000 の立方根 初期値 x1 = 1.00 eps = 1.00e-10 n 近似値 関数値 1 3.3333333333333335 29.0370370370370416 2 2.4622222222222221 6.9273164554183788 3 2.0813412476715789 1.0163315496105632 4 2.0031374991412871 0.0377090839858456 5 2.0000049116755041 0.0000589402507966 6 2.0000000000120624 0.0000000001447482 7 2.0000000000000000 0.0000000000000000 根 : 2.000000-13 -