Skip to content

03_MATLABの練習

tetsu00 edited this page Mar 31, 2020 · 16 revisions

MATLABを起動してみましょう。デスクトップやアプリケーションの一覧にある、青とオレンジの山の絵のソフトがMATLABです。これをクリックすればMATLABが起動します。

openMATLAB

1. はじめに

1.1. ライブスクリプト

本体験会ではスクリプトと関数を編集して制御の体験をしてもらいます。
このページではまずMATLABに慣れてもらうためにライブスクリプトを使用します。
左上にある「新規ライブ スクリプト」をクリックしましょう。

1.2. プログラムの動作について

  • 原則、プログラムは上から下に向けて順に実行される
  • 命令間の半角スペースは、プログラムの動作には影響しない

1.3. コメントアウト

  • プログラム本文の中にコメントを入れることができる
  • %で改行までの部分がコメント
  • %{<br>%}<br>で挟んだ部分がコメント
  • 下のように入力して実行してみましょう
disp("Hello")  % Helloと出力される
% ここはコメント
%{
logo  % ロゴを表示する関数
%}
  • コメントアウトを外してlogo関数を実行してみましょう

1.4. 変数宣言

  • 変数は宣言しなければ使えない
  • 宣言によって、はじめて変数の存在を許される

1.5. 代入

  • プログラム中によく出現する=(イコール1つ)は「等しい」を表すものではない
  • MATLABにおいてこれは代入を表す
  • 例えばa=3という文は「aに3を代入する」となる
  • 代入すると値が確定する
  • プログラムを何回実行しても、代入した後の値は次の代入まで不変
  • 下に書かれた代入は上で行われた代入を上書きする
a = 3  %aに3を代入

a = 5  %aに5を代入
  • a=3;のように;を書くと計算結果が出力されないようになります
a = 3;  % 出力されない

a = 5  % 出力される

1.6. ワークスペース ブラウザー

  • ワークスペース内の各変数やオブジェクトについて表示します

2. 四則演算をやってみる

基本となる加減乗除をやってみましょう。まず変数を足すは"+"、引くは"-"、掛けるは"*"、割るは"/"の記号を使います。以下のようにa~Zの6つの文字(変数という)と、d-fの文字を定義します。

a = 1
b = 3.3333;
c = -5
X = 100;
Y = 7.7777777777
Z = -100000;

% 用意した変数を使って計算する

d = a + b - c

e = X * Y * 0.1

f = X / b

fourArithmetic

この状態で右上の緑の矢印「実行」をクリックすると...

fourArithmeticResult

右側に計算結果が出力されました。 d-fはそれぞれa-Z、数値を組み合わせて演算した結果になっています。 また、左側の「ワークスペース」を見てください。ここには先ほど計算した結果がすべて入っています。;で非表示にしても、ここには結果が格納されています。試しにdをクリックしてみると、

dResult

エクセルのような表の1行目(上から下向きに数える↓)の1列目(左から右に数える→)にdの計算結果である9.333...が入っていることがわかります。このように計算結果が保存されます。 表のようになっているのは、後で使う「配列」や「行列」を使うのに適しているからです。

2. 配列と行列を使ってみる

細かいことを言えばどっちも配列だしどっちも行列でもあるのですが、ここでは数列のように1直線に値が連なるものを「配列」、エクセルのように何行何列目みたく2次元状に分布しているものを行列とします。行列はそれ自体数学の分野で難しい計算とかがあるので、ここでも注意する点があります。行列は1年次に数学の講義で習います。

2.1. 行列と要素

まずは次の図のようにA、B、Cを定義します。zeros(X,Y)はX行Y列の2次元行列をつくり、それぞれの値(要素)を0とします。今回は3行5列の行列Aを作ります。BはAや、B自身の値をコードの上から順に操作していきます。12行目では、1行目から順々に実行してきたBの結果を表示します。
ここで、先頭にclear...などとありますが、これは先ほどの実行結果a~Zなどを、新しい実行の前にワークスペースから消しておくためです。意図せず値が残っていると、うっかり使ってしまい間違った結果になります。必要無ければ消しておくのが安全です。

matrixABC

実行結果は次の図の通りです。右側の出力欄にある通りAがゼロ行列となっています。出力Aの下にあるのがコード8行目を実行した際のBの出力です。Aのすべての要素に1を足した行列になっています。ここからさらに10、11行目でBの1行1列目(1,1)、1行3列目(1,3)にそれぞれ100、50の値を代入しています。この結果がコード12行目により出力に表示されています。

matrixBResult

左下のワークスペースにあるBも最終結果通りになっています。

matrixBWS

2.2. 行列の値と形

つぎは画像のようにC、D、E、Fを定義します。Cは[]で閉じられていて、数字の区切りが","と";"の2種類あります。これは行列を1行目から順に数値を入れています。;が行の切れ目で、この場合Cの1行目は左から1、2、3で、2行目が4、5、6で、3行目が7、8、9と続きます。D、E、FがそれぞれCを操作したものですが、この結果を見てみましょう。

matrixCDEF

実行結果は図の通りです。Cは3X3行列となっています。DはCの2行目に 相当します。これは":"が「その行or列の全ての要素」を意味するからです。D=C(2,:)は「Cの2行目にある全ての列要素」を意味するため、2行目が丸々コピーされました。
同じようにE=C(:,3)は「Cの3列目にある全ての行要素」を意味するため3列目がコピーされました。
このとき、Dのコピーは横一列のまま、Eのコピーは縦一列の並びをそのままコピーしています。行列では要素の個数だけでなく、縦の並びか横の並びかも重要です。

matrixCDEF2

またFはどうでしょう。Cの斜めに入れ替えた形になっています。これは「転置」という行列の変換方法です。詳しくは数学の講義でやりますが、(X,Y)を(Y,X)とするように行と列を入れ替えます。
それに応じて行列の形が変えられます。例えば(2,7)が(7,2)となるので、2行7列の横長行列が7行2列の縦長行列になります。

2.3. 行列同士の計算

MATLABでは行列と行列を組み合わせることもできます。1行3列の配列GとHを用意します。これを使って、図にあるような、配列の同じ位置にある要素同士の計算がしたいとします。予想通りになるでしょうか?

matrixGHIJ

実行結果が出ました。赤のビックリマークが出ています。エラーがあったようです。これを見てみると、Iまでは正しくできているようです。 実はJの求め方が間違っています。欲しい結果はGとHの同じ位置の要素を掛け算したものなのですが、この方法ではもとめられません。
その答えは「行列同士の掛け算」という別の操作を行ってしまっているからです。詳しくは行列の講義で習うのですが、その操作は望んでいる「要素同士の掛け算」とは違います。配列・行列同士は、Iの足し算や引き算は直観と同じなので問題ないのですが、掛け算・割り算は異なります。

matrixGHIJerror

しかし掛け算・割り算でも要素同士で計算する方法があります。それは*や/の前に".(ピリオド)"を置いてやることです。これによりMATLABは要素同士の計算をするんだと解釈します。ピリオドを置いた際の実行結果を見てみましょう。

matrixGHIJcorrect

確かに、望み通り要素同士が掛け算された配列Jが得られました。ただ、今回は行列同士の掛け算も成立できない形だったため、明らかなエラーが出ましたが、場合によっては「望んでる方法ではないんだけど、計算はできてしまう」ことがあります。
MATLABも使用者の頭の中は読めないので、計算が成立さえしてしまえばエラーを出しません。そのため使用者は自分の望んだ計算がされていないことに気づかないことがあります。途中途中、望んだ結果が出ているか確認しながらプログラムを書きましょう。後から気づくと萎えます。すごく萎えます。

3. for文とif文

プログラムを書くと、「ここだけ何回繰り返したい」「この条件に当てはまる時だけ実行したい」と思うときがあります。それに応えるのがfor文とif文です。
このfor文とif文は違うプログラミングでも間違いなく(?)存在する機能なので、ぜひ覚えましょう。といっても、全然難しくありません。

3.1. for文を使ってみる

for文の機能は「iの値が指定された値になるまでfor-end内を繰り返す」です。次の図のfor-end内を見てください。i=1:length(theta)とあります。これは「最初のiを1として、配列thetaの長さの値になるまでfor-end内を繰り返す。1回endに着く度にiの値を+1する」を表します。言葉ではわかりにくいので、実行すると、

for1

iの値が1~10まで変化しながら表示されているように、for-end内が配列thetaの要素数だけ繰り返し実行されています。length(A)は配列Aの長さを求める関数です。そして、i回目の繰り返しごとのiを配列theta のi番目に代入しています。繰り返しの終わりにはコードには書かれていませんが、暗にi=i+1が実行され、for文の先頭に戻り、再度繰り返すか判断されます。
出力の最後のthetaが示すように、配列theta のi番目の値がiになっています。

forResult

3.2. if文を使ってみる

if文の機能は「次に示す条件が成立するとき、if-end内を繰り返す」です。
次の図のif-end内を見てください。先ほどのfor文の中にif-endの組が2つあります。一方は「i=3ならば中身を実行」もう一方は「iが9より大きければ中身を実行」です。先ほどのfor文の練習の通りならiの値が変わった行く中で、iが3のとき、10の時にそれぞれ実行されるはずです。実行してみると、

if1

i=3、i=10の時、それぞれが実行されます。プログラム中で""でくくった文字は出力欄に文章として表示できます。またdisp(A)関数は変数Aの値を表示できます。これより、正しくi=3、i=10の時のみ実行されていることがわかりました。
このとき「XXに等しい」という条件は"=="と=を2個使います。"="でないので気を付けてください。

if1Result

if文で使える条件には、「かつ」「または」もあります。「かつ」は&&で条件をつなぎ、「または」は||で条件をつなぎます。 この時配列tmp(一時的:tmporaryの略でよく変数名に使う)に'i='、num2str(i)、'だってさ'みたいな3つの要素が入っています。num2str(A)は変数Aの値を文字として認識させる関数です。このようにMATLABの配列には文字を入れることもできます。これをdisp()で文章として出力します。

if2

上側のif文はiが3より大きく6より小さい、すなわちi=4、5のとき実行されています。この時、語尾が「だってさ」となります。実行結果を見ると確かにi=4,5の時だってさ文が出力されています。
同じく、下側はiが2より小さいか9より大きい、すなわちi=1、10のときに語尾が「です!!!」の文が出力されています。

if2Result

4. グラフにする

最後はグラフの作製です。MATLBでは数値を求めるだけでなくグラフも描いてくれます。ここでは1-180°の角度におけるsinの値をグラフにしてみましょう。

次の図のように初めから順に1-180の値が入った、要素180個の配列theta(シータ、三角関数で使うアレ:$\theta$)を用意します。これは"度"を表します。
MATLABで三角関数を使うには$sin()$、$cos()$、$tan()$が準備されています。それぞれラジアン表記で使用できます。例えば、$sin(30°)$なら、$sin(1/6\pi)$なので、thetaの要素をそれぞれ$\frac{1}{180}\pi$倍します。よってSinValueをthetaの要素それぞれを$sin()$変換したものとすると、 $$ SinValue(1,i) = sin\bigl(\frac{theta(1,i)}{180}\pi\bigr) $$ となります。これをプロット(グラフの描画)します。横軸がthetaの値、縦軸がそのthetaに対応するSinValueの値とします。この描画機能がplot(theta, SinValue)です。そこより下のtitle等はグラフに名前とか単位を記載するためです。これを実行すると、

graphSet

以下のように、出力欄に山形のグラフが出てきました。横軸の90を境に対象で、90の時の値が1です。お気づきの通り、サイン関数の値をグラフにしたものです。このように2次元グラフ描ければ、3次元立体のグラフも描けます。

graphResult

いかがでしたでしょうか?もちろん最初は慣れずに不安だと思います。ですが慣れてしまえば、厄介で難しい計算を不安な手計算ですることなく、MATLABですぐに計算できるようになります。系によっては演習等でMATLABを使うので、ここで慣れておくと講義でも怖がることはありません。

それでは楽しいMATLABライフをお送りください!

Clone this wiki locally