大概记录的是 MATLAB 的练习之路。反正《数值分析》课程也得用。

Week 1 Optional

  • Figure 1

image-20220223201253085

clear;close all;%清空之前的图窗
t = 6 * pi * (0:100)/100; %时间
y = 1 - exp(-0.3*t).* cos(0.7*t);
plot(t,y,'r-','LineWidth',3)%用三磅红实线画曲线

hold on % 添加新绘图时保留当前绘图
tt = t((abs(y-1)>0.05));
ts = max(tt);%寻找进入5%误差带的最大时间
plot(ts,0.95,'bo','MarkerSize',10)
%(ts,0.95)为文字的坐标,'b'指蓝色,'o'指圆圈,'MarkerSize','10'设定圆圈大小为10
hold off

axis([-inf,6*pi, 0.6, inf])
%设置横坐标上限为6π,下限自动生成;纵坐标下限为0.6,上限自动生成
ax = gca; %将ax赋值为当前图窗对象
ax.XTick = [2*pi,4*pi,6*pi];ax.YTick = [0.95,1,1.05,max(y)];
%将横坐标分度设置为2π,4π,6π;同理重设纵坐标分度
ax.XTickLabel = {'2\pi','4\pi','6\pi'};
%横轴分度的标识。'\pi'会输出π。
ax.YTickLabel = {'0.95','1','1.05',num2str(max(y))};
%纵轴分度的标识。num2str将数字转化为字符串

grid on

text(13.5,1.2,'\fontsize{12}{\alpha}=0.3')
%(13.5,1.2)是文字坐标,\fontsize{12}将文字大小设定为12号,{\alpha}是α,本行代码输出'α=0.3'
text(13.5,1.1,'fontsize{12}{\omega}=0.7');
%(13.5,1.1)是文字坐标,\fontsize{12}将文字大小设定为12号,{\omega}是ω,本行代码输出'α=0.7'

%我们可以看到,text的参数很长,下面介绍一种缩减长度的方法
cell_string{1} = '\fontsize{12}\uparrow';
% 本行代码将指令用到的字符串存入一个胞元数组中,未来调用的时候更为便利
% uparrow会输出一个向上指的箭头
cell_string{2} = '\fontsize{16}\fontname{courier}response';
%\fontname{courier}将字体设定为courier
cell_string{3} = '\fontsize{6} ';
cell_string{4} = ['\fontsize{14}\rmt_{s} = ',num2str(ts)];
%\rm为正体,_{s}使s成为t的下标
text(ts,0.85,cell_string,'Color','b','HorizontalAlignment','Center')
%HorizontalAlignment使四个胞元中的内容竖直居中对齐
title('\fontsize{14} \it y = 1 - e^{ -\alpha t}cos{\omegat}')
% \it指斜体
xlabel('\fontsize{14}\bft')
%\bf指黑体,\rightarrow在字符t上面输出一个向右的箭头,即向量t
ylabel('\fontsize{14} \bfy')
  • Figure 2

image-20220223201721698

close all;clear;clc % clear
x = -4:4;y=x;
[X,Y]=meshgrid(x,y);
Z=X.^2+Y.^2;
subplot(1,2,1),surf(X,Y,Z);
colormap(summer)
shading interp
subplot(1,2,2),h = surf(X,Y,Z);
set(h,'FaceColor','default')%恢复默认底色
rotate(h,[-2,-2,0],30,[2,2,0])
%rotate的四个参数依次为:图形对象句柄,旋转轴方向,旋转角度,旋转轴支点
  • Figure 3

image-20220223201906174

close all;clear;clc
r0=1;shg; %使当前图窗可见并使其位于屏幕上所有其他图窗上方
a = 12*r0;b=9*r0;
T0 = 2*pi;
T = 5*T0;dt = pi/100;t = [0:dt:T]';
f = sqrt(a^2-b^2);
th = 12.5 * pi/100;
E = exp(-t/20);
x = E.*(a*cos(t)-f);y = E.*(b*cos(th)*sin(t));z=E.*(b*sin(th)*sin(t));
plot3(x,y,z,'g') %画出绿色的全程轨迹线
[X,Y,Z] = sphere(30);
%[X,Y,Z] = sphere(n) 返回半径等于 1 且包含 n×n 个面的球面的 x、y 和 z 坐标。
% 该函数以三个 (n+1)×(n+1) 矩阵形式返回 x、y 和 z 坐标。
X = r0*X;Y=r0*Y;Z=r0*Z;
grid on;hold on
surf(X,Y,Z)
shading interp
x1 = -18*r0;x2 = 6*r0;y1 = -12*r0;y2 = 12*r0;z1=-6*r0;z2 = 6*r0;
axis([x1 x2 y1 y2 z1 y2]) %设定坐标轴范围
view([133 65])
comet3(x,y,z,0.02)
  • Figure 4

image-20220223201920255

close all;clear;clc
funx = @(u,v) u.*sin(v); %定义函数句柄
funy = @(u,v) -u.*cos(v);
funz = @(u,v) v;
fsurf(funx,funy,funz,[-5 5 -5 -2],'--','EdgeColor','g')
%fsurf的前三个参数是函数句柄,后面的矩阵是x,y的范围
hold on
C = summer;%summer是一个色图矩阵
CC = [C;flipud(C)];%flipud实现矩阵的上下翻转,使CC逐渐变化
colormap(CC)
spinmap(30,4)%色彩变换30秒,每次变换4行
  • Figure 5

image-20220223202353901

close all;clear
figure
Z = peaks;
surf(Z)
axis tight manual
ax = gca;
ax.NextPlot = 'replaceChildren';
loops = 40;
F(loops) = struct('cdata',[],'colormap',[]);
for j = 1:loops
X = sin(j*pi/10)*Z;
surf(X,Z)
drawnow
F(j) = getframe;%通过getframe,将每一帧影片存入F中
end
movie(F,2,5)%播放两次,每秒5帧
  • Figure 6

image-20220223202418814

close all;clear;
K=1; %循环次数
%绘制轨迹曲线
t1 = (0:1000)/1000 * 10 * pi;x1 = cos(t1);y1= sin(t1);z1 = -t1;
t2 = (0:10)/10;x2 = x1(end) *(1-t2);y2 = y1(end) * (1-t2);z2 = x1(end) * ones(size(x2));
t3 = t2; z3 = (1-t3) * z1(end);x3 = zeros(size(z3));y3 = x3;
t4 = t2;x4 = t4;y4 = zeros(size(x4));z4 = y4;
x = [x1 x2 x3 x4];
n = length(x);
y = [y1 y2 y3 y4]; z = [z1 z2 z3 z4];
shg
plot3(x,y,z,'Color',[1,0.6,0.4],'LineWidth',2.5)
axis off
%在图中添加运动的点
h1 = line('xdata',x(1),'ydata',y(1),'zdata',z(1),'Color','r','Marker','. ', ...
'MarkerSize',40);
h2 = line('xdata',x(1),'ydata',y(1),'zdata',z(1),'Color','g','Marker','. ', ...
'MarkerSize',10);
KK = K * n;
KK = KK -1;
htext = text(-1,-1,-40,int2str(KK));
i = 2;j = 1;
while 1
%更新点的坐标
set(h1,'xdata',x(i),'ydata',y(i),'zdata',z(i));
set(h2,'xdata',x(i),'ydata',y(i),'zdata',z(i));
drawnow; % 擦除原先的点
pause(0.0005) %控制速度,单位为秒
i = i + 1;
KK = KK - 1;
set(htext,'string',int2str(KK))
if i > n
i = 1; j = j + 1;
if j > K; break;end
end
end
  • Figure 7

image-20220223202526276

image-20220223202623717

close all;clear;
x = randn(10000,1);
h1 = histogram(x);
disp(h1.NumBins) %计算直方图的 bin 数量
nbins = 40; %指定nbins数量
hold on
h2 = histogram(x,nbins);
counts = h2.Values ;%统计每个bin中的样本点数量
h2.NumBins = 40; %修改bin数量
edges = [-10 -2:0.25:2 10]; %通过向量指定bins的范围
h1.Normalization = 'probability';
%通过该归一化,每个条形的高度等于在该 bin 间隔内选择观测值的概率,并且所有条形的高度总和为 1。
h2.Normalization = 'probability'
hold off
h3 = histogram(x,edges);
h3.Normalization = 'countdensity' 
%将 Normalization 属性指定为 'countdensity' 以使包含离群值的 bin 扁平化。
%现在,每个 bin 的区域(而不是高度)表示该 bin 的观测值频率。
h4 = histogram(x,'Normalization','probability')
%通过该归一化,每个条形的高度等于在该 bin 间隔内选择观测值的概率,并且所有条形的高度总和为 1。
  • Figure 8

image-20220223202642481

clear;close all;clc
A = [0 0 1 1 1 0 0 0 0 NaN NaN 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1];
%创建一个表示投票的分类向量。该向量中的类别是 'yes'、'no' 或 'undecided'。
C = categorical(A,[1 0 NaN],{'yes','no','undecided'});
%将1,0,NaN分别指定为yes,no,undecided
h = histogram(C,'BarWidth',0.5) ;
%使用相对条形宽度 0.5 绘制投票的分类直方图
  • Figure 9

image-20220223202811936

clear;close all;clc
x = linspace(0,3*pi,200);
%创建 x 为 0 和 3π 之间的 200 个等间距值
y = cos(x) + rand(1,200); 
%创建 y 为带随机干扰的余弦值。然后,创建一个散点图
sz = linspace(1,100,200);
%使用大小不同的圆圈创建一个散点图
c = linspace(1,10,length(x));
%改变圆圈的颜色
scatter(x,y,sz,c,'filled')

image-20220223202844412

clear;close all;clc
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);
tiledlayout(2,1)
%调用 tiledlayout 函数以创建一个 2×1 平铺图布局
ax1 = nexttile;
%调用 nexttile 函数以创建坐标区对象 ax1 和 ax2
scatter(ax1,x,y)
ax2 = nexttile;
scatter(ax2,x,y,'filled','d')
  • Figure 10

image-20220223202916077

clear;close all;clc
x = linspace(-2*pi,2*pi);
y = linspace(0,4*pi);
[X,Y] = meshgrid(x,y);
Z = sin(X)+cos(Y);
[M,c] = contour(X,Y,Z,'ShowText','on')
 %有文字标识的等高线
c.LineWidth = 3; % 指定线宽为3
  • Figure 11

image-20220223202935774

close all; clear;clc
[X,Y] = meshgrid(-2:.2:2);
Z = X.*exp(-X.^2 - Y.^2);
[DX,DY] = gradient(Z,.2,.2); %求梯度
figure
contour(X,Y,Z)
hold on
quiver(X,Y,DX,DY)
  • Figure 12

image-20220223203003924

clear;close all;
[x,y] = meshgrid(0:0.1:1,0:0.1:1);
u = x;
v = -y;
figure
quiver(x,y,u,v)
startx = 0.1:0.1:1;
starty = ones(size(startx));
streamline(x,y,u,v,startx,starty)

HW01

与讲解篇大体相同,略去。

HW02

  • 结构体数组的使用
    • 下面两个数组给出了元素周期表前5个元素的元素符号和相对原子质量,将其和原子序数一起保存在结构体数组element中。
clear;
symbol = ["H","He","Li","Be","B"];
ar = [1.008,4.003,6.941,9.012,10.81];
atomic_number = 1:5;
symbol = num2cell(symbol);
ar = num2cell(ar);
atomic_number = num2cell(atomic_number);
element = struct("atomic_number",atomic_number,"symbol",symbol,"Ar",ar)
  • 带参数的匿名函数
    • 以匿名函数的方式实现带参数的函数,并在同一张图上画出参数 [b,c]=[0,0][b,c]=[2,1] 时,该函数在上的图像。
clear;
f0 = @(x,b,c) x.^2 + b.*x + c;
x = -2:0.01:2;
plot(x,f0(x,0,0))
hold on
plot(x,f0(x,2,1))

HW03

摆了 不做了 告辞

Reference

  • 2022 Winter MatPyFly 培训讲义