100 likes | 195 Views
プログラミング実習 1 ・ 2 クラス 第 2 週目. 担当教員 : 渡邊 直樹. 課題 2. ● 2 × 2型行列の固有値 , 固有ベクトルを求める EigMatrix.java というプログラムを作成せよ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示 ● 2次方程式の判別式で処理を分岐し、 虚数解も出力 ● 課題提出の際は 授業中に指示された行列 を使うこと! (さもないと減点) ● 固有ベクトルの第1要素は1として、ベクトルの大きさ(ノルム)が 1となるようにプログラムを書くこと。.
E N D
プログラミング実習 1・2 クラス第 2 週目 担当教員: 渡邊 直樹
課題 2 ● 2×2型行列の固有値, 固有ベクトルを求める EigMatrix.javaというプログラムを作成せよ。 ●行列の各要素はコマンド・プロンプトから入力 ●計算した結果もコマンド・プロンプトに表示 ●2次方程式の判別式で処理を分岐し、虚数解も出力 ●課題提出の際は授業中に指示された行列を使うこと! (さもないと減点) ● 固有ベクトルの第1要素は1として、ベクトルの大きさ(ノルム)が 1となるようにプログラムを書くこと。
課題2の提出について • 提出方法:以下の事項に留意して記述したメールを shakoj31@sk.tsukuba.ac.jp あてに送付。 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文を使って、判別式の値をソート
ヒント(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型)ヒント(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 2.000| |4.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); }