プログラミング実習 1,2 クラス 第 1 週目

プログラミング実習 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);
}