0%

Matlab基础

学习Matlab,一方面是数模需要,另一方面是Matlab + FigureBest绘制出来的图片非常精美。科研绘图时会用到,所以就学习一下。

界面

clear:清空工作区

clc:清除命令行窗口

;:语句后加分号结果不显示到命令行中,不加会显示到命令行中

F5:运行

ctrl + enter:分块运行

%%:分块分割注释

ctrl + r:添加多行注释

ctrl + t:取消多行注释

ctrl + 0:跳转到命令行窗口

ctrl + shift + 0:跳转到编辑窗口

ctrl + 2:跳转到工作目录窗口

ctrl + 3:跳转到工作区

Matlab官方文档:查询各种所需功能 & 函数

填写函数参数时按tab:打开参数提示功能,ctrl + down展开提示

运算

  • 特殊变量:ans、pi、inf、-inf

  • 数据类型:数字、字符串、矩阵

  • 运算符:

    1. 基本运算符:+、-、*、/、^(乘方)
    2. 常用预算符:abs()、mod(x, y)、sqrt()、exp()、log()、log2()、log10()、round()

矩阵

Note:下标从1开始

  1. 矩阵的创建
    1. 直接输入:用[]作为标识符,同一行用,分隔,不同行用;分隔
    2. 用预设函数创建:
      1. zeros(x, y):生成x行y列全0矩阵
      2. ones(x, y):生成x行y列全1矩阵
      3. eye(x):生成x行x列的单位阵
      4. rand(x, y):生成x行y列的矩阵,每个元素在(0, 1)内
      5. randi([imin, imax], x, y):生成x行y列的矩阵,每个元素在[imin, imax]内
      6. randn(x, y):生成x行y列的矩阵,每个元素服从标准正态分布
    3. 导入本地数据创建:
      • 支持格式:txt、dat、csv、xls、... ...
      • 导入方法:在菜单栏选择导入数据即可
  2. 矩阵的修改
    • A(2, 3) = 0:单点修改
    • A(2, :) = 0:第2行全部变为0
    • A([1, 2], [1, 2, 3]) = 0:第1、2行的第1、2、3列改为0
  3. 矩阵的运算
    1. M1 + M2:对应元素相加
    2. M + c:矩阵M每个元素加上c
    3. M1 * M2:矩阵乘法
    4. M * c:矩阵M每个元素乘上c
    5. M1 .* M2:矩阵M1、M2对应元素相乘
    6. M1 ./ M2:矩阵M1、M2对应元素相除
    7. M ^ c:矩阵M的幂运算
    8. M':矩阵M的转置
    9. inv(M):矩阵M求逆
    10. diag(diag(M)):M的对角矩阵

程序结构

  1. global全局变量

    • 定义时global声明一次,函数内使用前声明一次
  2. if-elseif-else-end

    1
    2
    3
    4
    5
    6
    7
    if (... && ...)
    % TODO
    elseif (... && ...)
    % TODO
    else
    % TODO
    end
  3. for-end

    1
    2
    3
    for i = x:y %循环变量i从x到y
    % TODO
    end
  4. 自定义函数

    1
    2
    3
    4
    5
    6
    7
    function res = fun_name(var1, var2, ...)
    % TODO
    end

    function fun_name()
    % TODO
    end

图像

  1. axis
    1. axis([xmin, xmax, ymin, ymax]):生成指定坐标范围
    2. axis equal:x/y轴使用相同的比例
  2. subplot
    1. subplot(n, m, id):将figure分割为n*m个区域,当前使用第id个区域进行绘图
  3. plot
    1. hold on:使得多个plot画出的线在一个图上
    2. plot(X, Y):画出点(x1, y1), (x2, y2), ...并连线
    3. plot(Y):画出(1, y1), (2, y2), ...并连线
    4. plot(x, y, '.'):画坐标点(x, y)
  4. title
    1. title('xxx'):起名
  5. xlabel/ylabel
    1. xlabel('xxx')
  6. legend
    1. legend('name1', 'name2', ...):图例
  7. 改样式
    • 交给FigureBest

实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
clc;
clear all; % 相比于clear, clear all可以清除global变量

% 定义变量
global Iter_Num n x r r1 r2 alpha beta v s y a ans_x ans_y s_x s_y xx vv ss yy;
Iter_Num = 1000;
n = 5;
x = zeros(1, n);
r = zeros(1, n);
r1 = [1, 4, 9, 4, 8]; % 5个预设点的x坐标
r2 = [6, 8, 8, 2, 3]; % 5个预设点的y坐标
alpha = 0.01;
beta = 0.01;
v = diag(ones(1, n));
s = phi(x);
y = zeros(1, n);
a = [
1/2, 0, 1/2, 0, 0;
1/3, 1/3, 0, 0, 1/3;
0, 1/2, 1/2, 0, 0;
0, 1/2, 0, 1/2, 0;
0, 0, 0, 1/2, 1/2
];
ans_x = zeros(1, 1); % ans_x[i][j]表示第i个点第j次迭代的x坐标
ans_y = zeros(1, 1); % ans_y[i][j]表示第i个点第j次迭代的y坐标
s_x = zeros(1, 1); % s_x[i][j]表示第i个点第j次迭代x坐标的sigma
s_y = zeros(1, 1); % s_y[i][j]表示第i个点第j次迭代y坐标的sigma
xx = x;
vv = v;
ss = s;
yy = y;

% 开始迭代
solve();
fprintf('经过%d轮迭代, 最终F(x)收敛到: %f\n', Iter_Num, cal(Iter_Num));
draw_1(); % F_k的比率图
draw_2(); % 画演示图

%下面是画图子函数
function draw_2()
global Iter_Num;
figure (2);
subplot(1, 3, 1);
draw_2_sub(1);
subplot(1, 3, 2);
draw_2_sub(Iter_Num / 2);
subplot(1, 3, 3);
draw_2_sub(Iter_Num);
end

function draw_2_sub(iter_num)
hold on;
global n r1 r2 ans_x ans_y;
axis([0, 10, 0, 10]);
plot(5, 5, '*');
for i = 1 : n
plot(ans_x(i, iter_num), ans_y(i, iter_num), '+', 'Color', 'blue');
end
plot([r1(1), r1(2), r1(3), r1(5), r1(4), r1(1)], [r2(1), r2(2), r2(3), r2(5), r2(4), r2(1)], 'Marker','x', 'Color', 'red');
sum_x = 0;
sum_y = 0;
for i = 1 : n
sum_x = sum_x + ans_x(i, iter_num);
sum_y = sum_y + ans_y(i, iter_num);
end
plot(sum_x / n, sum_y / n, 'o');
xlabel('$x_1$', 'Interpreter', 'latex');
ylabel('$x_2$', 'Interpreter', 'latex');
end

function draw_1()
figure (1);
global Iter_Num;
F_best = 18.874999999999645;
error = [];
for i = 1 : (Iter_Num - 1)
error = [error, abs(cal(i + 1) - F_best) / abs(cal(i) - F_best)];
end
plot(error);
xlabel('Iteration k');
ylabel('$\frac{f_{k+1} - f^*}{f_k - f^*}$', 'Interpreter', 'latex', 'FontSize', 20);
end

% 下面是计算子函数
function res = cal(iter_num)
global n ans_x r1 ans_y r2 s_x s_y;
sum = 0;
for i = 1 : n
sum = sum + 0.5 * ((ans_x(i, iter_num) - r1(i)) ^ 2 + (ans_y(i, iter_num) - r2(i)) ^ 2)...
+ 0.5 * ((ans_x(i, iter_num) - 5) ^ 2 + (ans_y(i, iter_num) - 5) ^ 2)...
+ ((s_x(i, iter_num) - 5) ^ 2 + (s_y(i, iter_num) - 5) ^ 2);
end
res = sum;
end

function solve()
global Iter_Num n xx ss ans_x ans_y s_x s_y;
init(1);
for T = 1 : Iter_Num
for i = 1 : n
upd_x(i);
ans_x(i, T) = xx(i);
upd_v(i);
upd_s(i);
s_x(i, T) = ss(i);
upd_y(i);
end
backup();
end
init(2);
for T = 1 : Iter_Num
for i = 1 : n
upd_x(i);
ans_y(i, T) = xx(i);
upd_v(i);
upd_s(i);
s_y(i, T) = ss(i);
upd_y(i);
end
backup();
end
end

function upd_y(i)
global a ss yy y beta n;
sum = 0;
for j = 1 : n
sum = sum + a(i, j) * ss(j);
end
yy(i) = y(i) + beta * (ss(i) - sum);
end

function upd_s(i)
global a s ss x xx vv n v;
sum = 0;
for j = 1 : n
sum = sum + a(i, j) * s(j);
end
ss(i) = sum + phi(xx(i)) / vv(i, i) - phi(x(i)) / v(i, i);
end

function upd_v(i)
global n a v vv;
sum = zeros(1, n);
for j = 1 : n
sum = sum + a(i, j) * v(j, :);
end
vv(i, :) = sum;
end

function upd_x(i)
global xx x alpha r n y s v;
xx(i) = x(i) - alpha * ((x(i) - r(i)) + (x(i) - 5) + (1 / n) * (y(i) + 2 * (s(i) - 5) / n / v(i, i)));
end

function backup()
global x v s y xx vv ss yy
x = xx;
v = vv;
s = ss;
y = yy;
end

function init(op)
global n x r v s y xx vv ss yy r1 r2
x = randi([1, 5], 1, n);
if (op == 1)
r = r1;
else
r = r2;
end
v = diag(ones(1, n));
s = phi(x);
y = zeros(1, n);
xx = x;
vv = v;
ss = s;
yy = y;
end

function res = phi(x)
global n;
res = x / n;
end

经过FigureBest美化后的图片: