matlab loglog_Matlab绘图:如何让你的图看起来就觉得很正确?

  点击上方蓝字,关注学新知!! bf7f028021c70d6c6c1ea58494e9601b.gif

本文和大家分享一下「Matlab中绘图」的基本操作,属于「手把手教学」哦~

导读:

  • Matlab绘图「思路分析」
  • 具体「操作」的详细介绍
  • 「保存」输出
  • 后期「调整」

绘图思路

巧妇难为无米之炊

要想掌握好Matlab的绘图技能,首先就要准备好“食材”。

「绘图的目的」自然是让读者能够更「清楚直观」地理解我们讲的内容。

因此,相比于如何绘图,「绘制怎样的图」「传递怎样的信息」 才是我们首先要考虑的问题。

当然,传递信息的话,表格也可以做到。

比如我们要表达error随着M的增大而「二阶减小」,即

我们可以用下面的表格来反映

M3264128256
误差0.40.10.0250.00625
222

如果要用「图像」来表示,我们会选择使用loglog图,因为

这个「线性关系」在图像中能够更直观地体现。

因此,「绘图的过程」要分为如下几步:

  • 计算出对应于不同的M的误差,将需要「绘图的数据单独存储」
  • 导入数据进行绘图
  • 图像后期加工、导出

之所以这么区分,基于如下考虑

  • 计算过程复杂,因此要「做好数据保存工作」,最好额外标注上具体的参数,便于重复试验检查
  • 图像绘制需要根据数据形态和我们想表达的意图加以调整
  • 图像根据最后展示环境来选择导出的格式

废话不多说,下面进入正题。

数据的计算与保存

我们以一个「简单的案例」来做说明

利用Taylor展开式

因此我们知道在 时,泰勒展开的「前三项」

和 的误差是 级别的。(Taylor展开的下一项就是 )

我们限定 ,并通过最大值来估计误差

因此,我们单独写一个函数来计算给定一个参数 下的误差

function y = ErrorEpsilon(epsilon)

我们分别对 来计算对应的误差。

像之前说的,我们将要绘图的数据存储下来

2.^(-(

这里,我们用「两个向量」存储了 和对应的误差

  • 「epsilon_set」 存储了 5 个 的值
  • 「result_set」 存储了对应的 5 个误差

列成图表如下

epsilon误差收敛阶
0.50.0185
0.252.45e-32.914
0.1253.16e-42.956
0.06254.01e-52.977
0.031255.05e-62.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) 下的字体大小

效果如下图

07e19aea2e896a8fbc224cd700286af5.png

图像保存

'loglog.png')

使用 「print 命令」来将matlab图像进行输出,保存格式为 png。

当然如果插入到latex中也许「eps更合适」,可以通过 help print 来查看相应选项

028e1c11b368b4fd6c33d3c4aff10030.png

除此之外,函数中的其他几句话应该是在设置图像打印出来的纸张大小和图像位置

——如果你搞明白了这些的含义请务必告诉我。

后期调整

其实吧,我觉得画成这样应该可以了,但我们还是可以做两个调整

  • 加个网格 grid on
  • 调整一下坐标宽度
    • 毕竟是三阶收敛,现在「看不出三阶的斜率」,没有排面

savepng('loglog.png') 之前加上下面三行

grid on;
axis square;
xlim([1e-3,10]);

效果如下图

0705dcf6762b0c62004891ad06620695.png

看起来收敛地确实还是挺快的,哈哈哈

总结

数据生成部分

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值