顯示具有 MatLab 標籤的文章。 顯示所有文章
顯示具有 MatLab 標籤的文章。 顯示所有文章

2021年6月10日 星期四

雙曲函數

雙曲函數

双曲正弦满足恒等式 sinh(x)=exex2。换句话说,sinh(x) 是函数 ex 和 ex

 之差的一半。通过绘制函数可对此进行验证。

 

x = -5:0.01:5;

y = sinh(x);

plot(x,y)

line([0,0],[-80,80], 'Color','r')

line([-5,5],[0,0], 'Color','r')

grid on



邏輯操作元

 邏輯操作元

源自於http://bime-matlab.blogspot.com/2006/10/32.html

邏輯操作元主要在連繫兩個邏輯值,應用上分為元素間、位元間等兩類。

其相關操作元如下表。

邏輯操作元
操作元範例說明
&C=A&BAB兩元素均為1時為1,否則為0
C=A|B任一A或B為1為正,否則為0
~C=~A非A,即A為0時為1,否則為0
xorC=xor(A,B)僅其中一個為非零時為1,否則為0


A=[1 0 1 1 0 0 1], B=[0 0 1 0 1 0 1]
A =     1     0     1     1     0     0     1
B =     0     0     1     0     1     0     1

>> C=A & B

C =  1×7 logical array
   0   0   1   0   0   0   1

>> C=xor(A,B)
C =  1×7 logical array
   1   0   0   1   1   0   0

利用矩陣本身,進行分類的方式到處可用。這些指令函數亦常使用,
其型式如下表:

操作元範例說明
anyC=any(A,dim)A矩陣中之任何行向元素不為0時為1,否則為0。dim=2時為列向。
allC=all(A)矩陣中之任何行向元素均為1時為1,否則為0。dim=2時為列向。
isprimeC=isprime(A)A矩陣中,元素為質數時為1時為1,否則為0
isequalC= isequal(A)僅其中一個為非零時為1,否則為0
isemptyC= isempty(A)若為空矩陣為1,否則為0
isintegerC= isinteger(A)若為整數為1,否則為0
isnumericC= isnumeric(A)若為數值為1,否則為0
isrealC= isreal(A)若為實數為1,否則為0
isfiniteC= isfinite(A)若為定值為1,否則為0
logicalC= islogical(A)將矩陣A轉為邏輯值,非零為1
islogicalC= islogical(A)若為邏輯值為1,否則為0
ischarC= ischar(A)若為文字值為1,否則為0
iscellC= iscell(A)若為細胞陣列為1,否則為0
findC=find(A);C=find(A>B)找尋矩陣A中不為零之序號,存於C找尋矩陣A大於B之序號存於C

>> A=magic(3)
B=A;
B(~isprime(A))=0
A =
     8     1     6
     3     5     7
     4     9     2
B =
     0     0     0
     3     5     7
     0     0     2

這些利用is*之型式逗起來的函數也是屬於矩陣邏輯操作函數,比較常用的有isempty、isequal等等。有興趣的讀者可以參考其輔助檔。

logical則是一個將矩陣轉換為邏輯常數函數,只要零值換為邏輯0值,非零(包括負值)均視為邏輯1。例如:
>> A=-5:5
A =

-5 -4 -3 -2 -1 0 1 2 3 4 5
>> islogical(A)
ans =
0

顯然矩陣A並非邏輯矩陣,但經過如下轉換,即可轉為邏輯矩陣:
>> logical(A)
Warning: Values other than 0 or 1 converted to logical 1.
ans =
1 1 1 1 1 0 1 1 1 1 1
此外,any與 all兩函數則是檢驗一個矩陣是否有非零元素或全為非零元素。
兩者均可針對單行或單列檢驗,如:
>>any(A==B)
ans =
1 1 1

顯然它是行向作業,如改為列向則後面加一參數dim=2

>>any(A==B,2)
ans =
0
1
1

注意上述之關係等號必須使用兩個"="號。讀者可自行印證這兩個的結果。
在行向上,A與B是沒有完全相等之元素,所以下面用all指令的結果應均為零。

>>all(A==B)
ans =
0 0 0

但由於第二列均為[3 5 7],故下面的結果第二項應為1,其餘均為0。
>>all(A==B, 2)
ans =
0
1
0

有關關係操作元之運用在未來程式寫作上甚為重要。
簡潔的關係式可以使程式看起來更為流暢,其運作的時間也會降低。
最後find之函數則是尋找某矩陣不為零之元素或具某條件之原始序號,
如:
A=fix(rand(3)*10)
A =
9 8 8
9 0 0
4 3 1

>>find(A)'
ans =
1 2 3 4 6 7 9

由結果可知,第五項與第八項為零。此外:

>>find(A>5)'
ans =
1 2 4 7

其結果是:只有第一、二、四、七項元素大於五。若為矩陣間比較,其大小應相同。

關係操作元

 關係操作元

源自於http://bime-matlab.blogspot.com/2006/10/31_09.html

兩陣列間之相互比較是常有的事,若能配合程式之關係運算則可節省撰寫時間。一般關係操作元主要在兩個變數間作邏輯性比較,,然後選擇一個最佳的結果;在MATLAB之應用上實也脫離不了這些原則。只是在陣列之比較上,必須時時注意其大小之匹配。下面為一般操作元之定義:


表3.1 關係操作元

操作單元符號    說明

      <              小於

     <=            小於或等於

     >               大於

     >=            大於或等於

     ==            等於

     ~=            不等於


>> A=magic(4)

A =

    16     2     3    13

     5    11    10     8

     9     7     6    12

     4    14    15     1

>>B=round(rand(4,4)*16)

B =

     7    10    11    10

    15     1    12     3

    13    14    12    11

    15    15     6     1

>>C= (A>=B)

C =

  4×4 logical array

   1   0   0   1

   0   1   0   1

   0   0   0   1

   0   0   1   1

若在A矩陣中,將所有A>=B之元素均設為100,

>> A(C)=100

A =

   100     2     3   100

     5   100    10   100

     9     7     6   100

     4    14   100   100


A(A>=B)=100

A =

   100     2     3   100

     5   100    10   100

     9     7     6   100

     4    14   100   100

A矩陣中只要相對應於C矩陣中之值為真,或合於A>=B條件之元素

因而均被設為100。

這種方法並不只與其他矩陣比較,與自身矩陣之元素比較亦可,例如:

>> A=magic(4)

A =

    16     2     3    13

     5    11    10     8

     9     7     6    12

     4    14    15     1

>> A(A<10)=10

A =

    16    10    10    13

    10    11    10    10

    10    10    10    12

    10    14    15    10



程式結構與設計

 程式結構與設計

源自於http://bime-matlab.blogspot.com/2006/10/blog-post_09.html

複雜的程式則是採用主程式、副程式或函數檔間相互呼叫的方式,由各檔案專司解決特定的功能,如此形成一個程式之大架構。這些程式執行過程中,必須配合執行之中間值,進行比較、判斷,最後得到適當之結果。有些檔案可能需經過多次呼叫,才能達到程式預設之目的;有些則需判斷結果之適當性,依據最佳的決策選擇執行的路徑。


在程式結構中,一般除基本指令外,尚須配合流程之控制指令,使程式能配合特定條件運作。控制指令以邏輯值進行比較,其操作元包括關係操作元及邏輯操作元等,可以應用於變數及矩陣。
在程式之運算過程中,為執行某一特定任務均有其基本之演算法。其中必須藉助控制指令以改變指令執行之順序,或稱為控制結構。這些結構必須藉其特定之關係比較,就比較結果決定程式進行的順序。這些運算法大體上可分為循序運算、條件運算及迴圈運算等三種方式。

matlab指令碼

MATLAB Script:

  • 一個檔案包含一系列matlab命令
  • 類似於c/c++程式
  • 指令碼儲存為<file>.m檔案,這樣就可以執行這樣以.m結尾的matlab指令碼

使用技巧:

下面是一個matlab指令碼程式,可以執行一下,看看效果 

  • 註釋:% 註釋文字
  • 分割槽塊:%% 一個區塊,使用執行的時候會執行整個檔案,使用執行節會只運行當前區塊。
  • 斷點除錯:在程式程式碼行前面點選會出現一個圓圈表示斷點,當執行程式時,程式會停在此處。
  • 程式碼縮排排版:ctrl + I
  • 執行順序:程式碼是從上到下執行的 
for i = 1:10
    x = linspace(0,10,101);
    plot(x, sin(x+i));
    print(gcf,'-deps',strcat('plot',num2str(i),'-.ps'));
end

 二、程式結構化

Flow Control:

matlab中有如下的控制語句 

 在控制語句中,還要配合一些邏輯操作,下面是相關的邏輯操作。

if elseif else語句:

% 語句格式
if condition1
    statement1
elseif condition2
    statement2
else
    statement3
end

% 程式
a = 3;
if rem(a, 2) == 0   % rem()函式是求餘數
    disp('a is even')
else
    disp('a is odd')
end

結構化程式的作用就是控制程式的執行順序,不會像之前說到的完全按從上到下的順序執行,會跳過某條語句執行。

switch語句:

% 語句格式
switch expression
    case value1
        statement1
    case value2 
        statement2
    .
    .
    otherwise
        statement
end

% 程式
input_num = 1;
switch input_num
    case -1
        disp('negative 1');
    case 0
        disp('zero');
    case 1
        disp('positive 1');
    otherwise
        disp('other value');
end

while語句:

% 語句格式
while expression
    statement
end
% 程式
n = 1;
while prod(1:n) < 1e100  % 1-n的元素相乘
    n = n + 1;
end

for語句:

% 語句格式
for variable=start:increment:ends
    commands
end
% 程式
for n=1:10
    a(n) = 2^n;
end
disp(a)

預先定義變數空間:提升效率.

A = zeros(2000, 2000);在往這個矩陣中新增值。右邊的更快。

break語句; 用在迴圈語句中,用來終止迴圈。

結構化程式的技巧:

  • 編寫指令碼程式程式碼之前,可以使用
    • clear all; 清除之前使用過的變數
    • close all; 關閉所有的figure 
  • 使用“;”在命令列的結尾,不讓命令執行
  • 使用“...”將程式碼換行輸入。使程式碼不過於全部在一行
  • ctrl + C:提前截至執行的程式 

三、使用者自定義函式 

Built-in Functions:

matlab的自己函式,是已經定義好的函式,可以直接呼叫去使用。

edit(which('mean.m')):開啟自建函式mean.m檔案

  • 關鍵字:function

  • 函式名和檔名要相匹配

  • 目錄:matlab需要找到這個函式

  • 輸入和輸出變數是可選的

  • 本地變數:dim和flag不是被接受的 

User Define Functions: 

我們自己定義函式,完成我們所需要的功能。

% 自由落體函式
function y = freebody(x0, v0, t)
x = x0 + v0 .* t + 1/2*9.8*t.*t;

呼叫函式:freebody(0,0,10)

注意:.* 是元素之間也可以相乘

函式具有多個輸入和輸出:




2021年6月9日 星期三

一元二次方程作圖問題

 一元二次方程作圖問題

a=1;

b=-2;

c=1;

syms x

solve(a*x^2+b*x+c)

func=@(x)(a*x^2+b*x+c);%自定義函數

fplot(func,[-10,10]) %繪制二維圖形

xlabel('x'),ylabel('y(x)') %坐標軸的名稱標記



陣列運算

 陣列運算

源自於http://bime-matlab.blogspot.com/2006/10/blog-post.html

矩陣為一組二維向量之實數或複數之陣列,其加減乘除之運算與一般的數學運算法略有不同,陣列通常以行向量為主,但一般運算仍可混用。即使如此,在線性代數中所定義的矩陣操作大體上
Matlab均能支援。其中諸如一般運算、線性方程、特徵值及單一值與階乘運算等均包括在內。

由於陣列所代表的是一堆有系統的數字,與另一個陣列相運算時,必須依據不同的規則才能獲得
================================
操作名稱       應用情形
---------------------------------
C= A◎B-- ◎處可為加法(+)、減法(-)、乘法(*)、左除(\)、右除(/)
C= A.◎B-- ◎處可為乘法(*)、乘幂(^)、左除(\)、右除(/)
C= A◎c-- ◎處可為加法(+)、減法(-)、乘法(*)、乘幂(^)、右除(/)
C= c◎B-- ◎處可為加法(+)、減法(-)、乘法(*)、乘幂(^)、左除(\)、右除(./)

由表中可知,一個操作元前有一點與沒有一點其意義是不同的。

C= A.◎B     C= A◎B

在操作元前加一點表示是項目與項目間之操作,即為所謂之對映運算方式,此時兩矩陣之大小要相同。這與一般矩陣之加法及減法相同,其運算僅針對元素間之運算。偏置功能則僅適用於矩陣間,不適用於項目間之操作。這些操作元亦可應用於矩陣與一般常數,後者之大小為[1x1]。

矩陣之加減

設C、D分別為3x3之方矩陣,且設C為魔術方塊,D為[1 2 3;4 5 6;7 8 9],即:

 >> C=magic(3)

C =

     8     1     6

     3     5     7

     4     9     2

>> D=[1 2 3;4 5 6;7 8 9]

D =

     1     2     3

     4     5     6

     7     8     9

>> C+D

ans =

     9     3     9

     7    10    13

    11    17    11

 >> C-D

ans =

     7    -1     3

    -1     0     1

    -3     1    -7

>> C*D

ans =

    54    69    84

    72    87   102

    54    69    84

>> C/D

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =

1.652118e-18. 

 ans =

   1.0e+16 *

    3.7830   -7.5660    3.7830

    0.0000    0.0000   -0.0000

   -3.7830    7.5660   -3.7830

>> C\D

ans =

    0.0167    0.0833    0.1500

    0.7667    0.8333    0.9000

    0.0167    0.0833    0.1500

C.*D與C*D兩種之運算結果,前者為對應元素相乘;後者為兩個矩陣進行數學相乘:

C =

     8     1     6

     3     5     7

     4     9     2

D =
     1     2     3
     4     5     6
     7     8     9
>>C.*D %對應元素相乘
ans =
8 2 18
12 25 42
28 72 18

>>C*D %矩陣乘法
ans =
54 69 84
72 87 102
54 69 84
例如有一化妝品系列,均由三種原料調配而成,因原料之分量會產生不同產品系列。今設有四種產品,其基本原料分別如有下份量:

>>A=[ 2 4 3; 5 2 1; 7 3 5; 4 5 6]
A =
        2  4  3 %產品1之成分
5 2 1 %產品2之成分
7 3 5 %產品3之成分
4 5 6 %產品4之成分
此時矩陣A代表四種產品(四列)之三種成份量。現設三種成分均有不同的價格,其價格設以一行向量表示,即:
>>P=[120 50 100]' 
P =
120
50
100
矩陣之第一列,其成本只要將A(1,:)與P相乘,即A(1,:)*P,其結果為:
>>A(1,:)*P 
ans = 740
亦即代表產品1的成本,若直接計算應為
  2 x (120) + 4x(50) +3x(100) = 740
結果與上面之A(1,:)*P相同。
故上面四種產品,若以成分矩陣A與價格矩陣P,即可得四種產品之成本:
>>A*P 
ans =
740
800
1490
1330
A之大小為(4x3),P之大小為(3x1),得到的結果為(3x1)
換言之,兩矩陣相乘,第一矩陣之行與第二矩陣之列,其大小應一致。
而結果之大小應為第一矩陣之列與第二矩陣之行,或(4x3)(3x1)=(4x1)。
以通式表示之:
      A[m,n] * B[n,p] = C[m,p]
>>D*C 
ans =
26 38 26
71 83 71
116 128 116

足見D*C與C*D的結果並不同
但只要矩陣之大小相搭配,其分解及分配之特性則仍然存在,如:
  A*(B+C)=A*B + A*C

  (A*B)*C=A*(B*C)
若用eye(3)函數產生單位矩陣,則其無論先乘與後乘,結果都會一樣。
>>I=eye(3) 
I =
1 0 0
0 1 0
0 0 1

>>AA*I
ans =
8 1 6
3 5 7
4 9 2

>>I*AA
ans =
8 1 6
3 5 7
4 9 2
結論是若I為單位矩陣,則I*A=A*I=A,顯示交換律在此情形下仍可成立。

陣列之除法

陣列除法屬逐元除法,因此兩陣列相除時必須同樣大小。例如:
>> a=[2 3 4] 
 a =

     2     3     4 
 >> b=[5 6 7] 
 b =

     5     6     7 
 >> a/b 
 ans =

    0.5091 
 >> a./b 
 ans =

    0.4000    0.5000    0.5714
>> c=[1 2;3 4]
c =
1 2
3 4

>> d=[3 5; 8 7]
d =
3 5
8 7

>> c./d
ans =
0.3333 0.4000
0.3750 0.5714
這是兩陣列經過右除(./)運算之結果
陣列之次方
陣列之逐元運算亦可應用於次方,但其次方數必須為常數,以pascal函數產生之對稱矩陣為例:
>> A=pascal(3)
A =
1 1 1
1 2 3
1 3 6

>> A.^3
ans =
1 1 1
1 8 27
1 27 216

MQTT 協定與 Modbus 通訊的遠端監控與控制系統架構

MQTT 協定與 Modbus 通訊的遠端監控與控制系統架構 這張圖片展示了一個 結合 MQTT 協定與 Modbus 通訊的遠端監控與控制系統架構 (主要透過 Node-RED 進行資料整合)。 系統包含三個核心部分,其運作功能說明如下: 1. ESP32 終端設備(硬體控制層...