12.数値微分と数値積分.

Slides:



Advertisements
Similar presentations
計測工学 10 データの補間 スプライン補間 1. . 復習 階差 近似多項式の次数 の決定法 等間隔階差 – 関数 y=f(x) で、 x の値 が等間隔の場合 等間隔: x 0, x 0 +h, x 0 +2h ・・・ y の値: y 0, y 1, y 2 ・・・ これらの階差は – 第1階差:
Advertisements

2. 数値微分法. 数値微分が必要になる場合として、次の 2 つが考えられる。 関数が与えられていて、その微分を近似的に計算する。 (数値微分の精度が十分で、かつ、計算速度が数値微分の方が 早い場合など。) 離散的な点の上で離散的なデータしかわかっていない関数の微 分を近似的に計算する。(偏微分方程式の数値解を求めたい時.
数値解析シラバス C言語環境と数値解析の概要(1 回) C言語環境と数値解析の概要(1 回) 方程式の根(1回) 方程式の根(1回) 連立一次方程式(2回) 連立一次方程式(2回) 補間と近似(2回) 補間と近似(2回) 数値積分(1回) 数値積分(1回) 中間試験(1回) 中間試験(1回) 常微分方程式(1回)
1. 補間多項式 n 次の多項式 とは、単項式 の 線形結合の事である。 Definitions: ( 区間, 連続関数, abscissas (データ点、格子点、差分点), 多項 式 ) Theorem. (補間多項式の存在と一意性) 各 i = 0, …, n について、 をみたす、次数が高々 n.
数学のかたち 数学解析の様々なツール GRAPSE編 Masashi Sanae.
第1回 確率変数、確率分布 確率・統計Ⅰ ここです! 確率変数と確率分布 確率変数の同時分布、独立性 確率変数の平均 確率変数の分散
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
連続系アルゴリズム演習第3回 DE変換を用いた数値積分法.
・力のモーメント ・角運動量 ・力のモーメントと角運動量の関係
電子情報工学科5年(前期) 7回目(21/5/2015) 担当:古山彰一
プログラミング論 数値積分
プログラミング論 I 補間
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
Natural Semantics 実行過程の、最初と最後の状態(state)の関係を考える。
応用統計学の内容 推測統計学(inferential statistics)   連続型の確率分布   標本分布   統計推定   統計的検定.
4.2 連立非線形方程式 (1)繰返し法による方法
非線形方程式の近似解 (2分法,はさみうち法,Newton-Raphson法)
2008年6月12日 非線形方程式の近似解 Newton-Raphson法
10. 積分 積分・・確率モデルと動学モデルで使われる この章は計算方法の紹介 積分の定義から
誤差の二乗和の一次導関数 偏微分.
マイクロソフト Access を使ってみよう 第4回
2. 関数を使ったプログラムの 作成と実行 プログラミング論I.
7.プログラム設計法と 種々のエラー.
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
数値積分.
プログラミング論 II 2008年吉日 主成分分析 数値積分
応用統計学の内容 推測統計学(inferential statistics)   連続型の確率分布   標本分布   統計推定   統計的検定.
10.構造体とグラフィックス.
LU分解を用いた連立一次方程式.
Curriki原典
6. リスト処理関数の設計(発展版) プログラミング論 I.
6.リストの生成.
8. 高階関数を用いた抽象化 プログラミング論I.
計測工学 -誤差、演習問題 計測工学(第6回) 2009年5月26日 Ⅱ限目.
原子動力工学特論 レポート1 交通電子機械工学専攻 齋藤 泰治.
3.条件式.
概要.
4.リスト,シンボル,文字列.
疑似乱数, モンテカルロ法によるシミュレーション
11.再帰と繰り返しの回数.
ex-8. 平均と標準偏差 (Excel 実習シリーズ)
9.構造体.
15.cons と種々のデータ構造.
高度プログラミング演習 (01).
22・3 積分形速度式 ◎ 速度式: 微分方程式 ⇒ 濃度を時間の関数として得るためには積分が必要
フーリエ級数.
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
2.関数の組み合わせ によるプログラム.
数値解析 第6章.
ex-8. 平均と標準偏差 (Excel を演習で学ぶシリーズ)
13.ニュートン法.
~sumii/class/proenb2009/ml6/
1.Scheme の式とプログラム.
2008年6月5日 非線形方程式の近似解 2分法,はさみうち法,Newton-Raphson法)
ニュートン法による 非線型方程式の解.
モデルの微分による非線形モデルの解釈 明治大学 理工学部 応用化学科 データ化学工学研究室 金子 弘昌.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
確率的フィルタリングを用いた アンサンブル学習の統計力学 三好 誠司 岡田 真人 神 戸 高 専 東 大, 理 研
Cプログラミング演習 ニュートン法による方程式の求解.
確率的フィルタリングを用いた アンサンブル学習の統計力学 三好 誠司 岡田 真人 神 戸 高 専 東 大, 理 研
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
ねらい 数値積分を例題に、擬似コードのアルゴリズムをプログラムにする。
信号データの変数代入と変数参照 フィードバック制御系の定常特性 フィードバック制御系の感度特性
4. 合成データ:構造体 プログラミング論I.
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
9. 再帰のバリエーション (生成的再帰) プログラミング論 I.
8.2 数値積分 (1)どんなときに数値積分を行うのか?
8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。
Presentation transcript:

12.数値微分と数値積分

説明資料

今日の内容 接線の傾き d/dx 台形則による数値積分 trapezoid

接線の傾き f(x) 接線 傾きは x h を 0 に近づけることで、接線の傾き(=f '(x) )の「近似値」が求まる

定積分 f(x) x a b 定積分:  区間 [a, b] で,連続関数 f, x軸, x=a, x=b で囲まれた面積

区間 [a, b] の小区間への分割 f(x) x x1 x2 xn-1 x0 = a xn = b n 個の等間隔な小区間に分割 幅: h = (b-a) / n 小区間: [x0, x1], [x1, x2], ..., [xn-1, xn] 但し,x0 = a, xi = x0 + i × h

小長方形 f(x) f(xi) xi xi+1 x x0 = a xn = b 小長方形 小長方形の面積は

小台形 f(x) f(xi) f(xi+1) xi xi+1 x x0 = a xn = b 小台形 小台形の面積は

台形則 trapezoidal rule x1 x2 x3 xn-1 xn-2 f(x) x x0 = a xn = b 小台形の面積の和は 定積分 I を,この和 Sn で近似 ⇒ 台形則という

台形則による数値積分 区間[a,b]を n 等分 (1区間の幅h=(b-a)/n) n 個の台形を考え, その面積の和 Sn で,定積分 I を近似 f(x) が連続関数のときは,n を無限大に近づければ,Sn は I に近づく 但し,単純に「n を大きくすればよい」とは言えない n を大きくすると ⇒ 計算時間の問題,丸め誤差の問題が発生

数値積分の意味 式で書いてある関数の積分 ⇒ ごく限られた関数しか定積分できない 「数値積分」が重要になる

台形則 両端 x0 = a と xn = b を除いて,f(xi) は2度現れる 2回現れる部分 但し  h = (b-a) / n

実習

実習の進め方 資料を見ながら,「例題」を行ってみる 各自,「課題」に挑戦する 自分のペースで先に進んで構いません 各自で自習 + 巡回指導 各自で自習 + 巡回指導 遠慮なく質問してください 自分のペースで先に進んで構いません

DrScheme の使用 DrScheme の起動 今日の演習では「Advanced Student」 に設定 プログラム → PLT Scheme → DrScheme 今日の演習では「Advanced Student」 に設定 Language → Choose Language → Advanced Student → OK → 「Execute ボタン」

例題1.接線の傾き 接線の傾きを求める関数 d/dx を作り,実行する 数値 x, h と関数 f から,x における f の傾き(= f' (x))の近似値を求める d/dx は高階関数

「例題1.接線の傾き」の手順 次を「定義用ウインドウ」で,実行しなさい 入力した後に,Execute ボタンを押す ;; d/dx: (number->number) number number -> number ;; inclination of the tangent ;; Example: (d/dx f 3 0.0001) ;; = ((- (f 3.0001) (f 2.9999)) 0.0002) (define (d/dx f x h) (/ (- (f (+ x h)) (f (- x h))) (* 2 h))) (define (f2 x) (- (* x x) 2)) 2. その後,次を「実行用ウインドウ」で実行しなさい (d/dx f2 3 0.0001) ☆ 次は,例題2に進んでください

まず,関数 d/dx を定義している

次に関数 f2 を定義している (define (f2 x) (- (* x x) 2))

これは, (d/dx f2 3 0.0001) と書いて,x の値を 3 に, h の値を 0.0001 に, f を f2 に設定しての実行  実行結果である「6」が 表示される 

入力と出力 f2 3 0.0001 f2'(3) の近似値 d/dx 入力は2つの数値と 出力は数値 関数 出力 入力 (つまり高階関数)

d/dx 関数 ;; d/dx: (number->number) number number -> number ;; inclination of the tangent ;; Example: (d/dx f 3 0.0001) ;; = ((- (f 3.0001) (f 2.9999)) 0.0002) (define (d/dx f x h) (/ (- (f (+ x h)) (f (- x h))) (* 2 h))) 関数が, 「d/dx」の入力になっている

(dx/d f2 3 0.0001) から 6 が得られる過程の概略 (dx/d f2 3 0.0001) = (/ (- (f2 (+ 3 0.0001)) (f2 (- 3 0.0001))) (* 2 0.0001)) = (/ (- (- (* (+ 3 0.0001) (+ 3 0.0001)) 2) (- (* (- 3 0.0001) (- 3 0.0001)) 2) (* 2 0.0001))) = … = 6 最初の式 コンピュータ内部での計算 実行結果 但し,f2 は   (define (f2 x)    (- (* x x) 2))

(dx/d f2 3 0.0001) から 6 が得られる過程の概略 (dx/d f2 3 0.0001) = (/ (- (f2 (+ 3 0.0001)) (f2 (- 3 0.0001))) (* 2 0.0001)) = (/ (- (- (* (+ 3 0.0001) (+ 3 0.0001)) 2) (- (* (- 3 0.0001) (- 3 0.0001)) 2) (* 2 0.0001))) = … = 6 これは, (define (d/dx f x h) (/ (- (f (+ x h)) (f (- x h))) (* 2 h))) の x を 3 で,h を 0.0001 で, f を f2 で置き換えたもの

(dx/d f2 3 0.0001) から 6 が得られる過程の概略 (dx/d f2 3 0.0001) = (/ (- (f2 (+ 3 0.0001)) (f2 (- 3 0.0001))) (* 2 0.0001)) = (/ (- (- (* (+ 3 0.0001) (+ 3 0.0001)) 2) (- (* (- 3 0.0001) (- 3 0.0001)) 2) (* 2 0.0001))) = … = 6 これは, (define (f2 x) (- (* x x) 2)) の x を (+ 3 0.0001) や (- 3 0.0001) で置き換えたもの

例題2.台形則による数値積分 台形則による数値積分の関数 trapezoid を作り,実行する 但し, 積分したい関数 f(x) = e 積分区間: [a, b] 区間数: n -x2

「例題2.台形則による数値積分」の手順 次を「定義用ウインドウ」で,実行しなさい (trapezoid f2 0 1 1000) 入力した後に,Execute ボタンを押す (define (trapezoid-iter f a h k) (cond [(= k 1) (f (+ a h))] [else (+ (f (+ a (* h k))) (trapezoid-iter f a h (- k 1)))])) ;; trapezoid: number number number -> number ;; to compute the area under the graph of f between a and b (define (trapezoid f a b n) (* (/ (- b a) n) (+ (trapezoid-iter f a (/ (- b a) n) (- n 1)) (/ (f a) 2) (/ (f b) 2)))) (define (f2 x) (exp (- (* x x)))) 2. その後,次を「実行用ウインドウ」で実行しなさい (trapezoid f2 0 1 1000) ☆ 次は,課題に進んでください

まず,関数 trapezoid-iter, trapezoid を定義している

次に関数 f2 を定義している (define (f2 x) (exp (- (* x x)))) これは,数値積分したい関数

これは, (trapezoid f2 0 1 1000) と書いて,a の値を 0 に, b の値を 1 に,h の値を 1000 に, f を f2 に設定しての実行  実行結果である 「#i0.7468240714991842」 が表示される 

(define (trapezoid-iter f a h k) (cond [(= k 1) (f (+ a h))] [else (+ (f (+ a (* h k))) (trapezoid-iter f a h (- k 1)))])) ;; trapezoid: number number number -> number ;; to compute the area under the graph of f between a and b (define (trapezoid f a b n) (* (/ (- b a) n) (+ (trapezoid-iter f a (/ (- b a) n) (- n 1)) (/ (f a) 2) (/ (f b) 2))))

例題3.台形則の計算の精度 例題2での台形則の計算の精度が,分割幅を小さくするほど高精度になることを確かめる. 但し, 積分したい関数 f(x) = e 積分区間 0 から 1 分割数 10, 20, 40, 80, 160, 320, 640, 1280 の8通り -x2

例題3.「台形則の計算の精度」の手順(1/2) 次を「定義用ウインドウ」で,実行しなさい 入力した後に,Execute ボタンを押す (define (trapezoid-iter f a h k) (cond [(= k 1) (f (+ a h))] [else (+ (f (+ a (* h k))) (trapezoid-iter f a h (- k 1)))])) ;; trapezoid: number number number -> number ;; to compute the area under the graph of f between a and b (define (trapezoid f a b n) (* (/ (- b a) n) (+ (trapezoid-iter f a (/ (- b a) n) (- n 1)) (/ (f a) 2) (/ (f b) 2)))) (define (f2 x) (exp (- (* x x)))) これは,例題2と同じ

例題3.「台形則の計算の精度」の手順(2/2) その後,次を「実行用ウインドウ」で実行しなさい (trapezoid 0 1 10) (trapezoid 0 1 20) (trapezoid 0 1 40) (trapezoid 0 1 80) (trapezoid 0 1 160) (trapezoid 0 1 320) (trapezoid 0 1 640) (trapezoid 0 1 1280) ☆ 次は,課題に進んでください

数値積分の精度 分割幅を小さくするほど高精度

おわりに 近似値を求める手法 数値微分,数値積分 十分に役に立つ 「必ず誤差が生じる」ことを意識しながら使うことが必要

今日の実習課題

課題1 f(x) = x cos x について,f'(0), f'(0.2), f'(0.4), f'(0.6) の値を報告しなさい 関数 d/dx (授業の例題1)を使いなさい h = 0.1 としなさい

演習2 f(x) = x cos x について,h = 0.1, 0.01, 0.001 と変えて関数 d/dx を実行し,結果を比べなさい

演習3 台形則を使って,次を計算せよ 計算結果を,以下と比較せよ DrScheme での (log 2) の実行結果

演習4 演習3について,区間数 n を,n = 4, 8, 16, 32, 64, 128 と変えて計算を行い,刻み幅と誤差の関係を調べよ 演習4  演習3について,区間数 n を,n = 4, 8, 16, 32, 64, 128 と変えて計算を行い,刻み幅と誤差の関係を調べよ 区間数 n と誤差の関係を書いたグラフを作成せよ この場合,おおよそ次の関係が成り立っていることを確認せよ (c は定数)

演習4.関数のグラフ 関数 d/dx (例題1)を使って,関数のグラフをグラフィックスで表示させなさい プログラムは次ページ以降にある.このプログラムを実行させ,実行結果を報告しなさい 但し,実行結果の報告では,必ず 関数 f2 を別のものに書き換えて実行しなさい

;; d/dx: (number->number) number number -> number ;; inclination of the tangent ;; Example: (d/dx f 3 0.0001) ;; = ((- (f 3.0001) (f 2.9999)) 0.0002) (define (d/dx f x h) (/ (- (f (+ x h)) (f (- x h))) (* 2 h))) ;; samples: (number->number) number number number -> list of 'posn' structure (define (samples f a h k) (cond [(= k 1) (cons (make-posn (+ a h) (f (+ a h))) empty)] [else (cons (make-posn (+ a (* h k)) (f (+ a (* h k)))) (samples f a h (- k 1)))]))

; window size (define WX 500) (define WY 500) ; grid color, axis color and (define GRID_COLOR 'blue) (define AXIS_COLOR 'red) (define GRAPH_COLOR 'red) ; draw-a-line (define (sessen x px py d) (+ (* d (- x px)) py)) (define (draw-a-sessen from to px py d x0 y0 sx sy) (draw-solid-line (make-posn (+ (* from sx) x0) (+ (* (sessen from px py d) sy) y0)) (make-posn (+ (* to sx) x0) (+ (* (sessen to px py d) sy) y0)) GRAPH_COLOR)) (define (draw-sessen f px x0 y0 sx sy) (draw-a-sessen (/ (- x0) sx) (/ (- WX x0) sx) px (f px) (d/dx f px 0.00001) x0 y0 sx sy))

; draw-polyline (define (draw-polyline a-poly) (cond [(empty? (rest a-poly)) true] [else (and (draw-solid-line (first a-poly) (first (rest a-poly)) GRAPH_COLOR) (draw-polyline (rest a-poly)))])) ; draw-h-lines (define (draw-h-lines start skip stop width) [(>= start stop) (draw-solid-line (make-posn 0 stop) (make-posn width stop) GRID_COLOR)] [else (and (draw-solid-line (make-posn 0 start) (make-posn width start) GRID_COLOR) (draw-h-lines (+ start skip) skip stop width))]))

; draw-v-lines (define (draw-v-lines start skip stop height) (cond [(>= start stop) (draw-solid-line (make-posn stop 0) (make-posn stop height) GRID_COLOR)] [else (and (draw-solid-line (make-posn start 0) (make-posn start height) GRID_COLOR) (draw-v-lines (+ start skip) skip stop height))])) ; (x0, y0) is the origin. sx and sy represent one grid size (define (draw-grid x0 y0 sx sy) (draw-v-lines (- x0 (* (quotient x0 sx) sx)) sx (+ (* (quotient (- WX x0) sx) sx) x0) WY) (draw-h-lines (- y0 (* (quotient y0 sy) sy)) sy (+ (* (quotient (- WY y0) sy) sy) y0) WX) (draw-solid-line (make-posn 0 y0) (make-posn WX y0) AXIS_COLOR) (draw-solid-line (make-posn x0 0) (make-posn x0 WY) AXIS_COLOR)))

; (x0, y0) is the origin. sx and sy represent one grid size (define (scaling a-list x0 y0 sx sy) (cond [(empty? a-list) empty] [else (cons (make-posn (+ (* (posn-x (first a-list)) sx) x0) (+ (* (posn-y (first a-list)) sy) y0)) (scaling (rest a-list) x0 y0 sx sy))])) ; ; f2: number -> number (define (f2 x) (- (* x x) 2)) ; (X0, Y0) reprerents the origin of the graph. ; SX and SY represent the size of one grid (define X0 (/ WX 2)) (define Y0 (/ WY 2)) (define SX 50) (define SY 50) (define PX 0.5) (start WX WY) (draw-grid X0 Y0 SX SY) (draw-polyline (scaling (samples f2 (/ (- X0) SX) (/ 1 SX) WX) X0 Y0 SX SY)) (draw-sessen f2 PX X0 Y0 SX SY)