スライド 1

Similar documents
スライド 1

スライド 1

スライド 1

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

Microsoft Word - NumericalComputation.docx

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

スライド 1

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 )

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

演習課題No12

memo

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

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

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

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

memo

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() 2 double *a[ ]; double 1 malloc() dou

今後の予定 6/29 パターン形成第 11 回 7/6 データ解析第 12 回 7/13 群れ行動 ( 久保先生 ) 第 13 回 7/17 ( 金 ) 休講 7/20 まとめ第 14 回 7/27 休講?

数学 t t t t t 加法定理 t t t 倍角公式加法定理で α=β と置く. 三角関数

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() malloc 2 #include <stdio.h> #include

PowerPoint Presentation

Microsoft Word - 03-数値計算の基礎.docx

スライド 1

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

02: 変数と標準入出力

PowerPoint プレゼンテーション

情報実習Ⅱ

PowerPoint プレゼンテーション

Microsoft PowerPoint - 4.pptx

02: 変数と標準入出力

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

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

Microsoft PowerPoint - ca ppt [互換モード]

PowerPoint プレゼンテーション

#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

Microsoft PowerPoint - 09.pptx

プログラミング基礎

PowerPoint Presentation

講習No.12

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

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

8 / 0 1 i++ i 1 i-- i C !!! C 2

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

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

微分方程式 モデリングとシミュレーション

DVIOUT

Microsoft PowerPoint - 計算機言語 第7回.ppt

joho07-1.ppt

joho09.ppt

Microsoft PowerPoint - NA03-09black.ppt

C 言語第 7 回 掛け算 (multiply number) ìz1 = x1 + iy1 í îz = x + iy 割り算 (devide number) ( )( ) ( ) Þ z z = x + iy x + iy = x x - y y + i y x + x y

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

/* 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

kiso2-09.key

1 4 2 EP) (EP) (EP)

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

微分積分 サンプルページ この本の定価 判型などは, 以下の URL からご覧いただけます. このサンプルページの内容は, 初版 1 刷発行時のものです.

Microsoft Word - 資料 (テイラー級数と数値積分).docx

x = a 1 f (a r, a + r) f(a) r a f f(a) 2 2. (a, b) 2 f (a, b) r f(a, b) r (a, b) f f(a, b)

‚æ2›ñ C„¾„ê‡Ìš|

プログラミング基礎

02: 変数と標準入出力

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)* (

P06.ppt

kiso2-06.key

学習指導要領

プログラミングI第10回

PowerPoint プレゼンテーション

講習No.10

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

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

C C UNIX C ( ) 4 1 HTML 1

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

工業数学F2-04(ウェブ用).pptx

Microsoft PowerPoint - lec10.ppt

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

プログラミング基礎

広島工業大学紀要研究編第 44 巻 (2010)pp 論文 複素関数の積分に対する数値積分の試み 殿塚勲 * Application of Numerical method to Complex integration ( 平成 21 年 10 月 27 日受理 ) Isao TON

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

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

:30 12:00 I. I VI II. III. IV. a d V. VI

12 15 / sample program for a Information class DATE: heron s formula / #include <stdio.h> / for printf() / #include <math.h> / for sqrt() /

debug ( ) 1) ( ) 2) ( ) assert, printf ( ) Japan Advanced Institute of Science and Technology

新・明解C言語 実践編

02: 変数と標準入出力

Microsoft Word - 13

Microsoft PowerPoint pptx[読み取り専用]

数値計算

プログラミング実習I

memo

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

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

02: 変数と標準入出力

プログラミング実習I


cp-7. 配列

‚æ4›ñ

void hash1_init(int *array) int i; for (i = 0; i < HASHSIZE; i++) array[i] = EMPTY; /* i EMPTY */ void hash1_insert(int *array, int n) if (n < 0 n >=

02: 変数と標準入出力

DVIOUT

Transcription:

数値解析 平成 24 年度前期第 7 週 [2012 年 5 月 30 日 ] 静岡大学創造科学技術大学院情報科学専攻工学部機械工学科計測情報講座 三浦憲二郎

講義アウトライン [5 月 30 日 ] 数値積分 ニュートン コーツ公式 台形公式 シンプソン公式 多積分

数値積分の必要性 p.135 初等関数 ( しょとうかんすう ) とは 複素数を変数とする多項式関数 指数関数 対数関数主値の四則演算 合成によって表示できる関数である. 三角関数や双曲線関数 そして両者の逆関数主値も初等関数と考えられる. 微分 初等関数の導関数は必ず初等関数になる 積分 初等関数の積分は初等関数であらわされるとは限らない例フレネル積分 数値的に積分する以外方法がない!

ニュートン コーツ公式 p.135 定積分を求めるために, 分点 a=x 0 <x 1 <x 2 < <x n =bをとり,f k =f(x k ) を通るラグランジュ補間多項式 P n (x) を考える. ただし, それぞれの分点は等間隔 h=(b-a)/nで並んでいるとする.p n (x) は多項式なので以下のI n を計算することができる. この近似積分公式を n+1 点のニュートン コーツ公式 (Newton-Cotes) と呼ぶ.

台形公式 p.135 ニュートン コーツ公式 n=1 とする.h=b-a, x 0 =a, x 1 =b, x=a+sh これを台形公式 (Trapezoidal rule) という.

台形公式 p.136 実際の計算区間 [a,b] を n 等分. その分点 x k, 各小区間 [x k,x k+1 ] に適用 これを複合台形公式, あるいは台形公式という.

台形公式 : プログラム p.137 #include <stdio.h> /* 関数の定義 */ double func1(double x); double func2(double x); /* 台形公式 */ double trapezoidal( double a, double b, int n, double (*f)(double) ); int main(void) int n=100; printf("2.0/(x*x) を [1,2] で積分します 分割数は %d です n", n); printf(" 結果は %20.15f です n",trapezoidal(1.0, 2.0, n, func1) ); printf("4.0/(1+x*x) を [0,1] で積分します 分割数は %d です n", n); printf(" 結果は %20.15f です n",trapezoidal(0.0, 1.0, n, func2) ); return 0; /* 台形公式 */ double trapezoidal( double a, double b, int n, double (*f)(double) ) double T, h; int i; /* 関数の定義 */ double func1(double x) return( 2.0/(x*x) ); double func2(double x) return( 4.0 / (1.0+x*x) ); 実行結果 2.0/(x*x) を [1,2] で積分します 分割数は 100 です 結果は 1.000029166020881 4.0/(1+x*x) を [0,1] で積分します 分割数は 100 です 結果は 3.141575986923129 h = ( b - a ) /n ; /* 刻み幅の指定 */ /* 台形公式 */ T = ( (*f)(a) + (*f)(b) ) / 2.0; for ( i = 1; i < n; i++) T += (*f)( a + i*h ); T *= h; return T;

シンプソン公式 p.139 ニュートン コーツ公式 n=2 とする. h=(b-a)/2, x 0 =a, x 1 =a+h, x 2 =a+2h=b x=a+sh これをシンプソン公式 (Simpson s rule) という.

シンプソン公式 p.140 実際の計算区間 [a,b] を 2n 等分. その分点 x k, 各小区間 [x 2k,x 2k+2 ] に適用 これを複合シンプソン公式, あるいはシンプソン公式という.

シンプソン公式 : プログラム p.140 #include <stdio.h> /* 関数の定義 */ double func1(double x); double func2(double x); /* シンプソン公式 */ double simpson( double a, double b, int n, double (*f)(double) ); int main(void) int n=50; printf("2.0/(x*x) を [1,2] で積分します 分割数は %d です n", 2*n); printf(" 結果は %20.15f です n",simpson(1.0, 2.0, n, func1) ); printf("4.0/(1+x*x) を [0,1] で積分します 分割数は %d です n", 2*n); printf(" 結果は %20.15f です n",simpson(0.0, 1.0, n, func2) ); return 0; /* シンプソン公式 */ double simpson( double a, double b, int n, double (*f)(double) ) double S, h; int i; /* 関数の定義 */ double func1(double x) return( 2.0/(x*x) ); double func2(double x) return( 4.0 / (1.0+x*x) ); 実行結果 2.0/(x*x) を [1,2] で積分します 分割数は 100 です 結果は 1.000000002582389 4.0/(1+x*x) を [0,1] で積分します 分割数は 100 です 結果は 3.141592653589754 h = ( b - a ) /( 2.0*n ) ; /* 刻み幅の指定 */ /* シンプソン公式 */ S = ( (*f)(a) + (*f)(b) ) ; for ( i = 1; i < n; i++) S += 4.0*(*f)( a + (2.0*i-1.0)*h ) + 2.0*(*f)( a + 2.0*i*h ); S += 4.0*(*f)( a + (2.0*n-1.0)*h ); S *= h/3.0; return S;

重積分 p.144 重積分 台形公式 シンプソン公式

重積分 p.144 台形公式 [φ(x i ),Ψ(x i )],φ(x i )=y 0 <y 1 < <y m =Ψ(x i ) と m 等分,k=(y m -y 0 )/m シンプソン公式 [φ(x i ),Ψ(x i )],φ(x i )=y 0 <y 1 < <y 2m =Ψ(x i ) と 2m 等分, k=(y 2m -y 0 )/2m

重積分 : プログラム p.145 #include <stdio.h> #include <stdlib.h> /* 被積分関数の定義 */ double func(double x, double y); /* y の積分区間 */ double phi(double x); double psi(double x); /* ベクトル領域の確保 */ double *dvector(int i, int j); /* ベクトル領域の解放 */ void free_dvector(double *a, int i); /* 重積分用の台形公式 */ double trapezoidal2( double a, double b, int m, int n, double (*p)(double), double (*q)(double), double (*f)(double,double) ); int main(void) int n=20, m=20; printf("8x^2+4y を x=[1,2], y=[2-x,x^2] で積分します n"); printf("x の分割数は %d, y の分割数 %d, 結果は %15.10f n", m, n, trapezoidal2( 1.0, 2.0, m, n, phi, psi, func ) ); return 0; /* 重積分用の台形公式 */ double trapezoidal2( double a, double b, int m, int n, double (*p)(double), double (*q)(double), double (*f)(double,double) ) double T, h, k, *F, x, y1, y2; int i, j; F = dvector( 0, n ); h = ( b - a ) /n ; /* 刻み幅の指定 (x 方向 ) */ /* F_i の計算 */ for ( i = 0; i <= n; i++ ) x = a + i*h; y1 = (*p)(x); y2 = (*q)(x); k = ( y2 - y1 )/m; /* 刻み幅の指定 (y 方向 ) */ F[i] = ( (*f)(x, y1) + (*f)(x, y2) ) / 2.0; for ( j = 1; j < m; j++ ) F[i] += (*f)(x, y1+j*k); F[i] *= k; /* 積分の計算 */ T = ( F[0] + F[n] ) / 2.0; for ( i = 1; i < n; i++) T += F[i]; T *= h; free_dvector( F, 0 ); return T; /* 被積分関数の定義 */ double func(double x, double y) return( 8.0*x*x + 4.0*y ); /* y の積分区間 */ double phi(double x) return( 2.0-x ); double psi(double x) return( x*x ); double *dvector(int i, int j) /* a[i]~a[i+j] の領域を確保 */ double *a; if ( (a=(double *)malloc( ((j-i+1)*sizeof(double))) ) == NULL ) printf(" メモリが確保できません (from dvector) n"); exit(1); return(a-i); void free_dvector(double *a, int i) free( (void *)(a + i) ); /* (void *) 型へのキャストが必要 */ -

まとめ 数値積分 ニュートン コーツ公式 台形公式 シンプソン公式 重積分