数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回)

Slides:



Advertisements
Similar presentations
知能情報工学演習 I 第 12 回( C 言語第6 回) 課題の回答 岩村雅一
Advertisements

IT 入門 B2 ー 連立一次方程式( 2 ) ー. ガウスの消去法の問題点 – 浮動小数点数の特殊な値 – 数学関数 ピボット選択つきガウスの消去法 演習 授 業 内 容 授 業 内 容.
数値解析シラバス C言語環境と数値解析の概要(1 回) C言語環境と数値解析の概要(1 回) 方程式の根(1回) 方程式の根(1回) 連立一次方程式(2回) 連立一次方程式(2回) 補間と近似(2回) 補間と近似(2回) 数値積分(1回) 数値積分(1回) 中間試験(1回) 中間試験(1回) 常微分方程式(1回)
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
第6回条件による分岐.
プログラミング論 数値積分
プログラミング論 I 補間
数個、数十個のデータ点から その特徴をつかむ
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
3 一次関数 1章 一次関数とグラフ §3 一次関数の式を求めること          (3時間).
原子動力工学特論 課題 3、4 交通電子機械工学専攻   齋藤 泰治.
基礎プログラミングおよび演習 第8回.
常微分方程式と偏微分方程式 1.常微分方程式 独立変数が一個のもの 振動の運動方程式 2.偏微分方程式 独立変数が二個以上のもの
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
IT入門B2 ー 連立一次方程式 ー.
第二回 連立1次方程式の解法 内容 目標 連立1次方程式の掃出し法 初期基底を求める 連立1次方程式を掃出し法を用いてExcelで解析する
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
非線形方程式の近似解 (2分法,はさみうち法,Newton-Raphson法)
2008年6月12日 非線形方程式の近似解 Newton-Raphson法
誤差の二乗和の一次導関数 偏微分.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
計算アルゴリズム 計算理工学専攻 張研究室 山本有作.
計算アルゴリズム 計算理工学専攻 張研究室 山本有作.
第7回 条件による繰り返し.
応用数学 計算理工学専攻 杉原研究室 山本有作.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
タップ長が一般化された 適応フィルタの統計力学
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
数値積分.
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
フーリエ級数展開 ~矩形波について~ 長江 栞 中島 涼 中村 勇樹
傾きがわかった関数の軌跡を求める. 変数は二つ以上
プログラミング序論 2. n人のインディアン.
プログラミング演習I 行列計算と線形方程式の求解
LU分解を用いた連立一次方程式.
最小自乗法.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング演習I ―数値解析― 平成16年度 前期 上 村 佳 嗣.
高度プログラミング演習 (05).
高度プログラミング演習 (05).
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
疑似乱数, モンテカルロ法によるシミュレーション
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
プログラミング序論演習.
データ解析 静岡大学工学部 安藤和敏
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
2008年6月5日 非線形方程式の近似解 2分法,はさみうち法,Newton-Raphson法)
ニュートン法による 非線型方程式の解.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
Cプログラミング演習 ニュートン法による方程式の求解.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング演習I 2003年6月11日(第9回) 木村巌.
3 一次関数 1章 一次関数とグラフ §4 方程式とグラフ         (3時間).
応用数学 計算理工学専攻 張研究室 山本有作.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。
Presentation transcript:

数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回) 中間試験(1回) 常微分方程式(1回) 偏微分方程式(2回) 数値計算の応用(3回) 期末試験(1回)

最小二乗法 実験データなど誤差を含む点を近似する

関数の近似法 補間  データ点上を必ず通過する近似 近似(最小2乗法)  データ点に近い点を通る近似 x y x y

最小二乗法 y = a0 + a1x + a2x2 Dy3 Dy0 Dy1 Dy2 Dy02 + Dy12 + Dy22 + Dy32 最小になるように a0, a1,a2を決定 Dy02 + Dy12 + Dy22 + Dy32

一次関数の例 y = a0 + a1 x Dy02 = (a0 + a1x0 - y0)2 Dy12 = (a0 + a1x1 - y1)2 近似(最小2乗法)  1次関数で y = a0 + a1 x y Dy02 = (a0 + a1x0 - y0)2 (x1, y1) Dy12 = (a0 + a1x1 - y1)2 (x0, y0) (x2, y2) Dy22 = (a0 + a1x2 - y2)2 y = a0 + a1 x x この和を最小にする a0, a1

SDyi2 = (a0+a1x0–y0)2+(a0+a1x1–y1)2 +(a0+a1x2–y2)2 m i=0 ∂ ∂a0 = 0 S Dyi2 = 2(a0+a1x0–y0)x0 +2(a0+a1x1–y1)x1+2(a0+a1x2–y2)x2 m i=0 ∂ ∂a1 = 0

= (a0+a1x0–y0)+(a0+a1x1–y1)+(a0+a1x2–y2) =(3)a0+(x0+x1+x2)a1–(y0+y1+y2)=0 (a0+a1x0–y0)x0+(a0+a1x1–y1)x1+(a0+a1x2–y2)x0 =(3)a0x0+(x0+x1+x2)a1x1–(x0y0+x1y1+x2y2)=0 (3)a0+(x0+x1+x2)a1=(y0+y1+y2) (3)a0x0+(x0+x1+x2)a1x1=(x0y0+x1y1+x2y2) (3) (x0+x1+x2) a0 (y0+y1+y2) = (3)x0 (x0+x1+x2)x1 a1 (x0y0+x1y1+x2y2)

二次関数の例 ∂ S Dyi2 = S 2xij (a0 + a1xi + a2xi2 - yi) = 0 ∂aj m i=0 m i=0 ∂ ∂aj S Dyi2 = S 2xij (a0 + a1xi + a2xi2 - yi) = 0 追加 (x0j +・・・+ xmj )a0 + (x0j+1 +・・・+ xmj+1 ) a1 + (x0j+2 +・・・+ xmj+2 ) a2 = (x0j y0 +・・・+ xmj ym ) j = 0, 1, 2

(x00 +・・・+ xm0)a0+(x01 +・・・+ xm1)a1+(x02 +・・・+ xm2) a2 = (x00 y0 +・・・+ xm0 ym ) (x01+・・・+ xm1)a0+(x02 +・・・+ xm2)a1+(x03 +・・・+ xm3) a2 = (x01 y0 +・・・+ xm1 ym ) (x02+・・・+ xm2)a0+(x03 +・・・+ xm3)a1+(x04 +・・・+ xm4) a2 = (x02 y0 +・・・+ xm2 ym )

j = 0, 1, 2 (x00 +・・・+ xm0) (x01 +・・・+ xm1) (x02 +・・・+ xm2) a0 (x01+・・・+ xm1) (x02 +・・・+ xm2) (x03 +・・・+ xm3) a1 (x02+・・・+ xm2) (x03 +・・・+ xm3) (x04 +・・・+ xm4) a2 i = 0, 1, 2 (x00 y0 +・・・+ xm0 ym ) m k = 0 m k = 0 = (x01 y0 +・・・+ xm1 ym ) S xkiyk S xki+j (x02 y0 +・・・+ xm2 ym )

紙とペン 近似(最小2乗法)  1次関数で y = a + bx x y 1 2 x y 1 2

紙とペン x y 1 2 Dy02 = (a + bx0 - y0)2 Dy12 = (a + bx1 - y1)2 1 2 Dy02 = (a + bx0 - y0)2 Dy12 = (a + bx1 - y1)2 Dy22 = (a + bx2 - y2)2 Dy02 + Dy12 +Dy22 = (a + bx0 - y0)2 +(a + bx1 - y1)2 +(a + bx2 - y2)2 ⇒a,bで偏微分

紙とペン aで偏微分→0とおく。 bで偏微分→0とおく。 2(a + bx0 - y0)+2(a + bx1 - y1) +2(a + bx2 - y2)=0 bで偏微分→0とおく。 2(a + bx0 - y0) x0+2(a + bx1 - y1) x1 +2(a + bx2 - y2) x2=0 x y 1 2 (a)+(a + b - 1) +(a + 2b - 1)=0 (a) + (a + b - 1)+2(a + 2b – 1)=0

紙とペン (a)+(a + b - 1) +(a + 2b - 1)=0 (a) + (a + b - 1)+2(a + 2b – 1)=0 x y 1 2 (a)+(a + b - 1) +(a + 2b - 1)=0 (a) + (a + b - 1)+2(a + 2b – 1)=0 3a + 3b – 2 = 0 3a + 5b -3=0 x y 1 2 b = 1/2 a = 1/6 傾き:1/2 交点:1/6

紙とペン 近似(最小2乗法)  1次関数で y = a + bx x y 1 2 y 1 x 1 2

紙とペン aで偏微分→0とおく。 bで偏微分→0とおく。 2(a + bx0 - y0)+2(a + bx1 - y1) +2(a + bx2 - y2)=0 bで偏微分→0とおく。 2(a + bx0 - y0) x0+2(a + bx1 - y1) x1 +2(a + bx2 - y2) x2=0 x y 1 2 (a)+(a + b) +(a + 2b - 1)=0 (a + b )+2(a + 2b – 1)=0

紙とペン (a)+(a + b ) +(a + 2b - 1)=0 (a + b )+2(a + 2b – 1)=0 x y 1 2 (a)+(a + b ) +(a + 2b - 1)=0 (a + b )+2(a + 2b – 1)=0 3a + 3b – 1 = 0 3a + 5b – 2=0 y 傾き:1/2 交点: – 1/6 1 b = 1/2 a = – 1/6 x 1 2

プログラミング #include <stdio.h> #include <math.h> #define N 6 #define M 4 #define EPS .00001 double a[M+1][M+2]; int jordan( void ); int main( ) { double x[N]={0.0, 1.0, 2.0, 3.0, 3.1, 5.0}; double y[N]={0.0, 1.1, 2.5, 4.0, 4.1, 5.0}; int i, j, k; for(i=0;i<=M;i++) for(j=0;j<=M+1;j++) a[i][j]=0.0; プログラミング

S xki+j S xkiyk m for(i=0;i<=M;i++) k = 0 for(j=0;j<=M;j++) for(k=0;k<N;k++) a[i][j] += pow(x[k],(double)(i+j)); a[i][M+1] += y[k]*pow(x[k],(double)i); if(jordan()==1) return 1; printf("A%2d = %7.3lf\n", i, a[i][M+1]); return 0; } S xki+j m k = 0 S xkiyk 1のときは,エラーが起きている

連立方程式のプログラミング int jordan( void ){ double pivot, del; int i, j, k; for(i=0;i<=M;i++) { pivot = a[i][i]; if( fabs(pivot) < EPS ){ printf("ピボット数が許容範囲以下\n"); return 1; } for( j=i; j <= M+1; j++) a[i][j] /= pivot; for(k=0; k<=M;k++){ del = a[k][i]; for( j=0;j<=M+1; j++){ if( k!=i) a[k][j] -= del*a[i][j]; 連立方程式のプログラミング エラーが起こると 1を返す.

テキストのままで実行 A0 = 0.002 A1 = 0.772 A2 = 0.395 A3 =‐0.079 A4 = 0.002 テキストと異なる A0 = 0.002 A1 =  0.772 A2 = 0.395 A3 =‐0.079 A4 =  0.002 しかも。エラーがでる。

エクセルで確認 答えは正しい!

エラーの原因 pow(x,0)で エラー発生 pow(x,0)で エラー発生 for(i=0;i<=M;i++) for(j=0;j<=M;j++) for(k=0;k<N;k++) a[i][j] += pow(x[k],(double)(i+j)); a[i][M+1] += y[k]*pow(x[k],(double)i); pow(x,0)で エラー発生

エラーの回避法 pow(x,0)で powを1とする. pow(x,0)で powを1とする. for(i=0;i<=M;i++) for(j=0;j<=M;j++) for(k=0;k<N;k++) if((i+j)<EPS){ a[i][j] += 1.0; }else{ a[i][j] += pow(x[k],(double)(i+j)); } if((i)<EPS){ a[i][M+1] += y[k]; a[i][M+1] += y[k]*pow(x[k],(double)i); pow(x,0)で powを1とする. pow(x,0)で powを1とする.

実行例 エラーがなくなった!

演習問題3.2 最小二乗法で直線近似 x 0 1 2 3 4 y 1 2 1 0 4

解答 #include <stdio.h> #include <math.h> #define N 5 #define M 1 #define EPS .00001 double a[M+1][M+2]; int jordan( void ); int main( ) { double x[N]={0.0, 1.0, 2.0, 3.0, 4.0}; double y[N]={1.0, 2.0, 1.0, 0.0, 4.0}; 変更 変更

演習問題3.4 最小二乗法で3次方程式近似 Cプログラムの後 エクセルで確認 x -4 -2 -1 1 3 4 6 y -35.1 15.1 1 3 4 6 y -35.1 15.1 15.9 8.9 0.1 21.1 135.0 Cプログラムの後 エクセルで確認

エクセルで結果を確認