プログラミング設計演習 II - 講義ノート (第 02 回) はじめに 1 今回は , 実際の場面での利用を想定したより効率的なスクリプトの生成や結果の表示を行うため, • ファイル入出力, • 発展的なデータ格納形式, • 2 次元, 3 次元グラフの描画 について演習する. (注) 課題実施のために読み込む必要があるファイルは全て演習用 HP にあるので , これらのファイルを 自分のホーム以下の適当な場所にコピーしてから利用すること . MATLAB におけるファイル入出力 2 MATLAB では , C や Java と同様, 計算した結果をファイルとして出力したり, 特定の形式のファイルか ら読み込んだデータを利用したりすることが可能となっている. また, MATLAB では , 起動後に使用し た変数などが Workspace と呼ばれる記憶領域に格納されており, Workspace 内の情報をまとめてファイ ル出力することも可能となっている. Workspace 上に存在する変数のリストを関数 who により表示でき る. より詳細な情報は whos を実行すれば得られる. MATLAB 開発環境を使っている場合, MATLAB ウィンド ウ左上のタブ「 Workspace 」をクリックすることによっても内容を確認できる. 2.1 2.1.1 Workspace の内容の保存と読込 Workspace 全体の保存と読込 組み込み関数 save を利用することで , Workspace 上にある全ての変数を , MATLAB 固有のバイナリ ファイルである MAT ファイルとして保存できる. また, 関数 load の実行で , MAT ファイルの内容を Workspace 上へ読み込める. 課題 01: 以下に示されるスクリプト を生成, 保存, 実行し , MAT ファイル (p01.mat) が生成されてい るか , また, ファイルに正しい変数の内容が格納されているかを確認せよ. >> >> >> >> >> >> >> >> >> clear; A = rand(3); B = eye(3); save p01; pause; clear; load p01; A B (注) save, load では , 拡張子を省略しても自動的に拡張子.mat が付加される. 逆に , 適当な拡張子 (例 えば , .dat や.txt ) を付けて Workspace の内容を保存することもできる. ただし , その場合, MATLAB からはファイル形式が ascii であると認識されてしまうため, >> load ファイル名. 拡張子 とするとエラーが出る (確認せよ). このような場合, ファイルを正しく読み込むにはオプション -mat を 付けて >> load ファイル名. 拡張子 -mat とする必要がある. 1 2.1.2 Workspace 内の変数の保存と読込 Workspace のすべての変数でなく, 特定の変数を特定のファイルに保存したり読み込んだりすることが できる. 課題 02: 以下のコマンド により A, B, C を作成せよ: >> A = [1:4]; >> B = diag(A,0); >> C = zeros(3,2); save の help を参照し , これらのうち, A を p02 1.mat に, B と C を p02 2.mat に保存せよ. Workspace をクリアした後それらを読み込んで , ファイルに正し く変数が格納されているか確認せよ. 2.1.3 Workspace 内の変数をテキスト ファイルとして保存 save にオプション -ascii を付加することで , Workspace 内の変数をテキストファイルとして保存する ことができる. この内容は関数 type で確認できる. この場合, 拡張子は自動的に付加されないので , 各 自適当な拡張子を付加する必要がある. 課題 03: 課題 02 で利用した変数 A, B をテキスト ファイル p03.dat として保存せよ. Workspace を クリアした後にこのファイルを読み込んだときの結果を確認せよ. また, テキストファイルの形式でファ イルを保存した場合, そのファイルを読み込みできなくなる (エラーが出る) ことがある. どのような場 合にエラーが出るか調べよ (課題 2 における変数 A, B, C のサイズ (行の数/列の数) が異なっている場 合には、エラーが出ることがある). 2.2 テキスト ファイルの保存と読込 C 言語等と同様, MATLAB でもファイルのオープンやクローズによるファイル入出力が概念が利用され る. また, fprintf fscanf といったコマンド も使われる. 2.2.1 ファイルのオープンとクローズ ファイル入出力を行うためには事前にファイルのオープンが必要であり, 入出力作業の終了後にはクロー ズの必要がある. ファイルのオープン , クローズはそれぞれ関数 fopen, fclose で行う. これらの使用 例を以下に示す: >> >> >> >> >> fid = fopen(’example1.txt’, ’w’); a = 1; b = 0.1; fprintf(fid, ’example: a = %d, b = %f\n’, a, b); fclose(fid); fopen 関数は第 1 引数で指定したファイル名 (上の例では example1.txt ) のファイルを開く. 第 2 引 数の w は , 対象となるファイルへの書き込み (ファイルが存在しなければ新たに作成) を行うことを表す. 第 2 引数のオプションには以下のようなものがある: w r a 2.2.2 書出 読込 追加 (ファイルが存在しない場合にはファイルを作成する) fprintf と fscanf fprintf はオープンしたファイルに値を出力する関数であり, 第 1 引数としてファイル識別子を , 第 2 引 数としてフォーマットを , 第 3 引数として出力する変数をとる. 第 1 引数のファイル識別子は , fopen お よび fclose で指定するものである. フォーマットの指定方法は C 言語における printf と同様である. 行列やベクトルを出力する場合, 第 1 列目から順に読み込まれ , 対象の行列やベクトルのすべての要素が 2 読み込まれるまで指定されたフォーマットが繰り返し適用される. 出力する変数の指定方法は C 言語に おける printf と同様である. 以下は fprintf の使用例である: >> >> >> >> >> >> x = 0:0.1:1; y = [x; exp(x)]; fid = fopen(’example2.txt’, ’w’); fprintf(fid, ’Exponential Function\n\n’); fprintf(fid, ’%6.2f %12.8f\n’, y); fclose(fid); 上の例では , y は 2 行 11 列の行列である. 5 行目の fprintf では , y の要素を 第 1 列 → 第 2 列 → · · · → 第 11 列 の順にフォーマットにしたがって書き出している. 最初の%6.2f は小数点以下 2 桁を持った 6 文字の固 定小数点表示を指定しており, 次の%12.8f は小数点以下 8 桁を持った 12 文字の固定小数点表示を指定 している. 課題 04: 以下のような内容のファイルを作成するための MATLAB のスクリプト を作成せよ: 1 2 3 4 5 6 7 8 9 10 1.0 4.0 9.0 16.0 25.0 36.0 49.0 64.0 81.0 100.0 1.0000 1.4142 1.7321 2.0000 2.2361 2.4495 2.6458 2.8284 3.0000 3.1623 なお, fprintf のコマンド をループで何度も呼ぶのではなく, 上の例の行列 y のように, 表示するすべ て数値を 1 つの行列に格納し , 1 度だけ fprintf を呼ぶこと . なお, 出力されるファイル名は p04.txt とし , スクリプト ファイル名は p04.m とせよ. 課題 04 では , MATLAB で作成する行列がファイルに書き出される行列の転置であることを注意する必 要がある. すなわち, 題意のようなファイル出力を行うためには , MATLAB 上で次のような行列を作成 すればよい. 1 2 3 4 5 6 7 8 9 10 1.0 4.0 9.0 16.0 25.0 36.0 49.0 64.0 81.0 100.0 1.0000 1.4142 1.7321 2.0000 2.2361 2.4495 2.6458 2.8284 3.0000 3.1623 ファイルからの読み込みには関数 fscanf を用いる. fscanf は 3 つの引数を持つ. 第 1 引数はファイル 識別子を , 第 2 引数はフォーマットを指定する. 第 3 引数は , 読み込むデータの数などを指定するための もので , 下記のようにいろいろな指定方法がある: n inf [m, n] n 個の数値を読み込む (ファイルに格納されている数値の数より大きく設定してもよい). ファイルの数値を最後まで列ベクトルとして読み込む. m 行 n 列の行列にデータが格納される (n は inf でもよい). fscanf は 2 つの返却値を持つ. 第 1 返却値には読み込まれた値を格納する変数を指定し , 第 2 返却値 (省略可能) には正常に読み込まれた数値の個数を記憶する変数を指定する. 以下は次のような数値列 3 1 2 3 4 5 6 7 8 9 が格納されている example3.txt からの読み込みの例である: >> fid = fopen(’example3.txt’, ’r’); >> [A, count] = fscanf(fid, ’%d %f’, [3, 2]); >> fclose(fid); 行列 A がどのようになるか , count の値がいくつになっているかを確認せよ. 2.2.3 文字列に関するファイル入出力 ファイル中に含まれる文字列データを読み込む関数には , fgetl や fgets もある. これらはファイル 1 行分のデータをそのまま文字列として取り込むため, データ取り込み時に文字数を指定する必要がない. 書式は s = fgetl(ファイル識別子) となり, s に取り込まれた文字列が格納される. fgetl と fgets の違いは , 行の終端にある改行コードな どを読み込むか否かである. 課題 05: 文字の行と数字の行の混在した以下のようなファイルがある (p05.txt): nagoya tokyo5 100 osaka 25 12345 nara 999999 00kyoto これを文字の行のみから成るファイルと数字の行のみから成るファイルに分割するプログラムを作成せ よ. ファイル名を p05.m として保存せよ. なお, 文字と数字が混在している行がある場合には文字の行 とみなすこと . 上のファイルを適用し , 文字のみから成るファイル (p05 c.txt): nagoya tokyo5 osaka nara 00kyoto と数字のみから成るファイル (p05 n.txt): 100 25 12345 999999 が作成されることを確認せよ. 課題 05 を行うにあたって, ファイルの終端 (EOF) を判定する関数 feof および文字列の個々の要素が文 字であるかど うか (数字でないかど うか ) を判定する関数 isletter を使う必要がある. これらの関数の 使い方については help 機能を使って各自調べること . 本課題では , ファイルの内容を 1 行ごとに読み取 り, 文字列か数値か判定をし , 事後処理を行う, という状況は多くの応用問題で現れる. このような状況 に関しては定型があるので , (ほとんど 解答を与えてしまうことになるが ) 覚えておくとよい. 4 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: fid = fopen(’filename’, ’r’); while feof(fid) == 0 % ファイルの終端までの繰り返し data = fgetl(fid); % 1 行ごとに文字列として取得 if (sum(isletter(data)) > 1) ... % 文字列 (非数値) として処理 else ... % 数値として処理 end end fclose(fid); 注意すべき点は 2 行目と 4 行目であろう. 2 行目はファイルの終端にくるまでの繰り返し文の定型表現 である. 4 行目は isletter という関数を使っているが , これは文字列の各要素が非数字であるか数字で あるかを判定してベクトルを返す関数である (help にて確認せよ). 文字である場合には 1 を , 数値であ る場合には 0 を返すような仕様となっている. 文字列に 1 つでも非数字が含まれる場合は数値でないの で 4 行目では isletter(data) の合計が 1 より大きいかど うかで判定をしている. MATLAB には , ここまで述べてきた関数の他に , データの内容をバイナリで読み書きする fwrite, fread, といった関数もあるが説明は省略する. 3 多様なデータ格納形式 (構造体配列およびセル配列) MATLAB で取り扱うデータは一般的に行列やベクトルといった形で表されるが , それらが複数組み合 わされて意味を持つ「ひとかたまり」のデータとなっているような場合, 構造体配列やセル配列を利用 することで便利に取り扱うことが可能となる. 3.1 構造体配列 構造体配列は , 複数のデータ (それが同じ型のデータであってもそうでなくても) を一変数で管理可能と する. 次のような例を考えてみよう. (例) 某プロ野球リーグの某年某日の時点での勝敗表がファイル p06.txt に格納されている. 各チームご との内容は 「チーム略称 (アルファベット 2 文字) 」, 「勝ち数」, 「負け数」, 「引き分け数」 となっている. このファイルを読み込んでチームごとの処理を行いたい場合, 各チームのデータをまと めて管理する構造体を作ると便利である. 構造体中の各データを格納する領域はフィールド と呼ばれる. 上の例の場合, name フィールド , win フィールド などを作成し , それぞれのデータを格納すればよい. 構造体配列の生成には関数 struct を用いる. 書式は以下のようになる: 構造体名 = struct(’ フィールド 名 1’, 値 1, ’ フィールド 名 2’, 値 2, ...) もしくは以下のように直接各フィールド 値を指定してもよい: 構造体名. フィールド 名 1 = 値 1, 構造体名. フィールド 名 2 = 値 2, ... 同様のデータ構造が複数ある場合, 構造体配列として複数の構造体を定義できる. 書式は以下のように なる: 構造体名 (1) = struct(’ フィールド 名 1’, 値 1-1, ’ フィールド 名 2’, 値 1-2, ...) 構造体名 (2) = struct(’ フィールド 名 1’, 値 2-1, ’ フィールド 名 2’, 値 2-2, ...) . . . 5 各フィールド 値を直接指定する場合には , 構造体名 (1). フィールド 名 1 = 値 1-1, 構造体名 (1). フィールド 名 1 = 値 1-2, ... 構造体名 (2). フィールド 名 1 = 値 2-1, 構造体名 (2). フィールド 名 2 = 値 2-2, ... . . . 課題 06: ファイル p06.txt から取り込んだデータを, 以下のような構造体 Team に格納せよ. 構造体 Team は , 「チーム略称 (アルファベット 2 文字)」を表すフィールド name, 「勝ち数」を表すフィールド win 「負け数」を表すフィールド lose 「引き分け数」を表すフィールド draw を持つものとする. ま た, 各チームの勝率 (勝数/引き分けを除く総試合数) を計算し , 別なフィールド に格納せよ. ファイル名 は p06.m として保存せよ. 構造体の情報が各行に記録されているファイルから構造体配列を作成する応用問題は多いので , ここで も, ヒントとして定型文を提示する: 1: 2: 3: 4: 5: 6: 7: 8: fid = fopen(’filename’,’r’); i = 0; while feof(fid) == 0 i = i + 1; S(i).member1 = fscanf(fid, ...); S(i).member2 = fscanf(fid, ...); ... end 上の定型文では , S(1), S(2), ... それぞれが構造体で member1, member2, ... を持っている. ファイルには構造体の各メンバが順番に記録されているので , 読み込むメンバの型に注意して fscanf で 読み込みを行えばよい. 構造体に関する組み込み関数としては以下のようなものがある: fieldnames rmfield isstruct 構造体のフィールド 名を獲得する フィールド の削除 構造体配列の検出 (例) fieldnames(Team) (例) Team = rmfield(Team, ’draw’) (例) isstruct(Team) 構造体は次回演習のテーマである GUI の作成の際にも重要な役割を果たす. 3.2 セル配列 構造体では , フィールドごとにデータを格納するという形をとっていたのに対し , セル配列では , 配列の 各要素にあらゆる型のデータを格納できる. すなわち, 異なる型やサイズのデータを 1 変数で管理できる. 先の勝敗表を例に取ると , p06.txt の 1 行目のデータは Team = { ’DE’, 67, 64, 8 } と定義できる. 配列の要素にはこの例のような文字列, 数字のほか , 以下の例のように , 任意のサイズの ベクトルや行列も格納できる: C = {10, [2 4; 5 7; 3 8], ’ABC’, [1 3 5]} また, 以下の例のように , 任意のサイズの空行列からなるセル配列を作成する関数 cell も用意されて いる: cell(3); % 3×3 の空行列からなるセル行列を生成 6 セル配列の任意の要素へ値を格納する方法は 2 種類あり, 結果はど ちらでも同じになる. 例えば , 2 × 2 のセル配列 x = cell(2) の (2,2) の場所に [1 2; 3 4] を格納する場合, 以下のいずれかの方法で実行 できる: >> X{2,2} = [1 2; 3 4]; % セル配列への入力方法 1 >> X(2,2) = {[1 2; 3 4]}; % セル配列への入力方法 2 セル配列に関する組み込み関数には、以下のようなものがある. cellfun celldisp cellplot cell2mat mat2cell iscell セル内各要素の長さや要素数を出力したり, 各要素が空であるかど うかなどを調べる. セル配列の内容を表示 セル配列の内容をグラフィカルに表示 同じ型の要素を持つセル配列を単一の行列に変換 行列をセル配列内の行列に変換 セル配列の検出 課題 07: 課題 06 と同様の処理を 6 × 3 のセル配列を用いて実行せよ. セル配列の各行は各チームを 表し , 第 1 列はチーム名を, 第 2 列は勝ち数, 負け数, 引き分け数をまとめたベクト ルを , 第 3 列は課題 06 のように計算される勝率を表すものとする. ファイル名は p07.m として保存せよ. 4 グラフ描写 これまでは行列を中心とする様々な数値や文字列といったデータの処理方法について紹介してきた. 続 いて, これらのデータをグラフの描画を通して視覚化する方法について説明する. 4.1 2 次元グラフ MATLAB では , さほど 複雑な手順を踏まなくてもさまざ まなグラフを作成するることができる. 4.1.1 基本的なプロット まず , ごく一般的なグラフの描画に用いられる組み込み関数 plot の使用例をベースとして, グラフ関連 の様々な設定についても紹介していく. y = f (x) と表されるような一般的な関数のグラフ描画には , 組み込み関数 plot がよく用いられる. plot の help を見ると , 様々な引数の設定方法があるが , まずは最もシンプルな例として以下のスクリプトを 実行してみよ. >> x = 0 : pi/100 : 2*pi; % pi は円周率πを表す >> y = sin(x); % sin は正弦を表す関数 >> plot(y); このスクリプトを実行すると , 0 ≤ x ≤ 2π での sin(x) が π/100 刻みでプロットされ (かつ点の間が線で 補間され ) て新たなウィンド ウ上に表示される. ただし , 表示されるグラフを見る限り, 横軸に関しては データ数のカウントがそのまま表示されている. 横軸を x の値に対応付けるには , 上の plot(y) の代わ りに plot(x, y) と入力すればよい. グラフの線のタイプや色, もしくは線の代わりにマークでプロットするような場合, x 軸, y 軸のデータ に関する引数に引き続き, 次のような引数を加えれば良い (引数はシングルクォーテーション「 ’ 」で囲 むこと ). 7 : --. なし 線のタイプ 実線 点線 鎖線 一点鎖線 点を表示しない c m y r g b w k + o * . x s d ^ v > < p h 線の色 シアン マゼンダ 黄 赤 緑 青 白 黒 点のマーク プラス 円 アスタリスク 点 ×印 正方形 ダ イアモンド 上向き三角 下向き三角 右向き三角 左向き三角 星 六芒星 例えば , 上の sin カーブをプロットする際, >> plot(x, y, ’:r+’) とすると , データ点を赤いプラスマークでプロットし , その間を赤い点線で結ぶことになる. また, 線の 太さを指定する場合には , 以下のように引数をさらに 2 つ追加する. >> plot(..., ’LineWidth’, 線の太さ (数値)); 4.1.2 複数グラフのプロット それぞれのグラフを別のウィンド ウに描画するには , 組み込み関数 figure を利用する. 具体的には以下 のように行う. >> >> >> >> >> >> 1 つ目のグラフを描写; figure; 2 つ目のグラフを描写; figure; ... n 個目のグラフを描写; 課題 08: −2π ≤ x ≤ 2π の範囲 (プロット 点は π/20 間隔) で sin(x) と cos(x) のグラフをそれぞれ別 のウィンド ウに描画するスクリプト を作成せよ. x 軸の値は関数の定義域と対応づけること . また, 一 8 方のグラフは黒い実線で丸マーク , もう一方は赤い鎖線と星マークでプロット すること . ファイル名は p08.m として保存せよ. 1 つのウィンド ウ中に複数のグラフを描画する方法はいくつか存在する. 最も簡単な方法としては , plot の引数として描画したいグラフの情報を列挙するというものが挙げられる. 書式は以下のようになる: >> plot(x 軸のデータ 1, y 軸のデータ 1, ’ 描画の書式 1’, x 軸のデータ 2, y 軸のデータ 2, ’ 描画 の書式 2’, ...); 通常, plot を何度も呼び出すとそのたびに新たなウィンド ウが生成されるが , ウィンド ウが表示された 後に hold on と入力することで , その後の plot 呼び出しの結果は全て既存のウィンド ウに追加される こととなる. 追加を終了するには hold off とする. 以下に手順のイメージを示す. >> >> >> >> >> plot(...); hold on; plot(...); plot(...); hold off; 課題 09(選択): 課題 08 と同様のグラフを hold on, hold off, と複数の plot を用いて 1 つのウィン ド ウ上に描画せよ. ただし , sin(x) のグラフについては線の太さを 3 とし , 新たに cos2 (x) のグラフも , 線の太さ 0.5 の緑の一点鎖線で , 追加して描画すること . ファイル名は p09.m として保存せよ. subplot は , 1 つのウィンド ウ中に複数のグラフを描くために用いる関数である. plot 等のグラフ描画 関数を宣言する前に >> subplot(m, n, p); を宣言すると , ウィンド ウ中を m × n の領域に分けたうちの左上から p 番目にグラフ描画が実行される. 課題 10(選択): 課題 09 における 3 つのグラフを, 2 × 3 で分割した 1 つのウィンド ウ中の左一段目, 真 ん中二段目, 右一段目にそれぞれ描画するスクリプト を作成せよ. ファイル名は p10.m として保存せよ. 4.1.3 グラフのタイト ルや座標軸などに関する基本設定 グラフの色や線のタイプ , マーク以外で , グラフに付加したり修正したりすることができる情報として は , グラフタイトル , 軸のタイトル , グラフの説明, グリッド , 座標軸等に関する情報がある. よく利用さ れる関数には以下のようなものがある. title xlabel ylabel text gtext grid legend グラフにタイトルを付加 x 軸にラベルを追加 y 軸にラベルを追加 指定した座標中に説明文を付加 (挿入箇所はマウスで指定して) 説明文を付加 座標軸の追加, 削除 凡例の追加 (plot で描写された順番に引数として文字列を指定する) 座標軸を設定する関数としては , 組み込み関数 axis がある. 例えば , >> axis([xmin, xmax, ymin, ymax]); と入力することで , グラフの x 軸と y 軸の範囲をそれぞれ xmin ≤ x ≤ xmax, ymin ≤ y ≤ ymax へと 変更できる. なお, >> axis auto; 9 とすることによりデフォルトの自動範囲設定モード へ戻る. axis コマンド をタイプすると , 現在の座標 の範囲が表示される. また, >> axis square; にて x, y 軸の長さの比が 1:1 になる. 座標軸を消去するには , >> axis off; とし , 再表示させるには >> axis on; とする. 4.1.4 グラフのタイト ルや座標軸などに関する柔軟な設定 グラフの設定をハンド ルとしてを保存しておけば , それを利用していつでもグラフの線タイプや色, マー クを変更できる. グラフハンド ルを H とすると , >> H = plot(...); とすることでハンドルが保存され , その後, 以下の書式でプロパティを設定できる. ハンドルを設定する 書式は以下の通りである: >> set(H, ’ プロパティ1’, 値 1, ’ プロパティ2’, 値 2, ...); プロパティとしてこれまで紹介したものとしては LineStyle, LineWidth, Color, Marker などがある. 以下はハンド ルを設定してグラフを描く例である. >> x = 0:pi./100:2.*pi; >> H = plot(x, sin(x), x, sin(2.*x), x, sin(3.*x)); >> set(H, {’LineStyle’}, {’:’;’-’;’--’},{’LIneWidth’},{10;3;5}, {’Color’},{’r’;’g’;’b’}); 同様に , ハンド ルの概念を用いて, ウィンド ウの大きさと場所を指定する方法を学ぼ う. 以下は figure のハンド ル F1 としてウインド ウの位置と大きさを設定するコマンド 例である. >> F1 = figure(’Position’, [100 200 300 400]); figure ハンド ルの Position プロパティでは 4 つの数値 [Xp, Yp, Xr, Yr] が指定されるが , これは , スクリーン左下を原点として開きたいウィンド ウの左下の座標を (Xp, Yp), 横および縦のウィンド ウ幅 をそれぞれ Xr, Yr とすることを意味している. ハンド ル F1 に対してプロットを行いたいときは , >> figure(F1); とコマンドしておけば , 以降のグラフが F1 で指定された figure ハンドルに基づいて生成される. 上の 2 つのコマンドに続いて, 例えば以下のようなプロットのコマンド を与えてみること . >> x = 0:pi./100:2.*pi; >> plot(x, sin(x)); さらに , 関数 axes を利用することで , figure 領域中にグラフ描画するための座標領域を設定すること ができる. 引数を指定しなければ , 現在アクティブな figure 領域中に自動で描画領域を生成する. 引数 を設定する場合は figure と同様, >> A1 = axes(’Position’, [0.1 0.1 0.6 0.8]); 10 などと設定する. axes ハンド ルの Position プロパティを指定する際には , 4 つの数値は figure 領域 の左端を基準とした領域中の割合で指定する. 課題 11(選択): 次ページの図 1 のように, 2 つのウィンド ウにそれぞれ 2 つずつの座標領域を準備し , グラフ描画するスクリプト を作成せよ. ただし , 作成するスクリプトは以下の条件を満たすものとする。 ファイル名は p11.m として保存せよ. • ウィンド ウ 1 の座標は , 画面の左下を基点として (100, 500) で大きさは 600 × 300 とせよ. ウィン ド ウ 2 は同様に (300, 100), 600 × 300 とせよ. • 描写するグラフは上のウィンド ウの左から以下の順にせよ. – N (1.0, 2.5), – N (2.0, 2.0), { sin(x)/x, if x 6= 0, – sinc(x) = , 1, if x = 0 – Ex(7.0), – Be(0.3, 0.6), – G(1.0, 2.0), なお, N (µ, σ 2 ), Ex(α), Be(α, β) および G(α, ν) は , それぞれ , 正規分布, 指数分布, ベータ分布 およびガンマ分布の確率密度関数で以下のように与えられる: N (µ, σ 2 ) = √ { Ex(α) = { Be(α, β) = 1 2πσ 2 0, { (x − µ)2 }, 2σ 2 α exp(−αx), if x ≥ 0, , 0, if x < 0 1 α−1 (1 B(α,β) x G(α, ν) = exp{− − x)β−1 , if 0 ≤ x ≤ 1, , otherwise 1 ν ν−1 −αx e , Γ(ν) α x 0, if x ≥ 0, . if x < 0 なお, ベータ関数 B(α, β) およびガンマ関数 Γ(ν) は Matlab の組込み関数 beta および gamma と して用意されている. • 上のウィンド ウ中の 3 つのグラフにはグラフごとに説明を, 下の 3 つのグラフには凡例 (legend) を表示すること . • figure 領域やグラフ領域の色, グラフの線の色や種類, 線の太さ等はできる限り例に似せること . ちなみに, 右下のグラフ領域の色は白である. 11 図1 本節の最後に plot 以外によく使われる 2 次元のグラフ描写関数を紹介する. 詳細については help を参 照すること . bar pie hist contour 4.2 棒グラフの描写 円グラフの描写 ヒストグラムの描写 等高線の描写 3 次元グラフ MATLAB では , 3 次元グラフにおいても, 2 次元グラフの場合とほぼ同様の方法で描画が可能である. 例 として, 以下のようなスクリプトを実行せよ. >> >> >> >> >> >> >> >> >> >> t = [0 : pi/100 : 10*pi]; x = sin(t); y = cos(t); plot3(x, y, t); view(-75, 30); % 水平方向に -75 度, 垂直方向に 30 度の視点からグラフを眺める. pause; view(-75, 60); pause; view(-90, 90); % 真上から眺める, view(2) と同じ . pause; 12 >> view(3); % デフォルトの視点に戻る, view(-37.5, 30) でも同じ . plot3 を用いて一定の範囲内にある複数の曲線を書く場合は関数 meshgrid を利用する. 例えば , x の値 を {−3, −1.5, 0, 1.5, 3}, y の値を {−2, −1, 0, 1, 2} として f (x, y) = x2 + y 2 という 2 変数関数を描写す るには , 以下のようなスクリプトを実行すればよい. >> >> >> >> >> x = [-3 : 1.5 : 3]; y = [-2 : 1.0 : 2]; [X, Y] = meshgrid(x, y); Z = X.^2 + Y.^2; plot3(X, Y, Z); 上の例では , 作成される行列 z は以下のようなものとなっている: f (−3.0, −2.0) f (−1.5, −2.0) · · · f (+3.0, −2.0) f (−3.0, −1.0) f (−1.5, −1.0) · · · f (+3.0, −1.0) Z= .. .. .. .. . . . . f (−3.0, +2.0) f (−1.5, +2.0) · · · f (+3.0, +2.0) . 課題 12: |x| ≤ 5, |y| ≤ 3 の範囲で描画間隔を 0.1 として, 2 変数関数 f (x, y) = exp(−x2 − y 2 ) のグラフを描写せよ. グラフタイト ルには関数名を, 各軸には , それぞれ , x, y, z とラベルをつけよ. ファイル名は p12.m として保存せよ. 上に示した行列 Z の行成分よりなる曲線と列成分よりなる曲線の二つからできる曲面は , 組み込み関数 mesh を用いて描画できる. また, 関数 surf を用いれば曲面そのものを描画することもできる. なお, こ れらの関数の書式は plot3 と同じである. mesh や surf で生成される曲面は , その値に従い色分けがさ れている. 組み込み関数 colorbar を利用することで , 関数の値と色との関係が表示される. デフォルト では右端に , 引数に North や South などの方角を指定すれば上や下に表示される. 13
© Copyright 2024 Paperzz