學習MATLAB
此課程是使用MATLAB 2019a,學習的內容儲存到這個儲存庫,並提供大家檢閱與更新,讓範例可以接近完整。
發現學習的網站列表:
由MatlabWorks官方所提供的教學網站MATLAB and Simulink Training,提供基礎學習並搭配網頁互動式學習,從中完成所有初階課程學習,學習過程會在裡面記錄下來。MatlabWorks裡面所提供的課程都是製作出最新的產品,如果基礎學習完成還可以得到基本認證,但想要學習其他課程必須付錢,但可以透果網路上其他教學影片或者自學專區來學習進階課程。
自學專區是由出版社所整理資源,此資源包括新舊、難易等所有資源,並代理許多MATLAB相關套件與教學。其中著名的教授也在此公司出版最早有關MATLAB有關的工具,並也在MATLAB公司工作過,因此對MATLAB很熟悉。
MATLAB教學是一位台大生物機械系郭彥甫教授所提供的教學,雖然教學相當完整但使用的MATLAB是MATLAB 2014a,可能使用新版的MATLAB再進階課程會有不同與棄用部份。
符號運算
在 Octave 使用符號運算時,會出現錯誤,此時可以通過安裝新的套件與匯入方法解決。
pkg install -forge symbolic
匯入套件
pkg load symbolic
機率學應用
將機率所學事物寫在此。
硬幣模擬
可以透過 rand(1, 4)
產生小於 1 隨機數字的數字四個,放入到 x
內。
>> x = rand(1, 4)
x =
0.1868 0.8280 0.7997 0.4883
再來可以透過 x < 0.5
來產生硬幣一半一半的機率。
>> x < 0.5
ans =
1 0 0 1
學生成績產生
用 50 + randi(50, 1, 12)
方式,產生12筆大於50分的成績。
ans =
71 55 96 59 98 84 59 93 99 97 100 90
擲骰子
通過 randi(6, 1, 10)
擲骰子十次,可以得到擲骰子的結果。
ans =
5 6 3 5 4 5 6 4 3 5
rng
可以用來設定種子,是每個亂數產生都會有的,可以通過種子來設定隨機值產生的方式,以及透過實驗時的種子讓其他人在做測試的時候可以還原當時的亂數。
由於在 Octave 沒有 rng
函式,因此要使用 Octave 產生器,此方法是否可以通用 MATLAB 還有帶觀察。
使用 rand("state")
來取得種子,取得的資料是625列的種子數值,再透過 rand("state", s)
設定種子, s
要放 rand("state")
回傳值。
s = rand("state")
50 + randi(50, 1, 12)
rand("state", s)
50 + randi(50, 1, 12)
執行結果
>> s = rand("state")
s =
2795783892
...
3785941655
599
>> 50 + randi(50, 1, 12)
ans =
70 87 100 98 78 73 64 52 52 74 66 70
>> rand("state", s)
>> 50 + randi(50, 1, 12)
ans =
70 87 100 98 78 73 64 52 52 74 66 70
*註: seed
為 Octave 舊式產生器,一樣可以使用,但測試新的好像不能使用。
example 2.8
>> n = factorial(52) / (factorial(52 - 7) * factorial(7))
n = 1.3378e+08
>> f=factorial(11)/(factorial(11-5)*factorial(5))
f = 462
>> f=factorial(120)/(factorial(120-60)*factorial(60))
f = 9.6615e+34
>> f=factorial(15)/(factorial(15-8)*factorial(8))
f = 6435
>> n=factorial(10)/(factorial(10-1)*factorial(1))
n = 10
>> n*f
ans = 64350
>> m = factorial(9)
m = 362880
>> n * f * m
ans = 2.3351e+10
example 2.9
>> n = factorial(48)/(factorial(48-7)*factorial(7))
n = 7.3629e+07
>> m = factorial(52) / (factorial(52 - 7) * factorial(7))
m = 1.3378e+08
>> n / m
ans = 0.5504
example 2.10
>> (48 / 52) ^ 7
ans = 0.5710
example 2.15
>> y = factorial(10) / (factorial(2) * factorial(3) * factorial(3) * factorial(2))
y = 25200
機率分佈圖
繪製投擲硬幣的機率分佈圖
透過機率學的理論數值,繪製分佈圖。
for k=0:100
p(k + 1) = 0.5 ^ 100 * factorial(100) / (factorial(100 - k) * factorial(k));
end
bar([0:100], p)
example 2.19
實際模擬投擲硬幣,來計算每次產生的機率,並繪製投擲硬幣的機率分佈圖。
x = rand(100, 600) < 0.5;
y = sum(x, 1);
t = 0:100;
h = hist(y, t);
bar([0:100], h)
example 2.20
找出指定數值發生的機率
ceil
指天花板,透過此函數,可以將大於整數的浮點數無條件進位,因此得到整數。
使用 hist
來找出某集合內指定發生的事件機率。
g = ceil(4 * rand(1, 100));
t = 1:4;
x = hist(g, t);
bar([1:4], x)
隨機變數
Binomial
p = 0.2;
n = 60;
for m=0:n
y(m + 1) = binomialpmf(n, p, m);
end
bar([0:n], y)
Geometric
p = 0.2;
for m = 1:60
y(m) = geometricpmf(p, m);
end
bar(y);
Pascal
p = 0.2;
k = 12;
n = 200;
y = zeros(1, n);
for m = k:n
y(m) = pascalpmf(k, p, m);
end
bar([1:n], y);
離散機率
Poisson
「卜瓦松分布」(Poisson distribution)又稱Poisson分布、泊松分布、布瓦松分布、布阿松分布、普阿松分布、波以松分布、卜氏分布、帕松小數法則,是一種統計與機率學裡常見到的離散機率分布,由法國數學家西莫恩·德尼·卜瓦松在1838年時發表。
Poisson 過程有三個基本特性:
- 在一個短時間區間
$\Delta t$ 內,發生一次事件的機率與$\Delta t$ 成正比:$\lambda \Delta t$ 。 - 在短時間內發生兩次以上的機率可以忽略。
- 在不重疊的時間段落裡,事件各自發生的次數是獨立的。
假定某機關的總機在一個短時間
我們可以把
在每個
$\triangle t$ 時間內,我們做了一次試驗,其成功(接到電話)的機率為$p$ 。如此做了$n$ 次,那麼成功了$x$ 次的機率為何?所以我們要的機率分布正是二項分布$b(x;n,p)$ 。令$\lambda = \alpha t = n\alpha\triangle t = np$ ,則
當 t 保持不變(亦即 λ 不變),而讓
所以
因為
所以
這就是說,在時間
example
a = 0.5;
x = 5;
for i = 0:x
y(i+1) = poissonpmf(a, i)
end
e = 0;
for i = 0:x
y(i + 1) = poissonpmf(a, i);
e = e + i * y(i + 1);
end
輸出
>> e
e = 0.4999
example
a = 1;
x = 10;
for i = 0:x
y(i + 1) = poissonpmf(a, i)
end
e = 0;
for i = 0:x
y(i+1) = poissonpmf(a, i);
e = e + i * y(i + 1);
end
輸出
>> e
e = 1.0000
example
a = 5
x = 50
for i = 0:x
y(i + 1) = poissonpmf(a, i)
end
e = 0;
for i = 0:x
y(i + 1) = poissonpmf(a, i);
e = e + i * y(i + 1);
end
輸出
>> e
e = 5.0000
example
a = 10;
x = 100;
for i = 0:x
y(i + 1) = poissonpmf(a, i);
end
e = 0;
for i = 0:x
y(i + 1) = poissonpmf(a, i);
e = e + i * y(i + 1);
end
輸出
>> e
e = 10.000
binomial
二項分佈
example
n = 100;
p = 0.2;
e = 0;
for i = 0:n
y(i + 1) = binomialpmf(n, p, i);
e = e + i * y(i + 1);
end
>> e
e = 20.000
>> n * p
ans = 20
pascal
k = 10;
p = 0.2;
x = 200;
e = 0;
for i = 0:200
y(i + 1) = pascalpmf(k, p, i);
e = e + i * y(i + 1);
end
>> e
e = 50.000
>> k / p
ans = 50
duniform
k = 11;
l = 30;
e = 0;
x = 100;
for i = 0:x
y(i+1) = duniformpmf(k,l,i);
e = e + i * y(i + 1);
end
>> e
e = 20.500
>> (k + l) / 2
ans = 20.500
期望值
example 1 poisson
m = 10000;
a = 10;
n = 100;
sx = [0:n];
px = poissonpmf(a, sx)';
x = poissonrv(a, m);
esx = sum(px .* sx)
vsx = sum(px .* (sx - esx) .^ 2)
ex = sum(x) / length(x)
vx = sum((x - ex) .^ 2) / length(x)
>> esx
esx = 10.000
>> vsx
vsx = 10.000
>> ex
ex = 9.9833
>> vx
vx = 9.9240
example 2 binomial
m = 10000;
n = 100;
p = 0.2;
sx = [0:n];
px = binomialpmf(n, p, sx)';
x = binomialrv(n, p, m);
esx = sum(px .* sx)
vsx = sum(px .* (sx - esx) .^ 2)
ex = sum(x) / length(x)
vx = sum((x - ex) .^ 2) / length(x)
>> esx
esx = 20.000
>> vsx
vsx = 16.000
>> ex
ex = 20.014
>> vx
vx = 16.183
example 3 pascal
m = 10000;
k = 10;
n = 250;
p = 0.2;
sx = [0:n];
px = pascalpmf(k, p, sx)';
x = pascalrv(k, p, m);
esx = sum(px .* sx)
vsx = sum(px .* (sx - esx) .^ 2)
ex = sum(x) / length(x)
vx = sum((x - ex) .^ 2) / length(x)
>> esx
esx = 50.000
>> vsx
vsx = 200.000
>> ex
ex = 50.121
>> vx
vx = 198.12
example 4 duniform
m = 10000;
k = 11;
n = 203;
l = 30;
sx = [0:n];
px = duniformpmf(k, l, sx)';
x = duniformrv(k, l, m);
esx = sum(px .* sx)
vsx = sum(px .* (sx - esx) .^ 2)
ex = sum(x) / length(x)
vx = sum((x - ex) .^ 2) / length(x)
>> esx
esx = 20.500
>> vsx
vsx = 33.250
>> ex
ex = 20.423
>> vx
vx = 33.285