C言語による数値計算プログラミング演習

Similar documents
C言語による数値計算プログラミング演習

弾性定数の対称性について

Microsoft PowerPoint - Eigen.pptx

C言語による数値計算プログラミング演習

[ 1] 1 Hello World!! 1 #include <s t d i o. h> 2 3 int main ( ) { 4 5 p r i n t f ( H e l l o World!! \ n ) ; 6 7 return 0 ; 8 } 1:

II 2 3.,, A(B + C) = AB + AC, (A + B)C = AC + BC. 4. m m A, m m B,, m m B, AB = BA, A,, I. 5. m m A, m n B, AB = B, A I E, 4 4 I, J, K

スライド 1

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

all.dvi

C言語による数値計算プログラミング演習

Taro-再帰関数Ⅲ(公開版).jtd

1. 2 P 2 (x, y) 2 x y (0, 0) R 2 = {(x, y) x, y R} x, y R P = (x, y) O = (0, 0) OP ( ) OP x x, y y ( ) x v = y ( ) x 2 1 v = P = (x, y) y ( x y ) 2 (x

II Karel Švadlenka * [1] 1.1* 5 23 m d2 x dt 2 = cdx kx + mg dt. c, g, k, m 1.2* u = au + bv v = cu + dv v u a, b, c, d R

+ 1 ( ) I IA i i i 1 n m a 11 a 1j a 1m A = a i1 a ij a im a n1 a nj a nm.....

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

行列、ベクトル

6 2 2 x y x y t P P = P t P = I P P P ( ) ( ) ,, ( ) ( ) cos θ sin θ cos θ sin θ, sin θ cos θ sin θ cos θ y x θ x θ P

[1] #include<stdio.h> main() { printf("hello, world."); return 0; } (G1) int long int float ± ±

USB ID TA DUET 24:00 DUET XXX -YY.c ( ) XXX -YY.txt() XXX ID 3 YY ID 5 () #define StudentID 231

4.6: 3 sin 5 sin θ θ t θ 2t θ 4t : sin ωt ω sin θ θ ωt sin ωt 1 ω ω [rad/sec] 1 [sec] ω[rad] [rad/sec] 5.3 ω [rad/sec] 5.7: 2t 4t sin 2t sin 4t

Microsoft Word - 補論3.2

行列の反復解法 1. 点 Jacobi 法 数値解法の重要な概念の一つである反復法を取り上げ 連立一次方程式 Au=b の反復解法を調べる 行列のスペクトル半径と収束行列の定義を与える 行列のスペクトル半径行列 Aの固有値の絶対値の最大値でもって 行列 Aのスペクトル半径 r(a) を与える 収束行

Microsoft PowerPoint - 10.pptx

行列代数2010A

経済数学演習問題 2018 年 5 月 29 日 I a, b, c R n に対して a + b + c 2 = a 2 + b 2 + c 2 + 2( a, b) + 2( b, c) + 2( a, c) が成立することを示しましょう.( 線型代数学 教科書 13 ページ 演習 1.17)

C言語による数値計算プログラミング演習

C 2 / 21 1 y = x 1.1 lagrange.c 1 / Laglange / 2 #include <stdio.h> 3 #include <math.h> 4 int main() 5 { 6 float x[10], y[10]; 7 float xx, pn, p; 8 in

1 8, : 8.1 1, 2 z = ax + by + c ax by + z c = a b +1 x y z c = 0, (0, 0, c), n = ( a, b, 1). f = n i=1 a ii x 2 i + i<j 2a ij x i x j = ( x, A x), f =

24 I ( ) 1. R 3 (i) C : x 2 + y 2 1 = 0 (ii) C : y = ± 1 x 2 ( 1 x 1) (iii) C : x = cos t, y = sin t (0 t 2π) 1.1. γ : [a, b] R n ; t γ(t) = (x

09.pptx

1 n A a 11 a 1n A =.. a m1 a mn Ax = λx (1) x n λ (eigenvalue problem) x = 0 ( x 0 ) λ A ( ) λ Ax = λx x Ax = λx y T A = λy T x Ax = λx cx ( 1) 1.1 Th

第6章 実験モード解析

1 4 2 EP) (EP) (EP)

高等学校学習指導要領

高等学校学習指導要領

PC Windows 95, Windows 98, Windows NT, Windows 2000, MS-DOS, UNIX CPU

5 c P 5 kn n t π (.5 P 7 MP π (.5 n t n cos π. MP 6 4 t sin π 6 cos π 6.7 MP 4 P P N i i i i N i j F j ii N i i ii F j i i N ii li i F j i ij li i i i

Taro-プログラミングの基礎Ⅱ(公

Microsoft PowerPoint - H21生物計算化学2.ppt

() x + y + y + x dy dx = 0 () dy + xy = x dx y + x y ( 5) ( s55906) 0.7. (). 5 (). ( 6) ( s6590) 0.8 m n. 0.9 n n A. ( 6) ( s6590) f A (λ) = det(a λi)

I y = f(x) a I a x I x = a + x 1 f(x) f(a) x a = f(a + x) f(a) x (11.1) x a x 0 f(x) f(a) f(a + x) f(a) lim = lim x a x a x 0 x (11.2) f(x) x


Part () () Γ Part ,

#define N1 N+1 double x[n1] =.5, 1., 2.; double hokan[n1] = 1.65, 2.72, 7.39 ; double xx[]=.2,.4,.6,.8,1.2,1.4,1.6,1.8; double lagrng(double xx); main

数学Ⅱ演習(足助・09夏)

第7章 有限要素法のプログラミング

kiso2-06.key

comment.dvi

AHPを用いた大相撲の新しい番付編成

(2016 2Q H) [ ] R 2 2 P = (a, b), Q = (c, d) Q P QP = ( ) a c b d (a c, b d) P = (a, b) O P ( ) a p = b P = (a, b) p = ( ) a b R 2 {( ) } R 2 x = x, y

1. 4cm 16 cm 4cm 20cm 18 cm L λ(x)=ax [kg/m] A x 4cm A 4cm 12 cm h h Y 0 a G 0.38h a b x r(x) x y = 1 h 0.38h G b h X x r(x) 1 S(x) = πr(x) 2 a,b, h,π

linearal1.dvi

untitled

I-2 (100 ) (1) y(x) y dy dx y d2 y dx 2 (a) y + 2y 3y = 9e 2x (b) x 2 y 6y = 5x 4 (2) Bernoulli B n (n = 0, 1, 2,...) x e x 1 = n=0 B 0 B 1 B 2 (3) co

PowerPoint Presentation

x () g(x) = f(t) dt f(x), F (x) 3x () g(x) g (x) f(x), F (x) (3) h(x) = x 3x tf(t) dt.9 = {(x, y) ; x, y, x + y } f(x, y) = xy( x y). h (x) f(x), F (x

C (q, p) (1)(2) C (Q, P ) ( Qi (q, p) P i (q, p) dq j + Q ) i(q, p) dp j P i dq i (5) q j p j C i,j1 (q,p) C D C (Q,P) D C Phase Space (1)(2) C p i dq

Transcription:

5. 行列の固有値問題 n n 正方行列 A に対する n 個の固有値 λ i (i=1,,,n) と対応する固有ベクトル u i は次式を満たす Au = λ u i i i a11 a1 L a1 n u1i a1 a a n u i A =, ui = M O M M an 1 an L ann uni これらはまとめて, つぎのように書ける 5.1 ヤコビ法 = Λ, = [ u1 u u n ], Λ = AU U U L 実数対称行列 A の固有値と対応する固有ベクトルをすべて求める方法であり, 古典的ではあるが, 行列サイズが 10 以下ならば現在でも使用されている 直交行列 P を用いて A の相似変換 ( すなわち直交変換 )Ã=P T AP を行い, 対角行列に収束させていくと, 対角要素が固有値となる ( 相似変換に関して固有値は不変 ) λ1 0 λ O 0 λ n アルゴリズム 5.1.1 A:= 与えられた行列 U:=I( 単位行列 ) for m=1,, { 収束条件を満たす ( すべての非対角要素がεより小さくなる ) まで繰り返す for i=1 to n-1 {A の対角要素を除いた上三角部分を走査 for j=i+1 to n if a ij ε then { 非対角要素で絶対値がεより大きい要素 a ij を零にする変換 θ:=(1/)cot -1 ((a ii -a jj )/(a ij )) A:=P T AP {A の直交変換 ( 非対角要素 a ij を零にする ) U:=UP {U の変換 1 3 4 n 1 3 1 n- n-1 n

A の直交変換 Ã=P T AP はつぎのように書き表せ, cotθ = (a ii -a jj )/(a ij ) ã ii = (1/)(a ii +a jj ) + (1/)(a ii -a jj )cosθ + a ij sinθ ã jj = (1/)(a ii +a jj ) - (1/)(a ii -a jj )cosθ - a ij sinθ ã ij = ã ji = 0 ã ik = ã ki = a ik cosθ + a jk sinθ (k=1,,,n, ただし k i,j) ã jk = ã kj = -a ik sinθ + a jk cosθ (k=1,,,n, ただし k i,j) ã kl = a kl (k,l=1,,,n, ただし k,l i,j) U の変換 Ũ=UP はつぎのようになる ũ ki = u ki cosθ + u kj sinθ (k=1,,,n) ũ kj = -u ki sinθ + u kj cosθ (k=1,,,n) ũ kl = u kl (k,l=1,,,n, ただし l i,j) 計算誤差を少なくするための注意 : 実際の数値計算においては,θ を求めることなく, 代数式から cosθ, sinθ, cosθ, sinθ を求めるほうが, 計算時間, 計算誤差とも少なくできる 一般に,cotα( あるいは tanα=cot -1 α) から cosα, sinα を求める場合, cotα 1 のとき sin α= 1, cosα = cotα sinα 1+ cot α cotα 1 のとき tanα = 1 1, cos α = 1, sinα = tanα cosα cotα 1+ tan α により計算すると,1 よりはるかに大きい数の二乗を行わずにすむのでオーバーフローを避けることができ, かつ 0 による割算を避けることができる cotθ から cosθ, sinθ を求めるときはこの関係を用いる さらに cosθ, sinθ を求めるときには半角公式を用いるが, 桁落ちを避けるため倍角公式も併用して, cos θ 0 1 のとき cos θ = (1 + cos θ), sinθ = sin θ (cos θ ) cosθ 0 1 のとき sin θ = (1 cos θ), cosθ = sin θ (sin θ ) により計算する 実用に耐える数値計算では, このような細部にまで注意が払われていることに留意しよう プログラム 5.1.1 1 3 4 5 6 7 8 9 10 11 /* solve eigen-value problem for a symmetric matrix */ /* by Jacobi's method */ #include <stdio.h> #include <math.h> #define NMAX 0 int jacobi(float); float a[nmax][nmax], u[nmax][nmax];

1 13 14 15 16 17 18 19 0 1 3 4 5 6 7 8 9 30 31 3 33 34 35 36 37 38 39 40 41 4 43 44 45 46 47 48 49 50 51 5 53 54 55 56 57 58 59 60 61 6 int n; void main(void) { int mcum,i,j; float eps; printf("order of a Symmetric matrix: n? "); scanf("%d",&n); printf("input Lower triangle of matrix n"); printf("? A(%d, j), j=1,%d : ", i+1, i+1); for(j=0;j<=i;j++){ scanf("%g",&a[i][j]); a[j][i]=a[i][j]; printf(" nsymmetric matrix: A n"); for(j=0;j<n;j++) printf(" %15.6e", a[i][j]); printf(" n"); for(j=0;j<i;j++) u[i][j]=u[j][i]=0; u[i][i]=1; mcum= 0; /* initial set for cumulative number of transformations */ while(printf(" ntolerance : eps? "), scanf("%g",&eps)!=eof){ mcum += jacobi(eps); printf("cumulative no. of transformations=%d n", mcum); printf(" n"); for(i=0;i<n;i++) printf(" %15.6e", a[i][i]); printf(" n n"); for(j=0;j<n;j++) printf(" %15.6e", u[i][j]); printf(" n"); int jacobi(float eps) { int i,j,k,m,mcycle; float p,q,t,s,c,c,s,r; m=0; /* initial set for transformation counter (total) */ 3

63 64 65 66 67 68 69 70 71 7 73 74 75 76 77 78 79 80 81 8 83 84 85 86 87 88 89 90 91 9 93 94 95 96 97 98 99 100 101 10 103 104 while(1){ mcycle=0; /* initial set for transformation counter (one cycle) */ for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if( fabs(a[i][j])>=eps ){ m++; mcycle++; /* increment of transformation counters */ p= (a[i][i]-a[j][j])/; q=a[i][j]; if( fabs(p)<fabs(q) ){ t=p/q; /* t=cot( theta) */ s= 1/sqrt(1+t*t); if(q<0) s= -s; c= t*s; else{ t=q/p; /* t=tan( theta) */ c= 1/sqrt(1+t*t); if(p<0) c= -c; s= t*c; if(c>0){ c= sqrt( (1+c)/ ); s= s/c/; else{ s= sqrt( (1-c)/ ); c= s/s/; r= (a[i][i]+a[j][j])/; a[i][i]= r + p*c + q*s; a[j][j]= r - p*c - q*s; a[i][j]= a[j][i]=0; for(k=0;k<n;k++) if( (k!=i)&&(k!=j) ){ p= a[i][k]; q=a[j][k]; a[i][k]= a[k][i]= p*c+q*s; a[j][k]= a[k][j]= -p*s+q*c; for(k=0;k<n;k++){ p= u[k][i]; q= u[k][j]; u[k][i]= p*c+q*s; u[k][j]=-p*s+q*c; if(mcycle==0) return(m); /* return no. of transformations (total) */ 実行例 教科書章末問題 の質点 ばね系の固有値問題をヤコビ法により解く (1) 運動方程式はつぎのように行列 ベクトル表示される 4

M&& s = Ks s1 m1 0 0 k1+ k k 0 s = s, M = 0 m 0, K = k k + k k 3 3 s 3 0 0 m3 0 k3 k3 () 系は固有振動数 ω の調和運動をしているとすれば, 解は振幅を s = xe iωt と表され, これを運動方程式に代入すると, 一般固有値問題 K x = ω M x となるので, 結局, 標準固有値問題 Ax 1 = λx ( ここに, A= M K, λ = ω ) を得る m 1 =m =m 3 =m, k 1 =k =k 3 =k とすると, 行列 A は 1 0 k A = 1 1 m 0 1 1 と表される いま k/m=1 として, 標準固有値問題を解く ------------------------- 実行開始 ----------------------- Order of a Symmetric matrix: n? 3 Input Lower triangle of matrix? A( 1, j), j=1, 1 :? A(, j), j=1, : -1? A( 3, j), j=1, 3 : 0-1 1 Symmetric matrix: A.000000e+00-1.000000e+00 0.000000e+00-1.000000e+00.000000e+00-1.000000e+00 0.000000e+00-1.000000e+00 1.000000e+00 Tolerance : eps? 0.1 cumulative no. of transformations=5 3.46979e+00 1.55485e+00 1.981960e-01-5.90746e-01-7.404091e-01 3.06514e-01 7.370955e-01-3.335710e-01 5.87748e-01-3.81969e-01 5.835449e-01 7.48069e-01 Tolerance : eps? 0.01 cumulative no. of transformations=6 3.46979e+00 1.554958e+00 1.9806e-01-5.90746e-01-7.37189e-01 3.79864e-01 7.370955e-01-3.77196e-01 5.910075e-01-3.81969e-01 5.908908e-01 7.369769e-01 Tolerance : eps? 0.0001 5 x T = [ x1, x, x] として

cumulative no. of transformations=7 3.46980e+00 1.554958e+00 1.9806e-01-5.910084e-01-7.36976e-01 3.79864e-01 7.369773e-01-3.79853e-01 5.910075e-01-3.79838e-01 5.910090e-01 7.369769e-01 Tolerance : eps? 1.0e-6 cumulative no. of transformations=8 3.46980e+00 1.554958e+00 1.9806e-01-5.910090e-01-7.36976e-01 3.79853e-01 7.369761e-01-3.79853e-01 5.910090e-01-3.79853e-01 5.910090e-01 7.36976e-01 Tolerance : eps? ^Z (control と Z を同時に押す ) (Enter Key を押す ) 入力終了コードの入力 ------------------------- おしまい ----------------------- 参考文献 葉子 : 数値計算の基礎 解法と誤差, コロナ社 (007) 森口繁一, 伊理正夫, 武市正人編 :C による算法痛論, 東京大学出版会 (000) Heath, Michael T.: Scientific Computing, An Introductory Survey, McGraw-Hill(00) 6