LU分解を用いた連立一次方程式.

Slides:



Advertisements
Similar presentations
大規模な三角 Toeplitz 線形方 程式の高速解法とその応用 ○ 安村 修一(法政大学 4 年) 李 磊(法政大学) 日本応用数理学会「行列・固有値の解法とその応用」研究部会 第6回研究会.
Advertisements

IT 入門 B2 ー 連立一次方程式( 2 ) ー. ガウスの消去法の問題点 – 浮動小数点数の特殊な値 – 数学関数 ピボット選択つきガウスの消去法 演習 授 業 内 容 授 業 内 容.
コンピュータ基礎実験 第1 0回 コンピュータープログラミン グ ( C 言語)(8) 1.乱数(復習) 2.配列とその利用.
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
原子動力工学特論 課題2 交通電子機械工学専攻 2003310 齋藤 泰治.
データ解析
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第13回構造体.
3 二次方程式 1章 二次方程式 §2 二次方程式と因数分解         (3時間).
4.3 連立1次方程式   Ax = b   (23) と書くことができる。
数個、数十個のデータ点から その特徴をつかむ
ファーストイヤー・セミナーⅡ 第8回 データの入力.
第12回構造体.
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
プログラミング論 I 行列の演算
第四回 線形計画法(2) 混合最大値問題 山梨大学.
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
3 一次関数 1章 一次関数とグラフ §3 一次関数の式を求めること          (3時間).
原子動力工学特論 課題 3、4 交通電子機械工学専攻   齋藤 泰治.
プログラミング演習(2組) 第12回
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
IT入門B2 ー 連立一次方程式 ー.
コンピュータープログラミング (C言語)(8) 1.乱数(復習) 2.配列とその利用
第二回 連立1次方程式の解法 内容 目標 連立1次方程式の掃出し法 初期基底を求める 連立1次方程式を掃出し法を用いてExcelで解析する
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回)
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
第7回 条件による繰り返し.
数学 ---> 抽象化、一般化 より複雑な関係ー>解析学 一次関数 y=ax+b より多くの要素ー>線形代数 x y f(x) y1 x1
ニュートン法の解の計算 情報電子工学系学科 電気電子工学コース・情報通信システム工学コース
プログラミング2 関数
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
Cプログラミング演習.
数値積分.
フーリエ級数展開 ~矩形波について~ 長江 栞 中島 涼 中村 勇樹
傾きがわかった関数の軌跡を求める. 変数は二つ以上
プログラミング演習I 行列計算と線形方程式の求解
知能情報工学演習I 第12回(後半第6回) 課題の回答
第7回 条件による繰り返し.
第10回 FIR回路とIIR回路.
高度プログラミング演習 (05).
高度プログラミング演習 (05).
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラムの制御構造 配列・繰り返し.
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
情報理論2 第3回 小林 学 湘南工科大学 2011年10月25日 〒 神奈川県藤沢市辻堂西海岸1-1-25
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
Cプログラミング演習資料.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
プログラミング序論演習.
データ解析 静岡大学工学部 安藤和敏
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
データ解析 静岡大学工学部 安藤和敏
2008年6月5日 非線形方程式の近似解 2分法,はさみうち法,Newton-Raphson法)
ニュートン法による 非線型方程式の解.
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
Cプログラミング演習 ニュートン法による方程式の求解.
プログラミング演習I 数値計算における計算精度と誤差
3 一次関数 1章 一次関数とグラフ §4 方程式とグラフ         (3時間).
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
情報処理Ⅱ 2005年11月25日(金).
プログラミング入門2 第5回 配列 変数宣言、初期化について
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
第5回 配列.
プログラミング演習I 補講用課題
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
Presentation transcript:

LU分解を用いた連立一次方程式

LU分解 連立一次方程式を解く手段 通常,連立方程式を解く場合は変数を減らしていくという方針で解いていくが,これもその1つ Gaussの消去法とLU分解は別物 計算機で実装した場合Gaussの消去法はLU分解に比べ計算速度がかなり「遅い」 逆行列を求めるやり方も「遅い」

連立一次方程式の行列表現 一般に連立一次方程式は A0,0x0+A0,1x1・・・A0,n-1xn-1 = b0 これを行列表現すると, A0,0x0+A0,1x1・・・A0,n-1xn-1 = b0 A1,0x0+A1,1x1・・・A1,n-1xn-1 = b1 An-1,0x0+An-1,1x1・・・An-1,n-1xn-1 = bn-1 (1) A0,0 A0,1 ・・・ A0,n-1 A1,0 A1,1 A1,n-1 : An-1,0 An-1,1 An-1,n-1 x0 x1 : xn-1 b0 b1 : bn-1 = Ax=b (2)

上三角行列,下三角行列 A= LU分解では,行列Aを下三角行列Lと上三角行列Uの二つに分解する 三角行列であれば解を求めることが容易 = ・・・ A0,n-1 A1,0 A1,1 A1,n-1 : An-1,0 An-1,1 An-1,n-1 A= 1 ・・・ l1,0 : ln-2,0 ln-2,1 ln-1,0 ln-1,1 ln-1,n-2 u0,0 u0,1 ・・・ u0,n-2 u0,n-1 u1,1 u1,n-2 u1,n-1 : un-2,n-2 un-2,n-1 un-1,n-1 = =LU (3)

LU分解で連立一次方程式を解く(1) 一次方程式 Ax = b を解く 行列Aを下三角行列Lと上三角行列Uの二つにLU分解する A = LU Ax = LUx = b

LU分解で連立一次方程式を解く(2) y = Uxとおいて,まず Ly = b を解く. (三角行列を係数とする方程式は容易に解くことができる) yを求めたら Ux = y を解くことで,xを求めることができる

u1,k = A1,k-u0,k・l1,0 where(1≦k≦n-1) ここで LUx = b (5) Lc = b (6) ・・・ A0,n-1 A1,0 A1,1 A1,n-1 : An-1,0 An-1,1 An-1,n-1 1 2 3 1 ・・・ l1,0 : ln-2,0 ln-2,1 ln-1,0 ln-1,1 ln-1,n-2 u0,0 u0,1 ・・・ u0,n-2 u0,n-1 u1,1 u1,n-2 u1,n-1 : un-2,n-2 un-2,n-1 un-1,n-1 1 2 3 u0,k = A0,k where(0≦k≦n-1) li,0 = Ai,0/u0,0 where(1≦i≦n-1) u1,k = A1,k-u0,k・l1,0 where(1≦k≦n-1) ここで LUx = b (5) Lc = b (6) となるcを求める. (4)

ck = ∑lk,i・ci where(0≦k≦n-1) (8) 最後にUx = cをxについて解くと ・・・ l1,0 ln-2,0 ln-2,1 ln-1,0 ln-1,1 ln-1,n-2 c0 c1 cn-2 cn-1 b0 b1 bn-2 bn-1 = (7) これをcについて解くと c0 = b0 c1 = b1-l1,0・c0 c2 = b2-l2,0・c0-l2,1・c1 ck = ∑lk,i・ci where(0≦k≦n-1) (8) 最後にUx = cをxについて解くと k-1 i=0 u0,0 u0,1 ・・・ u0,n-2 u0,n-1 u1,1 u1,n-2 u1,n-1 un-2,n-2 un-2,n-1 un-1,n-1 x0 x1 xn-2 xn-1 c0 c1 cn-2 cn-1 = (9)

xn-2 = (cn-2-un-2,n-1・xn-1)/un-2,n-2   より xn-1 = cn-1/un-1,n-1 xn-2 = (cn-2-un-2,n-1・xn-1)/un-2,n-2 xn-3 = (cn-3-un-3,n-2・xn-2-un-3,n-1・xn-1)/un-3,n-3 xn-k = (cn-k-∑un-k,n-i・xn-i)/un-k,n-k where(1≦k≦n) (10) k-1 i=1

プログラム例 #include <stdio.h> #define M 4 main(int argc, char *argv[]) { double a[M][M]; double b[M]; double c[M]; double l[M][M]; double u[M][M]; double x[M]; int i,j,k; FILE *fp; fp = fopen(argv[1], "r"); /* ファイルより入力行列を読み込む */ for(i = 0; i < M; i++){ for(j = 0; j < M; j++){ fscanf(fp,"%lf",&a[i][j]); } fscanf(fp,"%lf",&b[i]); fclose(fp);

for(i = 0; i < M; i++){ /* L行列、U行列を1と0で初期化 */ for(j = 0; j < M; j++){ u[i][j] = 0; if(i == j) l[i][j] = 1; else l[i][j] = 0; } for(i = 0; i < M; i++){ for(j = i; j < M; j++){ /* U行列の生成 */ u[i][j] = a[i][j]; for(k = 0; k < i; k++){ u[i][j] -= u[k][j] * l[i][k]; for(j = i+1; j < M; j++){ /* L行列の生成 */ l[j][i] = a[j][i]; l[j][i] -= u[k][i] * l[j][k]; l[j][i] /= u[i][i];

for(i = 0; i < M; i++){ /* c行列の生成 */ c[i] = b[i]; for(j = 0; j < i; j++){ c[i] -= l[i][j] * c[j]; } for(i = M-1; i >= 0; i--){ /* x行列の生成 */ x[i] = c[i]; for(j = M-1; j > i; j--){ x[i] -= u[i][j] * x[j]; x[i] /= u[i][i]; printf("入力行列\n"); /* 入力行列の出力 */ for(i = 0; i < M; i++){ for(j = 0; j < M; j++){ printf("%10.5lf ",a[i][j]); printf("%10.5lf\n",b[i]);

printf("\nL行列\n"); /* L行列の出力 */ for(i = 0; i < M; i++){ for(j = 0; j < M; j++){ printf("%10.5lf ",l[i][j]); } printf("\n"); printf("\nU行列\n"); /* U行列の出力 */ printf("%10.5lf ",u[i][j]); for(i = 0; i < M; i++){ /* 解の出力 */ printf("x%d = %10.5lf\n",i,x[i]);

実行結果 入力行列として次の行列を与える 入力行列 3.00000 2.00000 6.00000 1.00000 17.00000 3.00000 2.00000 6.00000 1.00000 17.00000 2.00000 4.00000 1.00000 6.00000 23.00000 5.00000 4.00000 1.00000 3.00000 23.00000 3.00000 2.00000 5.00000 6.00000 26.00000 L行列 1.00000 0.00000 0.00000 0.00000 0.66667 1.00000 0.00000 0.00000 1.66667 0.25000 1.00000 0.00000 1.00000 0.00000 0.12121 1.00000 U行列 3.00000 2.00000 6.00000 1.00000 0.00000 2.66667 -3.00000 5.33333 0.00000 0.00000 -8.25000 0.00000 0.00000 0.00000 0.00000 5.00000 x0 = 2.00000 x1 = 1.50000 x2 = 1.00000 x3 = 2.00000 入力行列として次の行列を与える 3 2 6 1 17 2 4 1 6 23 5 4 1 3 23 3 2 5 6 26

ピボッティング もしAi,iやuk,k等の対角上の要素が0であれば,前式より,0徐算となり解が求まらない これを避けるために,0である要素を含む行と0でない要素を含む行を入れ替える(ピボッティング) しかし、0でなくても,0に近い小さな値で割ったときは丸め誤差が大きくなる.この誤差を小さくするために,0でなくても,最も絶対値の大きな値を含む行と最も絶対値の小さな値を含む行 を入れ替えるのがよい

課題 ピボッティングを行なうプログラムを作りなさい 実際に,対角要素の一部が0である行列を読み込ませて,動作を確認しなさい