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

10
プププププププププ 1 2 プププ ププ ププププ : ププ ププ

Upload: branden-shaw

Post on 03-Jan-2016

24 views

Category:

Documents


3 download

DESCRIPTION

プログラミング実習 1 ・ 2 クラス 第 2 週目. 担当教員 :  渡邊 直樹. 課題 2. ●  2 × 2型行列の固有値 , 固有ベクトルを求める EigMatrix.java というプログラムを作成せよ。  ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示 ● 2次方程式の判別式で処理を分岐し、 虚数解も出力 ● 課題提出の際は 授業中に指示された行列 を使うこと!   (さもないと減点) ●  固有ベクトルの第1要素は1として、ベクトルの大きさ(ノルム)が      1となるようにプログラムを書くこと。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: プログラミング実習  1 ・ 2  クラス 第 2 週目

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

担当教員 :  渡邊 直樹

Page 2: プログラミング実習  1 ・ 2  クラス 第 2 週目

課題 2

● 2 × 2型行列の固有値 , 固有ベクトルを求める    EigMatrix.java というプログラムを作成せよ。

    ● 行列の各要素はコマンド・プロンプトから入力●  計算した結果もコマンド・プロンプトに表示●  2次方程式の判別式で処理を分岐し、虚数解も出力●  課題提出の際は授業中に指示された行列を使うこと!  (さもないと減点)

   ● 固有ベクトルの第1要素は1として、ベクトルの大きさ(ノルム)が     1となるようにプログラムを書くこと。

Page 3: プログラミング実習  1 ・ 2  クラス 第 2 週目

課題2の提出について• 提出方法 : 以下の事項に留意して記述したメールを      [email protected]  あてに送付。

   1. プログラムの実行結果とソースコード( java ファイル)     をメールの本文に書く。順番は       実行結果、ソースコード   どちらか一方だけでは提出とみなさない

2 . メールの件名は必ず課題番号:学籍番号:氏名。   例:課題 2 : 2007xxx xx:山田太郎   メール本文の末尾にも名前くらいは入れましょう。

締め切りは 12月 21日 (金 )、 10:00am

Page 4: プログラミング実習  1 ・ 2  クラス 第 2 週目

今日の実習    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 文を使って、判別式の値をソート

Page 5: プログラミング実習  1 ・ 2  クラス 第 2 週目

固有値の求め方(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

Page 6: プログラミング実習  1 ・ 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(" 値が正しくありません ");}

}}

Page 7: プログラミング実習  1 ・ 2  クラス 第 2 週目

ヒント(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 と同じ

Page 8: プログラミング実習  1 ・ 2  クラス 第 2 週目

実行結果の例--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 の時はどうする?自分で

考えて   みよ。(ボーナス・ポイント)

Page 9: プログラミング実習  1 ・ 2  クラス 第 2 週目

ヒント(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次方程式の係数の一つ。重複して使う

と・・・

Page 10: プログラミング実習  1 ・ 2  クラス 第 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);}