MATLABとは

MATLAB(マトラボ)は、アメリカのMathWorks社が開発している数値解析ソフトウェア(有料)であり、多くの技術者や科学者が科学計算に使用されています。

また、MATLAB自身は特有の言語をもって、MATLAB言語という名称もあります。MATLAB言語を対応している無料のソフトも多数あります。 例えば、Scilab、GNU Octave、FreeMatなどのソフトの文法はMATLAB言語の文法は非常によく似ています。MATLABの言語で書いたコードをそのままで他のソフトで実行できることもあります。

本授業はGNU Octave(グヌー・オクターブ)を使って、MATLABのプログラミングを行います。

1. 変数と出力

Fortran言語やC言語とは違い、変数のデータ型を宣言しなくでも使えます。 例えば、以下のコードで「a」、「b」、「c」という名前の変数を作成します。ここで、aは小数、bは文字列、cは配列です。

また、数値のある変数はディフォールトで倍精度の不動点小数です。即ち、変数の値は64bitに対応しています。

MATLAB言語の数値型のリストはこのページで確認できます。https://jp.mathworks.com/help/matlab/numeric-types.html

また、$\pi$, $e$等よく使用される数学の定数は用意されています。虚数単位はiとjになります。

In [69]:
a=10;
b='Niigata University';
c=[1,2,3];
pi
e
i*i
j*j
ans =  3.1416
ans =  2.7183
ans = -1
ans = -1
In [ ]:

変数の出力

コードは一行づつ実行されます。各行の終わりに、「;」がある場合、その行の計算結果が表示されていません。「;」が付いてない場合、値が表示されます。

また、displayを使って、変数の値の表示することができます。指定されるフォマットで表示する場合、printf()を使います。

printfのフォマットの設定では、「%d」が整数、「%s」が文字列、「%f」が小数に対応してます。

【演習1】

  • 上記のa,b,cの変数を作成するコードの「;」を外して、コードを実行してみてください。
  • コードの実行は「Shift」+「Enter」のキーを使います。
  • 以下のコードで、a,b,cの値を自由に修正して、displayとprintfの出力の結果を確認してください。
In [74]:
a=123.123456;
b='Niigata University';
c=20000;
display(a)
display(b)

printf("a = %f\n",a)
printf("b = %s\n", b)
printf("%s has more than %d students.\n", b, c)
 123.123456000000

Niigata University

a = 123.123456
b = Niigata University
Niigata University has more than 20000 students.

変数における関数の値

以下のコードで、変数$x$における$x^2$, $\sin(x)$, $\exp(x)$,$\log(x)$の関数の値を求めています。

In [103]:
x=10
x^2
sin(x)
exp(x)
log(x)
x =  10
ans =  100
ans = -0.54402
ans =    2.2026e+04
ans =  2.3026

2. 配列

配列は同じデータ型の数値の集まりです。以下の例で配列の作成ができます。

In [64]:
x=[] %空の配列を作る。
x=[1,2,3,4,5]
y=1:10 %1から10まで間隔が1である数列を作る。
z=0:0.1:1 %0から1まで間隔が0.1である数列を作る。
x = [](0x0)
x =

   1   2   3   4   5

y =

    1    2    3    4    5    6    7    8    9   10

z =

 Columns 1 through 7:

    0.00000    0.10000    0.20000    0.30000    0.40000    0.50000    0.60000

 Columns 8 through 11:

    0.70000    0.80000    0.90000    1.00000

また、配列の成分の値の修正、成分の追加と削除などの操作ができます。

In [65]:
x=[];
display('最初のx:')
display(x)

x(1)=10; x(2)=20; x(3)=30;
display('3つの値を加えったx:')
display(x)

x(2)=[]; %第2成分を削除します。
display('第2成分の値を削除した後のx:')
display(x);
最初のx:

[](0x0)

3つの値を加えったx:

   10   20   30

第2成分の値を削除した後のx:

   10   30

3. 曲線の描画

配列を利用して、曲線の描画ができます。

以下の手順に従って、$x\in [0,2\pi]$における曲線y=sin(x)の描画ができます。

  • 曲線の点のx座標とy座標の値によって配列を作成する。
  • plotというグラフ描画の命令によって曲線を描く。

plotの文法

  • 3番目のパラメータは曲線のスタイルをしています。以下の例の"-o"を"-+", "--.", "-^"に置き換えて、描画の結果の確認しなさい。
  • 3番目のパラメータによって、色の設定ができます。"r-","b-","g-"のスタイルを確認してください。
In [82]:
x=0:0.1:2*pi;
y=sin(x);
plot(x,y,'-o')
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -1 -0.5 0 0.5 1 0 1 2 3 4 5 6 7 gnuplot_plot_1a

【演習2】

以下の性質を持っている数列 {Fn} はフィボナッチ数列(フィボナッチすうれつ、Fibonacci sequence)と呼ばれます。

  • $F_1=1$
  • $F_2=1$
  • $F_n=F_{n-1}+F_{n-2} ~~~ (n>2)$

$n=10$までのフィボナッチ数列に対応しているMATLABの配列Fを作って、グラフを描画してください。

In [84]:
F=[1,1]
F =

   1   1

4. 繰り返しの計算:for 文

繰り返すの計算はfor文を使います。

以下の例文1では、kを1から10まで1ずつの整数の値を使って、計算式の処理を繰り返します。

例文1:

sum=0;
for k=1:10
  sum = sum +k;
  printf("1から %d までの整数の和は %d です。\n", k, sum ); 
end
</blockquote> 上記のコードは1から10までの整数を足して、その結果をsumという変数に格納します。

In [89]:
sum=0;
for k=1:10
  sum = sum +k;
  printf("1から %d までの整数の和は %d です。\n", k, sum ); 
end
printf("変数 sum は %d です。\n", sum)
1から 1 までの整数の和は 1 です。
1から 2 までの整数の和は 3 です。
1から 3 までの整数の和は 6 です。
1から 4 までの整数の和は 10 です。
1から 5 までの整数の和は 15 です。
1から 6 までの整数の和は 21 です。
1から 7 までの整数の和は 28 です。
1から 8 までの整数の和は 36 です。
1から 9 までの整数の和は 45 です。
1から 10 までの整数の和は 55 です。
変数 sum は 55 です。

【演習3】

for文を利用して、n=100までのフィボナッチ数列の配列Fを作って、グラフを描画してください。

In [ ]:

【演習4】

以下のコードでは、$a_n=(1+\frac{1}{n})^n$の数列のグラフを描いています。

この例をまねって、数学の微分積分の授業で学んだ数列3つを選んで、数列のグラフを描いてください。

In [105]:
a=[];
for n=1:20
   a(n) = (1+1/n)^n;
end
plot(1:20, a, '-+')
grid on
format short
display(a)
 Columns 1 through 8:

   2.0000   2.2500   2.3704   2.4414   2.4883   2.5216   2.5465   2.5658

 Columns 9 through 16:

   2.5812   2.5937   2.6042   2.6130   2.6206   2.6272   2.6329   2.6379

 Columns 17 through 20:

   2.6424   2.6464   2.6500   2.6533

Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 0 5 10 15 20 gnuplot_plot_1a
In [ ]: