1 / 10

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

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. プログラミング実習 1・2 クラス第 2 週目 担当教員:  渡邊 直樹

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

  3. 課題2の提出について • 提出方法:以下の事項に留意して記述したメールを shakoj31@sk.tsukuba.ac.jp あてに送付。    1. プログラムの実行結果とソースコード(javaファイル)      をメールの本文に書く。順番は        実行結果、ソースコード    どちらか一方だけでは提出とみなさない 2. メールの件名は必ず課題番号:学籍番号:氏名。    例:課題2:2007xxxxx:山田太郎 メール本文の末尾にも名前くらいは入れましょう。 締め切りは 12月21日 (金)、 10:00am

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

  5. 固有値の求め方(2*2型)

  6. ヒント(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("値が正しくありません"); } } }

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

  8. 実行結果の例 --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の時はどうする?自分で考えて    みよ。(ボーナス・ポイント)

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

  10. ヒント(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); }

More Related