プログラミング実習 1・2 クラス 第 2 週目 担当教員: 渡邊 直樹 課題 2 ● 2×2型行列の固有値, 固有ベクトルを求める EigMatrix.javaというプログラムを作成せよ。 ● ● ● ● ● 行列の各要素はコマンド・プロンプトから入力 計算した結果もコマンド・プロンプトに表示 2次方程式の判別式で処理を分岐し、虚数解も出力 課題提出の際は授業中に指示された行列を使うこと! (さもないと減点) 固有ベクトルの第1要素は1として、ベクトルの大きさ(ノルム)が 1となるようにプログラムを書くこと。 課題2の提出について • 提出方法:以下の事項に留意して記述したメールを [email protected] あてに送付。 1. プログラムの実行結果とソースコード(javaファイル) をメールの本文に書く。順番は 実行結果、ソースコード どちらか一方だけでは提出とみなさない 2. メールの件名は必ず課題番号:学籍番号:氏名。 例:課題2:2007xxxxx:山田太郎 メール本文の末尾にも名前くらいは入れましょう。 締め切りは 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型) Ax x, : eigen value, x : eigen vector 1. det(A ) 0 2 (a11 a 22) a11a 22 a12 a 21 0 2. 1 2 tr(A) a11 a 22 1 2 det(A) a11a 22 a12 a 21 Use Math.sqrt() for ヒント(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= |1.000 |4.000 2.000| 3.000| 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); }
© Copyright 2024 ExpyDoc