
本文和大家分享一下「Matlab中绘图」的基本操作,属于「手把手教学」哦~
导读:
- Matlab绘图「思路分析」
- 具体「操作」的详细介绍
- 「保存」输出
- 后期「调整」
绘图思路
巧妇难为无米之炊
要想掌握好Matlab的绘图技能,首先就要准备好“食材”。
「绘图的目的」自然是让读者能够更「清楚直观」地理解我们讲的内容。
因此,相比于如何绘图,「绘制怎样的图」,「传递怎样的信息」 才是我们首先要考虑的问题。
当然,传递信息的话,表格也可以做到。
比如我们要表达error随着M的增大而「二阶减小」,即
我们可以用下面的表格来反映
M | 32 | 64 | 128 | 256 |
---|---|---|---|---|
误差 | 0.4 | 0.1 | 0.025 | 0.00625 |
阶 | 2 | 2 | 2 |
如果要用「图像」来表示,我们会选择使用loglog图,因为
这个「线性关系」在图像中能够更直观地体现。
因此,「绘图的过程」要分为如下几步:
- 计算出对应于不同的M的误差,将需要「绘图的数据单独存储」
- 导入数据进行绘图
- 图像后期加工、导出
之所以这么区分,基于如下考虑
- 计算过程复杂,因此要「做好数据保存工作」,最好额外标注上具体的参数,便于重复试验检查
- 图像绘制需要根据数据形态和我们想表达的意图加以调整
- 图像根据最后展示环境来选择导出的格式
废话不多说,下面进入正题。
数据的计算与保存
我们以一个「简单的案例」来做说明
利用Taylor展开式
因此我们知道在 时,泰勒展开的「前三项」
和 的误差是 级别的。(Taylor展开的下一项就是 )
我们限定 ,并通过最大值来估计误差
因此,我们单独写一个函数来计算给定一个参数 下的误差
function y = ErrorEpsilon(epsilon)
我们分别对 来计算对应的误差。
像之前说的,我们将要绘图的数据存储下来
2.^(-(
这里,我们用「两个向量」存储了 和对应的误差
- 「epsilon_set」 存储了 5 个 的值
- 「result_set」 存储了对应的 5 个误差
列成图表如下
epsilon | 误差 | 收敛阶 |
---|---|---|
0.5 | 0.0185 | |
0.25 | 2.45e-3 | 2.914 |
0.125 | 3.16e-4 | 2.956 |
0.0625 | 4.01e-5 | 2.977 |
0.03125 | 5.05e-6 | 2.988 |
其中收敛阶,如 是这么计算的
可以通过计算的结果的表格展示看到逐渐接近 阶的误差。
讨论
「现实的程序」中,我们的「单个的误差」可能是经过「复杂的计算」过程得到的
例如我们经过有限元计算出了数值解和精确解的误差。
我们需要把写的这个程序写成一个函数
function err = myfun(M)
其中「输入」 就是我们想考察的参数,比如「网格的大小」,方程的系数,等等。
然后我们就如上文般多次调用 myfun 来计算对于关心的参数的误差,得到结果。
绘图
在上一步中,我们已经将结果:参数 和对应的误差「存储到了数据集」中。
这一步中,我们「加载数据集」来进行绘图。
由于我们想要直观地反映
的数量关系,我们通过「双对数图」让这个关系可以通过直线表达
因此我们用如下代码绘图
load mydata.mat
figure;
set(gcf,'unit','centimeters','position',[10,10,20,20]);
loglog(epsilon_set, result_set,'b-o','LineWidth',2,'MarkerSize',18);
set(gca,'FontSize',22);
其中绘图的主语句是第4句:loglog绘制双对数图
- 第一个参数是「x轴变量」
- 第二个参数是「y轴变量」
'b-o'
代表了- blue:蓝色
- -:实线
- o:圆圈形「数据点」marker
- LineWidth:直线宽度
- MarkerSize:数据点marker的大小
其他语句的解释
- 第一句:加载数据
- 第二句:画框
- 第三句:设置画框的位置,大小,和单位
- 第五句:设置当前坐标 (axis) 下的字体大小
效果如下图

图像保存
'loglog.png')
使用 「print 命令」来将matlab图像进行输出,保存格式为 png。
当然如果插入到latex中也许「eps更合适」,可以通过 help print
来查看相应选项

除此之外,函数中的其他几句话应该是在设置图像打印出来的纸张大小和图像位置
——如果你搞明白了这些的含义请务必告诉我。
后期调整
其实吧,我觉得画成这样应该可以了,但我们还是可以做两个调整
- 加个网格
grid on
- 调整一下坐标宽度
- 毕竟是三阶收敛,现在「看不出三阶的斜率」,没有排面
在 savepng('loglog.png')
之前加上下面三行
grid on;
axis square;
xlim([1e-3,10]);
效果如下图

看起来收敛地确实还是挺快的,哈哈哈
总结
数据生成部分
2.^(-(
绘图部分
load mydata.mat
figure;
set(gcf,'unit','centimeters','position',[10,10,20,20]);
loglog(epsilon_set, result_set,'b-o','LineWidth',2,'MarkerSize',18);
set(gca,'FontSize',22);
grid on;
axis square;
xlim([1e-3,10]);
savepng('loglog.png')
function savepng(filename)
% 保存和图像等大的png文件
fig = gcf;
fig.PaperPositionMode = 'auto';
fig_pos = fig.PaperPosition;
fig.PaperSize = [fig_pos(3) fig_pos(4)];
print(fig,filename,'-dpng')
end