Microsoft PowerPoint コンピュータ物理2_第2回.pptx

Similar documents
PowerPoint プレゼンテーション

プログラミング実習I

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

PowerPoint Presentation

gengo1-2

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

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

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

計算機シミュレーション

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

パソコンシミュレータの現状

PowerPoint プレゼンテーション

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

PowerPoint Presentation

PowerPoint プレゼンテーション

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

Taro-数値計算の誤差(公開版)

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

Microsoft PowerPoint - 第1回目復習_pdf用.ppt [互換モード]

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

Microsoft PowerPoint コンピュータ物理2_第1回.pptx

Report#2.docx

memo

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

Microsoft Word - NumericalComputation.docx

Prog1_2nd

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

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

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

スライド 1

cp-7. 配列

Report#2.docx

ガイダンス

Microsoft Word - no103.docx

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

memo

If(A) Vx(V) 1 最小 2 乗法で実験式のパラメータが導出できる測定で得られたデータをよく近似する式を実験式という. その利点は (M1) 多量のデータの特徴を一つの式で簡潔に表現できること. また (M2) y = f ( x ) の関係から, 任意の x のときの y が求まるので,

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

スライド 1

講習No.1

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

Microsoft Word - no11.docx

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

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

数値計算で学ぶ物理学 4 放物運動と惑星運動 地上のように下向きに重力がはたらいているような場においては 物体を投げると放物運動をする 一方 中心星のまわりの重力場中では 惑星は 円 だ円 放物線または双曲線を描きながら運動する ここでは 放物運動と惑星運動を 運動方程式を導出したうえで 数値シミュ

第 1 回 C 言語講座 1. コンピュータって? だいたいは 演算装置 制御装置 記憶装置 入出力装置から構成されている 演算装置 CPU の一部で実際に計算を行う装置 制御装置 CPU の一部で演算装置や入出力装置 記憶装置の読み書きなどを制御する装置 記憶装置プログラムや情報 データを一時的

Microsoft PowerPoint - NA03-09black.ppt

Microsoft PowerPoint - kougi4.ppt

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

Microsoft PowerPoint - 第3回2.ppt

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

データ解析

情報処理演習 B8クラス

ポインタ変数

Cプログラミング1(再) 第2回

- 2 -

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - H22制御工学I-2回.ppt

微分方程式による現象記述と解きかた

Microsoft PowerPoint - 11.pptx

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

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

プログラミング実習I

02: 変数と標準入出力

PowerPoint Presentation

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft Word - no02.doc

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

<4D F736F F D2094F795AA95FB92F68EAE82CC89F082AB95FB E646F63>

Microsoft Word - 19-d代 試é¨fi 解ç�fl.docx

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

Microsoft PowerPoint - kougi2.ppt

講習No.8

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

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Microsoft PowerPoint コンピュータ物理2_第1回.pptx

目次

Microsoft PowerPoint - 基礎・経済統計6.ppt

Microsoft PowerPoint - å®�æ−•è©¦é¨fi3ㆮ対ç�Œ.pptx

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

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

Microsoft PowerPoint コンピュータ物理2_第13回.pptx

ポインタ変数

Autodesk Inventor Skill Builders Autodesk Inventor 2010 構造解析の精度改良 メッシュリファインメントによる収束計算 予想作業時間:15 分 対象のバージョン:Inventor 2010 もしくはそれ以降のバージョン シミュレーションを設定する際

2014 年 10 月 2 日 本日の講義及び演習 数値シミュレーション 2014 年度第 2 回 偏微分方程式の偏微分項をコンピュータで扱えるようにする 離散化 ( 差分化 ) テイラー展開の利用 1 階微分項に対する差分式 2 階微分項に対する差分式 1 次元熱伝導方程式に適用して差分式を導出

のプログラムはそのままでは 人間は理解できても コンピュータは理解できません 皆さんが作るプログラムはソースプログラム ( ソースファイル ) と呼ばれます C 言語では *.c という形式にファイルで作成します そのソースプログラムをコンピュータが理解できるようなデータ形式に変換することをコンパイ

PowerPoint Presentation

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

2006年10月5日(木)実施

プログラミング基礎

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

※ ポイント ※

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

Microsoft Word - 3new.doc

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

"éı”ç·ıå½¢ 微勃挹稉弑

Microsoft PowerPoint - prog06.ppt

Transcription:

コンピュータ物理学 2 第 2 回 (2015.10.9) 第 1 回 10/ 2( 金 ) ガイダンス 第 2 回 10/ 9( 金 ) 数値表現と誤差 第 3 回 10/16( 金 ) 第 4 回 10/23( 金 ) 数値微分 積分 第 5 回 10/30( 木 ) 第 6 回 11/13( 金 ) 第 7 回 11/20( 金 ) 常微分方程式 第 8 回 11/27( 金 ) 第 9 回 12/ 4( 金 ) 第 10 回 12/11( 金 ) 偏微分方程式 第 11 回 12/18( 金 ) 第 12 回 12/25( 金 ) 第 13 回 1/ 8( 金 ) モンテカルロ法 第 14 回 1/ 22( 金 ) 量子力学 第 15 回 1/ 29( 金 ) 第 16 回 2/ 5( 金 )

達成したい流れ まずどういうプログラムを作りたいのかを想定するのが大事 第 1 回の続き ; Guss 分布データの計算 生成 ソースプログラムをコンパイルして > ++ guss. o guss.ee プログラムを実行すると >./guss.ee 平均値 標準偏差 を聞かれるので適当な値を入力すると > Men vlue? : 100 > Stndrd devition? : 30 o オプション : コンパイルして出来上がる実行ファイル名を guss.ee に指定 こう入力すると m=100, sigm=30 をもとに = 20 から =220 まで d=2.4 刻みでガウス関数値を算出し 出力ファイル (guss.dt) に書き出すようなプログラムを作る この値をもとにガウス関数を計算した値のデータファイルが生成される (=100 を中心に ±120 の範囲で 100 個のデータ生成する 刻み幅 =240/100=2.4) ファイル guss.dt の中身 20.000000 0.000004 17.600000 0.000006 15.200001 0.000008 12.800001 0.000011 210.399841 0.000015 212.799835 0.000011 215.199829 0.000008 217.599823 0.000006 f()

/* Guss funtion */ #inlude <stdio.h> #inlude <mth.h> #define n 100 /* point numer */ doule guss_f(doule, doule m, doule sigm){ doule g; g = 1.0/(sqrt(2.0*M_PI*sigm*sigm))*ep( ( m)*( m)/(2*sigm*sigm)); return g; int min() { /* lol vriles */ doule m, sigm; /* men, stndrd devition */ doule min, m; /* lultion region */ doule, d, guss; int i; FILE *outfile; ここでは分割数は define で定義 π はヘッダファイル mth.h の中で定義されている 日本語変換で π とかしないこと 後で見て分かりやすいようにコメント文を付けること プログラムを見やすくするために インデント ( 字下げ ) を活用する 使う変数の型宣言 プログラムでは日本語変換された文字は使わないこと σ ではなく 半角文字の sigm を使う 等 /* min progrm */ printf("men vlue? "); snf("%lf", &m); printf("stndrd devition? "); snf("%lf", &sigm); outfile = fopen("guss.dt", "w"); min = m sigm*4; m = m + sigm*4; = min; d = (m min)/n; for(i=1; i<=n; i++){ guss = guss_f(, m, sigm); fprintf(outfile, %f %11.8f n",, guss); += d; 1 回ループごとに に d を足す = +d と書いても良い プログラムを走らせたら Men vlue? と端末上に表示させて そこでキーボードから手入力した数字を変数 m に代入する (sigm も同様 ) 計算する範囲を最小値 最大値を指定して決定する =min から始まって d ごとに を増やして 100 回関数 guss を計算する snf で数値を読み取る場合は doule 型なら %lf とする flot 型なら %f で良い guss.dt という名前でファイルを作り 書き込めるモード w で開く 計算刻み幅 d は全データが 100 個になるように (m min) を 100 で割る guss 関数を計算する部分 ここでは min 関数とは別に用意した関数 guss にて計算をさせる 渡す変数は計算に必要な, m, sigm の 3 つ ファイルに出力するのは と計算値 guss 浮動小数点表示は %f だが 表示させる桁を指定したい場合は %11.8 等とする ( 小数点部 8 桁 全部で 11 桁で揃える場合 )

C++ 仕様の書き方 : #inlude <iostrem> #inlude <fstrem> #inlude <mth.h> using nmespe std; doule guss_f(doule, doule m, doule sigm){ doule g; g = 1.0/(sqrt(2.0*M_PI*sigm*sigm))*ep( ( m)*( m)/(2*sigm*sigm)); return g; int min() { doule m, sigm, min, m, guss,, d; int i, n=100; out << "Men vlue?"; in >> m; out << "Stndrd devition?"; in >> sigm; std::ofstrem ofs("guss.dt"); out << "m=" << m << endl; out << "sigm=" << sigm << endl; min = m sigm*4; m = m+sigm*4; = min; d = (m min)/n; for(i=1; i<=n; i++){ guss = guss_f(, m, sigm); ofs << << " " << guss << std::endl; +=d;

gnuplot で guss.dt をプロットする (1) スタートメニューから gnuplot を起動する (2) 現在の作業ディレクトリに移動する (3) guss.dt をプロットする gnuplot では uni コマンド d (hnge diretory) が使えるただし 移動先のディレクトリ名は で囲む この授業での環境なら d z: 等 plot guss.dt と入力するとデータの 1 列目を横軸 2 列目を縦軸にしてプロットしてくれる

(4) もうひとつ作った guss0.dt も並べてプロットする

第 2-3 回のテーマ 扱える数値の大きさ 小ささ 数値計算で生じる誤差 例題 レポート問題を通してこれらを定量的に評価できるようにする 級数和の計算 計算結果ファイルから数値を読み取っての比較

数値表現 it : メモリの最小記憶単位 (0, 1 の 2 進数 ) 1 B N it を使って表せる整数は 2 N 個 符号の正負区別に 1it 使うので 2 N 1 個 yte : 1 yte = 1 B = 8 its 1 kb = 2 10 B = 1024 ytes 1yte = 8it は 2 8 =256 1 yte で英数字 1 文字を記憶できる = 061 = 01100001 = 062 = 01100010 等 int 型整数 : 32 it 2 31 までの整数を表現できる 2 31 2,147,483, 648 許される限度を超えた大きな数計算機が扱える精度より小さな数 overflow underflow limits.h 内で INT_MAX 等で定義されている

浮動小数点は? = (-1) [ 符号部 ] [ 仮数部 ] 2 [ 指数部 ] [ バイアス ] 例 : (-1) 0 0.1234567 10 2 flot 型 1 つの実数変数を表すのに 32 it を使う 1it: 符号部 8it: 指数部 23it: 仮数部 [ バイアス ]=127 2 126 ~ 2 127 を実現 10 進数で 38 桁 m 1 2 3 23 1 2 m2 2 m3 2 m23 2 仮数部の有効桁数 = 2 進数で 23 桁 = 10 進数で log 2 23 7 桁 例 : 3.5 仮数 : 符号 = +, 絶対値 = 2.5 ( 仮数部の定義は [ 仮数部 1]) 基数 : 2 で固定 (IEEE 方式 ) 指数 : 0 = (-1) 0 3.5 2 0 = (-1) 0 1.75 2 1 = (-1) 0 (1+0.75) 2 128 127 符号部 = 0 仮数部 = 0.75 = 0.11000000000000000000000 指数部 = 128 = 2 7 = 10000000

doule 型 1 つの実数変数を表すのに 64 it を使う ( 倍精度 ) 符号部 1it 指数部 11 it [ バイアス ]=1023 2 1022 ~ 2 1023 を実現 10 進数で 308 桁 m 仮数部 52 it 1 2 3 52 1 2 m2 2 m3 2 m52 2 仮数部の有効桁数 = 2 進数で 52 桁 = 10 進数で log 2 52 16 桁 例題 1: 数値範囲の確認 doule 型の変数 に対して 1~180 までの階乗を計算し コンピュータ上での数値を確認せよ 1!, 2!, 3!, 4!, 5!,..., 180! また 各時点の と同時に y=1/ と z=*y も表示して 計算結果がどう表示されるか確認せよ 階乗は for ループの各回ごとに 1 づつ増える整数をかければ良い *=i 等 ( I は for 文のパラメータ ) 大きな数値や小さな数値を表示させるときは指数で出すのが良い ; printf( %e, ) 端末上にこう出力させたい i=1 ; =1.0, y=1.0, z=1.0 i=2 ; =2.0, y=0.5, z=1.0 i=3 ; =6.0, y=0.166667, z=1.0 : : : : : : : : 無限大 (inf) や非数値 (NN) がどういう状況で出てきてしまうかわかっておく ( 今後も計算結果に inf / NN が出て悩むことがあるかもしれないので )

端末上にこう出力させたい i=1 ; =1.0, y=1.0, z=1.0 i=2 ; =2.0, y=0.5, z=1.0 i=3 ; =6.0, y=0.166667, z=1.0 : : : : : : : : そのためには : For 文 for(i=1; i<=180; i++) を使って i=1 の時点では = 1 i=2 の時点では = 2 1 i=3 の時点では = 3 2 1 等々を各回ごとに出力する 1 回前のループでの の値に今回のループでの i の値をかけることで 階乗が得られる = * i ( に i をかけた値を新たに に代入する ) これと同じ演算を *= i と書ける 当然 i が増えていくと! は爆発的に増えていく そこで浮動小数点が扱える範囲を超えるのを確認する 同時に の逆数も各ループで見てみる y=1/ として こちらは i が増えていくと 極めて小さい数値になっていく *y は定義上 1 だが や y が正常値をとれなくなると 値が定義できなくなるので それも見る =1.0; 0! = 1 なので 初期値は=1. for(i=1; i<=n; i++){ *= i; y=1/; z=*y; printf("i=%d =%e y=%e z=%e n", i,, y, z); 浮動小数点を指数型 (10^) で表示させると大きな数値や小さな数値を精度良く見れる (%e)

数値計算における誤差 コンピュータ上で計算を行う際 2 種類の誤差を考慮する必要がある (1) 近似誤差 コンピュータで問題を解くために 数学の厳密性を簡単化したために生じる誤差 無限級数 有限の和 無限小の間隔 有限のステップ e n N! n f ( ) d lim f N n 0 n n 0! n 1 0 N n0 n N 1 N N n0 f n N 1 N (2) 丸め誤差 計算機で扱う数値は有限個のビットで表されるので ( 有限な桁数を扱う ) 精度に限界があり 誤差が生じる 計算内容によっては有限桁数しか扱えないために生じる誤差が蓄積して大きな誤差を生じることがある 引き算で生じる誤差 ( 桁落ち ) 掛け算で生じる誤差

演算で生じる誤差 計算機で行われる計算は解析的な解に対する近似でしかない 2 つの数値の和を計算する場合を考える : 計算機の中での数値は添え字 を付けて厳密値と異なる近似値だと考えられる : 計算機内の有限桁数により生じる誤差を ε, ε とすると 1 1 誤差 1% なら ε = 0.01 誤差 0.1% なら ε = 0.001 一方 引算では 相対誤差は 1 の平均的誤差は と の誤差を重み付きで平均したもの だとすると ( 一方の誤差が大きい場合 ) 1 大きい方の誤差で和の誤差が決まる 引算で生じる相対誤差は 1 のときは の相対誤差が大きくなる ほとんど同じ大きさの数の間で差をとる 大きい桁の部分がなくなる 残りの小さい桁の部分に占める誤差の割合が相対的に大きくなる 桁落ち

桁落ちの例 大きい値同士の差で小さい値が生じるとき 5001 70.71775 と 5000 70. 71068 の差を計算することを 考える ともに有効数字 7 桁の精度を保持している 5001 5000 70.71775 70.71068 0.00707 有効数字は 3 桁 小さい値同士の差で小さい値が生じるとき 51 7.141428と 50 7. 071068 の差を計算することを 考える ともに有効数字 7 桁の精度を保持している 51 50 7.141428 7.071068 0.070360 有効数字は 5 桁

例題 2: 桁落ちが見られる関数計算 球 Bessel 関数 球 Bessel 関数 j l () を l = 2,3,4,, 10 まで計算 ファイル出力してグラフで確認する 漸化式と既知の j 0 (), j 1 () から求める 2l 1 jl 1( ) jl ( ) jl 1( ) j 0 ( ) sin, j ( ) 1 sin os 2 キーボード入力で計算したい次数 l を決めて計算できるようにする = 0.1 (=min) から始めて 刻み幅 0.1 で = 30 (=m) までの範囲で計算する for 文で を増加するループを作り 各回において決めた l に対する j l () を漸化式から計算する 漸化式を計算するのも欲しい l に達するまで for 文でループさせる 漸化式計算は関数として別たてするとよい doule up(doule, int l){ min 関数内で for(=min; <=m; +=d){ u = up(, l); fprintf(outfile, "%f %f n",, u); ( 上昇漸化式なので関数名を up としてる ) 漸化式は前の 2 つの項から求めるので 2 つ前の項を one 1 つ前の項を two として three = (2.0*n+1.0)/ * two one として新たな項を求める (n を増加させていく ) l が大きくなってくると原点付近で計算に誤差が生じてくる j 0 () j 1 () これを計算する (j 2 ()) 同様に j 10 () まで