演習2

Similar documents
演習1

情報処理概論(第二日目)

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

スライド 1

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

cp-7. 配列

Microsoft PowerPoint - 講義10改.pptx

< 中略 > 24 0 NNE 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMD

Microsoft Word - DF-Salford解説09.doc

Microsoft PowerPoint - prog08.ppt

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

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

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

(2-1) x, m, 2 N(m, 2 ) x REAL*8 FUNCTION NRMDST (X, M, V) X,M,V REAL*8 x, m, 2 X X N(0,1) f(x) standard-norm.txt normdist1.f x=0, 0.31, 0.5

3. :, c, ν. 4. Burgers : t + c x = ν 2 u x 2, (3), ν. 5. : t + u x = ν 2 u x 2, (4), c. 2 u t 2 = c2 2 u x 2, (5) (1) (4), (1 Navier Stokes,., ν. t +

3. :, c, ν. 4. Burgers : u t + c u x = ν 2 u x 2, (3), ν. 5. : u t + u u x = ν 2 u x 2, (4), c. 2 u t 2 = c2 2 u x 2, (5) (1) (4), (1 Navier Stokes,.,

< 中略 > 24 0 NNE 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMD

Microsoft PowerPoint - 第3回目.ppt [互換モード]

(Basic Theory of Information Processing) Fortran Fortan Fortan Fortan 1

情報活用資料

PowerPoint プレゼンテーション

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

. (.8.). t + t m ü(t + t) + c u(t + t) + k u(t + t) = f(t + t) () m ü f. () c u k u t + t u Taylor t 3 u(t + t) = u(t) + t! u(t) + ( t)! = u(t) + t u(

格子点データの解析 1 月平均全球客観解析データの解析 客観解析データや衛星観測データのような格子点データは バイナリ形式のデータファイルに記録されていることが多いです バイナリ形式のデータファイルは テキスト形式の場合とは異なり 直接中身を見ることができません プログラムを書いてデータを読み出して

Microsoft PowerPoint - while.ppt

memo

Microsoft PowerPoint - NA03-09black.ppt

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

スライド 1

PowerPoint Presentation

数値計算法

Microsoft PowerPoint - VBA解説1.ppt [互換モード]

Microsoft Word - 資料 docx

memo

スライド 1

PowerPoint プレゼンテーション

相関係数と偏差ベクトル

PowerPoint プレゼンテーション - 物理学情報処理演習

, , B 305, ,

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

Fortran 勉強会 第 5 回 辻野智紀

Microsoft Word - 3new.doc

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

フローチャートの書き方

レコード class Point attr_accessor("x", "y") インスタンス変数の宣言 point.rb

2014年度 九州大・理系数学

Microsoft Word - VBA基礎(6).docx

FORTRAN文法の基礎

モデリングとは

Excelを用いた行列演算

演習1: 演習準備

Fortran90/95 [9]! (1 ) " " 5 "Hello!"! 3. (line) Fortran Fortran 1 2 * (1 ) 132 ( ) * 2 ( Fortran ) Fortran ,6 (continuation line) 1

05 I I / 56

プログラミング基礎

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

PowerPoint Presentation

Microsoft PowerPoint - prog03.ppt

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(VBA) サンプル問題 知識科目 第 1 問 ( 知

Microsoft PowerPoint - 資料04 重回帰分析.ppt

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

2016年度 京都大・文系数学

2010年度 筑波大・理系数学

コンピュータグラフィックス第6回

PowerPoint プレゼンテーション

プログラミング基礎

ex04_2012.ppt

Prog1_6th

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

多変量解析 ~ 重回帰分析 ~ 2006 年 4 月 21 日 ( 金 ) 南慶典

PowerPoint プレゼンテーション - 物理学情報処理演習

Microsoft PowerPoint - 09.pptx

スライド 1

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

Microsoft PowerPoint - e-stat(OLS).pptx

PowerPoint プレゼンテーション

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£²¡Ë

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

2011年度 筑波大・理系数学

スライド 1

スライド 1

プログラミング基礎

Microsoft PowerPoint - prog11.ppt

インテル(R) Visual Fortran Composer XE 2013 Windows版 入門ガイド

PowerPoint プレゼンテーション

gengo1-11

Microsoft PowerPoint - kougi6.ppt

Microsoft Word - 補論3.2

2018年度 岡山大・理系数学

第8回講義(2016年12月6日)

UNIX 初級講習会 (第一日目)

偏微分方程式、連立1次方程式、乱数

複素数平面への誘い

最小二乗法とロバスト推定

memo

Transcription:

神戸市立工業高等専門学校電気工学科 / 電子工学科専門科目 数値解析 2017.6.2 演習 2 山浦剛 (tyamaura@riken.jp) 講義資料ページ h t t p://clim ate.aic s. riken. jp/m embers/yamaura/num erical_analysis. html

曲線の推定 N 次多項式ラグランジュ補間 y = p N x = σ N x x 0 x x 1 x x j 1 x x j+1 (x x N ) j=0 y j = σ x j x 0 x j x 1 x j x j 1 x j x j+1 (x j x N ) j=0 N y j ςn n=0 3 次自然スプライン補間 x x n x j x n n j S x = S j x = a j x x j 3 + bj x x j 2 + cj x x j + d j (x j x x j+1 ) 直線を仮定した最小 2 乗法 y = ሚAx + B

( 補足 ) スプライン補間 係数行列 2 h 0 + h 1 h 1 0 h 1 2 h 1 + h 2 h 2 h N 3 2(h N 3 + h N 2 ) h N 2 0 h N 2 2 h N 2 + h N 1 u 1 u 2 u N 2 u N 1 = v 1 v 2 v N 2 v N 1 定数定義 h j = x j+1 x j j = 0,1,2,, N 1 v j = 6 y j+1 y j h j y j y j 1 h j 1 j = 1,2,3,, N 1 a j = u j+1 u j 6(x j+1 x j ), b j = u j 2, c j = y j+1 y j x j+1 x j 1 6 u j+1 + 2u j x j+1 x j, d j = y j j = 0,1,2,, N 1

( 補足 ) 直線の最小 2 乗法 最適な定数 ሚA, B ሚA = N σ N i=1 B = σ N i=1 N xi y i σ i=1 xi σn i=1 yi N σ N i=1 x 2 i σ N 2 = σ N i=1 xi y i NX Y i=1 x i σ N i=1 x 2 i NX 2 = σ N i=1 xi X y i Y σ N i=1 x i X 2 2 xi σn i=1 N σ N i=1 N yi σ i=1 x i 2 σ i=1 xi y i σn i=1 xi N x i 2 = Y X ሚA

( サンプル ) ラグランジュ補間 program sample_lagrange implicit none! parameter integer, parameter :: num_pt = 3 integer, parameter :: num_lp = 100 real(8), parameter :: px(num_pt) = (/ -1.0d0, 0.0d0, 1.0d0 /) real(8), parameter :: py(num_pt) = (/ 0.05d0, 0.0d0, 0.05d0 /) real(8), parameter :: dx = 2.0d0! work integer :: i, j, n real(8) :: x, y real(8) :: lx! open file for data output open(unit=10, file='output_lagrange.csv') do i = 1, num_lp+1 x = -1.0d0 + dx / dble( num_lp ) * dble( i - 1 ) y = 0.0d0! execute lagrange interpolation do j = 1, num_pt lx = 1.0d0 do n = 1, num_pt if( n /= j ) lx = lx * ( x - px(n) ) / ( px(j) - px(n) ) y = y + lx * py(j)! write data to file write(unit=10, fmt='(2f20.16)') x, y end program

( サンプル ) スプライン補間 program sample_spline implicit none! parameter integer, parameter :: num_pt = 5 integer, parameter :: num_lp = 100 real(8), parameter :: px(num_pt) = & (/ -1.0d0, -0.5d0, 0.0d0, 0.5d0, 1.0d0 /) real(8), parameter :: py(num_pt) = & (/ 0.05d0, 0.2d0, 0.0d0, -0.2d0, -0.05d0 /)! work integer :: i, j real(8) :: u( num_pt ) real(8) :: v( num_pt-2 ) real(8) :: h( num_pt-1 ) real(8) :: h2( num_pt-2, num_pt-2 ) real(8) :: a, b, c, d real(8) :: x, y! determine the U vector u(:) = 0.0d0 do j = 1, num_pt-1 h(j) = px(j+1) - px(j) do j = 1, num_pt-2 v(j) = ( ( py(j+2) - py(j+1) ) & / h(j+1) - ( py(j+1) - py(j) ) / h(j) ) * 6.0d0 h2(:,:) = 0.0d0 do j = 1, num_pt-2 do i = 1, num_pt-2 if( i == j+1 ) h2(i,j) = h(j+1) if( i == j ) h2(i,j) = 2.0d0 * ( h(j+1) + h(j) ) if( i == j-1 ) h2(i,j) = h(j) call MATRIX_SOLVER_tridiagonal( & h2(:,:), v(:), u(2:num_pt-1) )! open file for data output open(unit=10, file='output_spline.csv') do j = 1, num_pt-1 a = ( u(j+1) - u(j) ) / ( 6.0d0 * ( px(j+1) - px(j) ) ) b = u(j) / 2.0d0 c = ( py(j+1) - py(j) ) / ( px(j+1) - px(j) ) & - ( u(j+1) + 2.0d0 * u(j) ) * ( px(j+1) - px(j) ) / 6.0d0 d = py(j) do i = 1, num_lp / num_pt + 1 x = px(j) + ( px(j+1) - px(j) ) / dble( num_lp / num_pt ) * dble( i - 1 ) y = a * ( x - px(j) )**3 + b * ( x - px(j) )**2 + c * ( x - px(j) ) + d! write data to file write(unit=10, fmt='(2f20.16)') x, y end program

Fortran 配列演算 Fortran は配列を四則演算の要素にとることが可能 C/C++ ではできない Fortran の特徴の 1 つ 配列同士の演算操作や 配列を実数倍することなどもできるので 行列演算などを do ループを使わなくても表記できる 配列の要素数は一致している必要がある 多次元配列でも同様に操作可能! 配列に配列を足したものを配列に代入する A(1:10) = B(1:10) + C(1:10)! 配列と整数 配列と実数の演算も可能 D(2:4) = E(5:7) * 5.0! 配列番号を省略することも可能 F(:) = G(:) + H(:) * I(:)! 多次元配列でも同様 J(:,:,:) = K(:,:,:) - L(:,:,:) C と違い 配列の要素番号は 1 から始まる

Fortran 副プログラム Fortran では 手続きをひとまとめにした副プログラムを使うことで 何度も同じような手続きを書かなくても済むようにコードを書くことができる 副プログラムにはサブルーチン形式とファンクション形式がある サブルーチンは call で呼び出される ファンクションは組込関数のように式中に組み込むことができる それぞれ一長一短があるので 目的に応じて使い分けるとよい program testprogram implicit none! --- 宣言部 ---! --- 処理部 --- call f( a, b ) call f( c, d ) stop contains subroutine f( x, y ) implicit none! --- 宣言部! --- 処理部 end subroutine end program

グラフの描画 GNUplot を用いる $ gnuplot > plot output_lagrange.csv u 1:2 w lp gnuplot コマンドの内訳 でくくったファイル名が入力ファイル そのファイルの中身は空白で区切られた列とみなし 1 列目を横軸 2 列目を y 軸とみなす 線 (line: l) と点 (point: p) で結んだ折れ線グラフで表示する 他に output_*.csv の中身を Office ファイルにコピペしてグラフを描かせてみてもよい

課題 1. サンプルプログラム 2-1 を参考に x = ± π 2 の範囲で y = 1 cos x をラグランジュ補間で曲線を推定せよ 推定のために用いるデータは 5 点以上用いること real(8), parameter :: pi = 3.141592653589793d0 2. サンプルプログラム2-1を参考に x = ±1 の範囲で ルンゲ関数 (y = 1 間で曲線を推定せよ 推定のために用いるデータは7 点以上用いること 1+25x 2) をラグランジュ補 3. サンプルプログラム 2-2 を参考に x = ±1 の範囲で ルンゲ関数 (y = 1 1+25x 2) を 3 次自然スプライン補間で曲線を推定せよ 推定のために用いるデータは 7 点以上用いること 4. 下記の表のデータから y = Ax + B を理論式として 最小 2 乗法で理論式の係数 ሚA, B を求めるプログラムを作成せよ x 15.961 11.967 1.180 5.476 14.408 10.591 10.343 6.421 9.574 5.280 9.691 10.532 15.659 8.814 15.644 11.662 y 79.637 56.528 3.464 23.768 68.656 46.281 48.538 28.989 47.785 22.847 49.276 47.392 84.165 43.825 82.966 55.900

提出方法 〆切 : 2017/06/16( 金 ) 講義開始前まで メールにプログラムを添付 主題 : 演習 2 レポート ( 学籍番号 ) 宛先 : tyamaura@riken.jp 本文 : なくても OK 添付 : 学籍番号 _ 課題番号.f90 を 4 ファイル 課題 2-1: r???????_kadai02-1.f90 課題 2-2: r???????_kadai02-2.f90 課題 2-3: r???????_kadai02-3.f90 課題 2-4: r???????_kadai02-4.f90

前期中間試験 6 月 5 日 ( 月 ) 2 時間目 (50 分 ) 出題範囲 第 1 章 数値解析への案内 始め ~ 第 3 章 曲線の推定 終わりまで 教科書 (pp.1~pp.55) 関連する講義ノートのいずれも含む 出題レベル 教科書の章末問題程度 知識を問う問題 計算問題 数値計算プログラムに関する問題

program sample_lagrange implicit none integer, parameter :: num_pt = 5 integer, parameter :: num_lp = 100 real(8), parameter :: pi = 3.141592653589793d0 real(8), parameter :: px(num_pt) = & (/ -pi/2.0d0, -pi/3.0d0, 0.0d0, pi/3.0d0, pi/2.0d0 /) real(8), parameter :: py(num_pt) = & (/ 1.0d0, 0.5d0, 0.0d0, 0.5d0, 1.0d0 /) 課題 1: 解答例 y = 1 cos x の 5 点を考える x 1, y 1 = ( π, 1) 2 x 2, y 2 = ( π, 1 ) 3 2 x 3, y 3 = (0, 0) x 4, y 4 = ( π, 1 ) 3 2 x 5, y 5 = ( π, 1) 2 内挿の始点を考える real(8), parameter :: dx = pi integer :: i, j, n real(8) :: x, y real(8) :: lx open(unit=10, file='output_lagrange.csv') do i = 1, num_lp+1 x = -pi/2.0d0 + dx / dble( num_lp ) * dble( i - 1 ) y = 0.0d0 do j = 1, num_pt lx = 1.0d0 do n = 1, num_pt if( n /= j ) lx = lx * ( x - px(n) ) / ( px(j) - px(n) ) y = y + lx * py(j) write(unit=10, fmt='(2f20.16)') x, y end program

program sample_lagrange implicit none! parameter integer, parameter :: num_pt = 11 integer, parameter :: num_lp = 100 課題 2: 解答例 y = 1 1+25x 2 の 11 点を考える x 1, y 1 = ( 1.0, 0.0385) x 2, y 2 = ( 0.8,0.0588) x 3, y 3 = ( 0.6, 0.1) x 4, y 4 = ( 0.4, 0.2) x 5, y 5 = ( 0.2, 0.5) x 6, y 6 = (0.0, 1.0) x 7, y 7 = (0.2, 0.5) 内挿の始点を考える real(8), parameter :: px(num_pt) = & (/ -1.0d0, -0.8d0, -0.6d0, -0.4d0, -0.2d0, 0.0d0, & 0.2d0, 0.4d0, 0.6d0, 0.8d0, 1.0d0 /) real(8), parameter :: py(num_pt) = & (/ 0.0385d0, 0.0588d0, 0.1d0, 0.2d0, 0.5d0, 1.0d0, & 0.5d0, 0.2d0, 0.1d0, 0.0588d0, 0.0385d0 /) real(8), parameter :: dx = 2.0d0 integer :: i, j, n real(8) :: x, y real(8) :: lx open(unit=10, file='output_lagrange.csv') do i = 1, num_lp+1 x = -1.0d0 + dx / dble( num_lp ) * dble( i - 1 ) y = 0.0d0 do j = 1, num_pt lx = 1.0d0 do n = 1, num_pt if( n /= j ) lx = lx * ( x - px(n) ) / ( px(j) - px(n) ) y = y + lx * py(j) write(unit=10, fmt='(2f20.16)') x, y end program

program sample_spline implicit none integer, parameter :: num_pt = 11 integer, parameter :: num_lp = 100 real(8), parameter :: px(num_pt) = & (/ -1.0d0, -0.8d0, -0.6d0, -0.4d0, -0.2d0, 0.0d0, & 0.2d0, 0.4d0, 0.6d0, 0.8d0, 1.0d0 /) real(8), parameter :: py(num_pt) = & (/ 0.0385d0, 0.0588d0, 0.1d0, 0.2d0, 0.5d0, 1.0d0, & 0.5d0, 0.2d0, 0.1d0, 0.0588d0, 0.0385d0 /) 課題 3: 解答例 y = 1 1+25x 2 の 11 点を考える x 1, y 1 = ( 1.0, 0.0385) x 2, y 2 = ( 0.8,0.0588) x 3, y 3 = ( 0.6, 0.1) x 4, y 4 = ( 0.4, 0.2) x 5, y 5 = ( 0.2, 0.5) x 6, y 6 = (0.0, 1.0) x 7, y 7 = (0.2, 0.5) integer :: i, j real(8) :: u( num_pt ) real(8) :: v( num_pt-2 ) real(8) :: h( num_pt-1 ) real(8) :: h2( num_pt-2, num_pt-2 ) real(8) :: a, b, c, d real(8) :: x, y do j = 1, num_pt-1 h(j) = px(j+1) - px(j) do j = 1, num_pt-2 v(j) = ( ( py(j+2) - py(j+1) ) / h(j+1) - ( py(j+1) - py(j) ) / h(j) ) * 6.0d0 h2(:,:) = 0.0d0 do j = 1, num_pt-2 do i = 1, num_pt-2 if( i == j+1 ) h2(i,j) = h(j+1) if( i == j ) h2(i,j) = 2.0d0 * ( h(j+1) + h(j) ) if( i == j-1 ) h2(i,j) = h(j) u(:) = 0.0d0 call MATRIX_SOLVER_tridiagonal( h2(:,:), v(:), u(2:num_pt-1) ) open(unit=10, file='output_spline.csv ) do j = 1, num_pt-1 a = ( u(j+1) - u(j) ) / ( 6.0d0 * ( px(j+1) - px(j) ) ) b = u(j) / 2.0d0 c = ( py(j+1) - py(j) ) / ( px(j+1) - px(j) ) & - ( u(j+1) + 2.0d0 * u(j) ) * ( px(j+1) - px(j) ) / 6.0d0 d = py(j) do i = 1, num_lp / num_pt + 1 x = px(j) + ( px(j+1) - px(j) ) / dble( num_lp / num_pt ) * dble( i - 1 ) y = a * ( x - px(j) )**3 + b * ( x - px(j) )**2 + c * ( x - px(j) ) + d write(unit=10, fmt='(2f20.16)') x, y end program

program sample_least_square_fitting implicit none ( gradient, intercept ) = 5.3713004751836824-5.4122096019567394 integer, parameter :: num_pt = 16! number of data points real(8), parameter :: px(num_pt) = & (/ 15.961, 11.967, 1.180, 5.476, 14.408, 10.591, & 10.343, 6.421, 9.574, 5.280, 9.691, 10.532, & 15.659, 8.814, 15.644, 11.662 /) real(8), parameter :: py(num_pt) = & (/ 79.637, 56.528, 3.464, 23.768, 68.656, 46.281, & 48.538, 28.989, 47.785, 22.847, 49.276, 47.392, & 84.165, 43.825, 82.966, 55.900 /) integer :: i 課題 4: 解答例 点の標本平均を求める Sum 関数が便利 平均を引いた偏差配列を作成 XとYの偏差積の和を求める Xの偏差平方和を求める 係数 A, Bを求める real(8) :: a, b real(8) :: cv, xv real(8) :: xm, xa(num_pt) real(8) :: ym, ya(num_pt) xm = sum( px(:) ) / real( num_pt ) ym = sum( py(:) ) / real( num_pt ) do i = 1, num_pt xa(i) = px(i) - xm ya(i) = py(i) - ym cv = 0.0d0 xv = 0.0d0 do i = 1, num_pt cv = cv + xa(i) * ya(i) xv = xv + xa(i)**2 a = cv / xv b = ym - xm * a write(*,*) '( gradient, intercept ) = ', a, b end program