天天看點

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

Matlab繪圖

「手把手教學」

第二彈來啦

在之前的文章中

Matlab繪圖:如何讓你的圖看起來就覺得很正确?​mp.weixin.qq.com

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

我們介紹了一些非常簡單實用的Matlab繪圖操作(案例展示),包括

  • 「選擇什麼樣」 的圖?
  • 如何 「調整圖像」 使得含義表達更明确?
  • 調整字型
  • 儲存 「輸出圖像」

本文呢,我們來

「進一步調整圖像」

,增添一些更有助于讀者了解的元素。

改進思路

首先我們來看下之前的圖像

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

大家集思廣益來看看有什麼改進的呢?

  • 可以加個 「圖例」
  • 加個标題說明一下 「用意」
  • 說明一下x軸的變量
  • 這個圖是三階收斂的,但是能不能 「表示地更明顯」 呢?

沒錯,我們可以加一個

「直角」

三角形!

「長寬比」

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

,就像下面這樣~

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

這樣讀者是不是就可以

「一目了然」

地看出藍色的線條是

「關于參數」
matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形
「三階下降」

的呢?

回顧

這裡,我們回顧一下藍色線條的含義,它反映的是函數

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

和它的Taylor展開到前三項的多項式逼近

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

的誤差。

同時,我們也繪制了Taylor展開式中保留前兩項

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

的誤差結果——

「紅色三角」

表示

左上角的輔助三角形讓讀者一目了然地看到紅色的線是二階下降的。

輔助三角形的繪制

下面我們講講這個輔助的三角形怎麼繪制。

實際應用中,根據我們要描述的

「收斂點圖」

的方向,我們需要下面四種三角形

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

觀察

「規律」
  • 都是直角三角形
  • 直角邊 「平行于坐标軸」
  • 根據斜邊來看
    • A、B的 「斜邊斜率」 為負
    • C、D的 「斜邊斜率」 為正

三角形的決定量

要繪制出一個這樣的三角形,我們隻需要如下的參數

  • 水準邊的兩個點的坐标
  • 斜邊的斜率

通過這些參數,我們來計算出三角形的三個頂點坐标(其實兩個已經有了,隻需要計算出第三個頂點)

下面我們拿一個三角形來

「具體說明」
matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

我們觀察這個三角形的斜邊,對應的是

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

階收斂。

為什麼呢?我們觀察

「右上角的點到左下角的點」

的收斂率

橫坐标
matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形
變小了
matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形
縱坐标
matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形
變小了
matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

是以,在這裡,我們可以得到

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

其中

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

對應的是斜邊的斜率,也是誤差随着參數

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

的收斂率。

因為

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

是以我們隻需要輸入

「水準邊的兩個頂點」

的坐标以及

「斜邊的斜率」

,我們就可以計算出第三個點的縱坐标

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

是以我們的函數的輸入部分如下書寫

function triangle(tr1,tr2,ratio)
    x0 = tr1(1); y0 = tr1(2); x1 = tr2(1); 
    y1 = y0*(x1/x0)^ratio;
           

參數解釋

  • tr1是水準邊上鄰接斜邊的那個頂點,是一個二維向量
    matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形
  • tr2是水準邊上另一個頂點,我們隻需要它的x坐标
    matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形
  • 仿照上文的公式, 「計算第三個頂點的y坐标」
    matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

繪制三角形

重點來啦!!

三角形的繪制過程:

把三個頂點依次連接配接起來
「唯一值得注意」

的是,我們不希望這樣繪制的線條在添加圖例時被探測到。

(PS:如果什麼都不做,你在添加圖例時,會按照你繪圖的順序給每條線都加一個圖例)

是以,我們用下面的語句

loglog([x0,x1],[y0,y0],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x1],[y0,y1],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x0],[y1,y0],'-k','HandleVisibility','off','Linewidth',1.5);
           

其中

HandleVisibility

就是設定句柄是否可見。

最後,我們再添加顯示比例的文字(1和2)來輔助讀者更輕易地了解,使用matlab的text指令即可。

我們将繪制三角形的指令寫成一個function,如下

function triangle(tr1,tr2,ratio,text1,text2,pos_adjust)
    x0 = tr1(1); y0 = tr1(2); x1 = tr2; 
    y1 = y0*(x1/x0)^ratio;
    loglog([x0,x1],[y0,y0],'-k','HandleVisibility','off','Linewidth',1.5);
    loglog([x1,x1],[y0,y1],'-k','HandleVisibility','off','Linewidth',1.5);
    loglog([x1,x0],[y1,y0],'-k','HandleVisibility','off','Linewidth',1.5);
    text(sqrt(x0*x1),y0*pos_adjust,text1,'fontsize',16);
    text(x1*pos_adjust,sqrt(y0*y1),text2,'fontsize',16);
end
           

參數解釋:

  • tr1:水準邊和斜邊交點坐标
  • tr2:水準邊另一個端點坐标
  • ratio:斜邊斜率
  • text1:水準邊文字
  • text2:垂直邊文字
  • pos adjust:文字坐标的微調

總結

最後給出一個調用的例子(開始的例子)友善你來親手實踐一下~

close all
epsilon_set = [0.5,0.25,0.125,0.0625,0.03125];
result2_set = [0.10653,0.0288007,0.00749690258,0.0019130628,0.00048323447];
result3_set = [0.01846,0.0024492,0.00031559741,4.0062186e-05,5.046773e-06];

figure; 
set(gcf,'unit','centimeters','position',[10,10,20,20]);
loglog(epsilon_set, result3_set,'b-o','LineWidth',2,'MarkerSize',18);

hold on;
loglog(epsilon_set, result2_set,'r-.^','LineWidth',2,'MarkerSize',18);

tr1 = [1e-1,1e-1]; tr2 = 2e-2; ratio = 2;
triangle(tr1,tr2,ratio,'1','2',1.2);

tr1 = [1e-1,5e-6]; tr2 = 1; ratio = 3;
triangle(tr1,tr2,ratio,'1','3',1.2);

grid on;
axis square;
xlim([1e-3,10]);
xlabel('{fontsize{28}epsilon}')
legend('前三項','前兩項')
title('Taylor展開誤差');

set(gca,'FontSize',22);

savepng('loglog.png')

function savepng(filename)
    fig = gcf; 
    fig.PaperPositionMode = 'auto'; 
    fig_pos = fig.PaperPosition; 
    fig.PaperSize = [fig_pos(3) fig_pos(4)];
    print(fig,filename,'-dpng')
end

function triangle(tr1,tr2,ratio,text1,text2,pos_adjust)
    x0 = tr1(1); y0 = tr1(2); x1 = tr2; 
    y1 = y0*(x1/x0)^ratio;
    loglog([x0,x1],[y0,y0],'-k','HandleVisibility','off','Linewidth',1.5);
    loglog([x1,x1],[y0,y1],'-k','HandleVisibility','off','Linewidth',1.5);
    loglog([x1,x0],[y1,y0],'-k','HandleVisibility','off','Linewidth',1.5);
    text(sqrt(x0*x1),y0*pos_adjust,text1,'fontsize',16);
    text(x1*pos_adjust,sqrt(y0*y1),text2,'fontsize',16);
end
           

回味

相信你已經學會添加一個

「輔助了解」

的三角形這個小技巧了吧~

最後再

「強調一下」

吧~

有時候,你的圖中的三角形,雖然

「數學上」

确實是 1:2 的,但是

「看起來卻不像」

,如下

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

要怎麼調整呢?

原因是x軸的範圍太小了,把圖像給

「拉變形」

了,是以把x軸的範圍修改成

xlim([1e-3,10])
           

就o了,因為這個時候x軸的跨度是

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

正好

「等于」

y軸的跨度。

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形

當然你又可能要說了,左右兩邊的空白太多了...那就閱讀原文看看裡面的答案是不是你想要的吧~

Matlab繪圖:繪制輔助三角形提升閱讀效果​mp.weixin.qq.com

matlab loglog_Matlab繪制誤差收斂圖:loglog圖與輔助圖形