プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹
課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示 ● 2次方程式の判別式で処理を分岐し、虚数解も出力 ● 課題提出の際は授業中に指示された行列を使うこと! (さもないと減点) ● 固有ベクトルの第1要素は1として、ベクトルの大きさ(ノル ム)が 1となるようにプログラムを書くこと。
課題2の提出について 提出方法 : 以下の事項に留意して記述したメールを あてに送付。 1. プログラムの実行結果とソースコード( java ファイル) をメールの本文に書く。順番は 実行結果、ソースコード どちらか一方だけでは提出とみなさない 2. メールの件名は必ず課題番号:学籍番号:氏名。 例:課題 2 : 2007xxx xx:山田太郎 メール本文の末尾にも名前くらいは入れましょう。 締め切りは 12 月 21 日 ( 金 ) 、 10:00am
今日の実習 2×2 型行列の行列式と逆行列を計算するための EigMatrix.java という名前のプログラムを作成する。 1.行列 A は double 型の二次元配列、二つの固有 ベクトル x1 、 x2 を double 型の配列として宣言 2. 行列 A の各要素 aij はコマンド・プロンプトから入 力 for 文を使い配列(行列) A に値を代入 3. 行列 A の要素を整列して出力 4.計算した固有値 λ 1、 λ 2と固有ベクトル x1 、 x2 を 出力(固有ベクトルは長さが1となるようにせ よ) 5. If … else if … else 文を使って、判別式の値をソー ト
固有値の求め方(2*2型)
ヒント( 1 ) : 課題2の雛形 import java.io.*; public class EigMatrix { public static void main(String[] args) { double a[][] =new double[2][2]; // 2X2 行列のための配列の定義と領域確保 String line; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { System.out.println("a"+(i+1)+(j+1)+"="); // 代入する成分を表示する line = reader.readLine(); a[i][j]= Double.parseDouble(line); } } // ここにプログラムを書く( sample2 参照) } catch (IOException e) { System.out.println(e); } catch (NumberFormatException e) { System.out.println(" 値が正しくありません "); }
ヒント(2):行列要素の整列表示(3 *3型) System.out.println("A="); for (int i = 0; i < 3; i++) { System.out.print(“|"); for (int j = 0; j < 3; j++) { System.out.printf("%8.3f\t", a[i][j]); } System.out.println(“|"); } sample1 と同じ
実行結果の例 --a11= 1 … A= | | | | L1= 5.0+i*0.0, L2=-1.0-i*0.0 X1=[…, …], x2=[…, …] ・・・第1要素は1として、ベクトルの大きさ(ノルム)が1と なるように プログラムを書くこと。 A[0][1]=0 の時はどうする?自分で 考えて みよ。(ボーナス・ポイント)
ヒント(3):2次方程式の解法 D=b*b-4*a*c; // 解の判別式 ( sample2 を見よ) if(D>0){Re1=(-b+Math.sqrt(D))/(2*a); //Re1, Re2 は実部 Re2=(-b-Math.sqrt(D))/(2*a); Im=0;} //Im は虚部 else if(D==0){Re1=-b/(2*a); Re2=Im=0;} else {Re1=-b/(2*a); Re2=Re1; Im=Math.sqrt(-D)/(2*a); } //Math.sqrt の中身に注意 注意:雛形(ヒント(1))では配列の定義で a[][] を使っている。 sample2 での a は2次方程式の係数の一つ。重複して使うと・・・
ヒント(3):続き 出力の際も判別式の値で分岐 if(D==0){ System.out.println( Re1 + "+" + "i*" + Im); } else { System.out.println( Re1 + "+" + "i*" + Im); // Im に虚数単位 i を掛けておく System.out.println( Re2 + "-" + "i*" + Im); }