プログラミング実習 1 ・ 2 クラス 第 2 週目
DESCRIPTION
プログラミング実習 1 ・ 2 クラス 第 2 週目. 担当教員 : 渡邊 直樹. 課題 2. ● 2 × 2型行列の固有値 , 固有ベクトルを求める EigMatrix.java というプログラムを作成せよ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示 ● 2次方程式の判別式で処理を分岐し、 虚数解も出力 ● 課題提出の際は 授業中に指示された行列 を使うこと! (さもないと減点) ● 固有ベクトルの第1要素は1として、ベクトルの大きさ(ノルム)が 1となるようにプログラムを書くこと。. - PowerPoint PPT PresentationTRANSCRIPT
プログラミング実習 1 ・ 2 クラス第 2 週目
担当教員 : 渡邊 直樹
課題 2
● 2 × 2型行列の固有値 , 固有ベクトルを求める EigMatrix.java というプログラムを作成せよ。
● 行列の各要素はコマンド・プロンプトから入力● 計算した結果もコマンド・プロンプトに表示● 2次方程式の判別式で処理を分岐し、虚数解も出力● 課題提出の際は授業中に指示された行列を使うこと! (さもないと減点)
● 固有ベクトルの第1要素は1として、ベクトルの大きさ(ノルム)が 1となるようにプログラムを書くこと。
課題2の提出について• 提出方法 : 以下の事項に留意して記述したメールを [email protected] あてに送付。
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型)
for )Math.sqrt( Use
)det(
)tr( .2
0)(
0)det( 1.
oreigen vect: e,eigen valu: ,
2112221121
221121
2112221122112
aaaaA
aaA
aaaaaa
A
xxAx
ヒント( 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 2.000||4.000 3.000|
L1= 5.0+i*0.0, L2=-1.0-i*0.0X1=[…, …], 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);}