8-2 ずヮう@

若要處理一般數學函數,我們必須先將此數學函數寫成 MATLAB 的函式,同時使用字串或變數來代表此函式,以便進行下一步處理。一般來說,我們有兩種方式可以選用:

在下面這個範例,我們就使用這兩種方式來指定 humps.m 函式,並用fplot 指令來進行此數學函數的作圖。例如,若要畫出 humps 函數在 [0,2] 間的曲線,可輸入如下:

Example 1: 08-一般數學函數的處理與分析/fplot01.msubplot(2,1,1); fplot('humps', [0,2]); % 使用字串指定函式 subplot(2,1,2); fplot(@humps, [0 2]); % 使用函式握把來指定函式[Warning: Char input to fplot will be removed in a future release. Use fplot(humps) instead.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m', 105)" style="font-weight:bold">fplot</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m',105,0)">line 105</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot01', 'D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot01.m', 2)" style="font-weight:bold">fplot01</a> (<a href="matlab: opentoline('D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot01.m',2,0)">line 2</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'd:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'd:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

由上述範例可知,使用字串和函式握把,所得到的結果是一樣的。以下的範例,將盡量使用函式握把來指定函式,因為這是 MATLAB 新版支援的方式,而且其執行效率也比較高。

使用 fplot,您也可以同時改變 x 和 y 的區間,例如:

Example 2: 08-一般數學函數的處理與分析/fplot02.mfplot(@humps, [0 1 5 25]); grid on % 畫出格線Error in running fplot02! (Logged to scriptError.log)

此時 x 的區間為 [0, 1],y 的區間為 [5, 25]。

fplot 也接受「當場表示」的數學函數,而不見得要先將此數學函數寫成 MATLAB函式,例如:

Example 3: 08-一般數學函數的處理與分析/fplot021.msubplot(2,1,1); fplot('sin(2*x)+cos(x)', [-10, 10]) % 使用字串指定函式 subplot(2,1,2); fplot(@(x)sin(2*x)+cos(x), [-10, 10]) % 使用函式握把來指定函式[Warning: Char input to fplot will be removed in a future release. Use fplot(@(x)sin(2.*x)+cos(x)) instead.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m', 105)" style="font-weight:bold">fplot</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m',105,0)">line 105</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot021', 'D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot021.m', 2)" style="font-weight:bold">fplot021</a> (<a href="matlab: opentoline('D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot021.m',2,0)">line 2</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'd:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'd:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

在上述範例中,我們也同時使用了字串和函式握把來指定數學函數 sin(2x)+cos(x)

fplot 指令也可同時對多個函數作圖,只需要將這些函數放入一個向量即可,範例如下:

Example 4: 08-一般數學函數的處理與分析/fplot022.m% fplot 指令可同時對多個函數作圖 fplot(@(x)[sin(x), exp(-x)], [0, 10])

在進行此種運算時,可將變數 x 看成是一個行向量(Column Vector),而 [sin(x), exp(-x)] 則是二個行向量,每個行向量代表一個函數(即一條曲線)。

fplot 基本上也是描點作圖,類似 plot(x, y),只是 x 座標點的密集度是根據函數值的變化而決定,因此可產生比較“翔實”的函數圖形。欲顯示 fplot 所產生的 x 座標點,可輸入如下:

Example 5: 08-一般數學函數的處理與分析/fplot03.m[x, y] = fplot(@humps, [-1,2]); plot(x, y, '-o');[Warning: Having two output arguments for fplot will be removed in a future release. Use the XData and YData properties instead.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m', 171)" style="font-weight:bold">fplot</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m',171,0)">line 171</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot03', 'D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot03.m', 1)" style="font-weight:bold">fplot03</a> (<a href="matlab: opentoline('D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot03.m',1,0)">line 1</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'd:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'd:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

由上圖可知,fplot 會在函數變化平緩處,產上較稀疏的取樣點,而在函數變化劇烈處,產生較緊密的取樣點。

若欲產生更密的 x 座標點,可在 fplot 指令加入另一個代表相對容忍度(Tolerance)的輸入引數,舉例如下:

Example 6: 08-一般數學函數的處理與分析/fplot04.msubplot (2,1,1); fplot(@(x)sin(1./x), [0.01,0.1]); subplot (2,1,2); fplot(@(x)sin(1./x), [0.01,0.1], 0.0001);[Warning: The tolerance parameter input to fplot has been removed.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m', 89)" style="font-weight:bold">fplot</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\fplot.m',89,0)">line 89</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('fplot04', 'D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot04.m', 4)" style="font-weight:bold">fplot04</a> (<a href="matlab: opentoline('D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\fplot04.m',4,0)">line 4</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'd:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'd:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

在第一圖中,fplot 指令使用了預設的相對容忍度,其值為 0.002;在第二圖中,相對容忍度被設為 0.0001,因此我們可以得到更準確的圖形,但相對也要花更多的計算及作圖時間。

ezplot 指令和 fplot 指令類似,只不過使用上更為簡便。例如,若要畫出三次多項式 $f(x)=x^3-x^2+x$ 的圖形,可輸入如下:

Example 7: 08-一般數學函數的處理與分析/ezplot01.mezplot(@(x)x^3-x^2+x);[Warning: Function failed to evaluate on array inputs; vectorizing the function may speed up its evaluation and avoid the need to loop over array elements.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('ezplot>ezplot1', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m', 498)" style="font-weight:bold">ezplot>ezplot1</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m',498,0)">line 498</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('ezplot', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m', 154)" style="font-weight:bold">ezplot</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m',154,0)">line 154</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('ezplot01', 'D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\ezplot01.m', 1)" style="font-weight:bold">ezplot01</a> (<a href="matlab: opentoline('D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\ezplot01.m',1,0)">line 1</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'd:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'd:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

ezplot 指令的預設作圖範圍是 $[-2\pi, 2\pi]$,如上圖所示。

ezplot 也可用於畫出參數式的曲線,在下列範例中,我們使用 ezplot 來畫出示波器常看到的利薩如圖形(Lissajious’Figuers),如下:

Example 8: 08-一般數學函數的處理與分析/ezplot02.m% ezplot 可畫出平面中的參數式曲線 ezplot(@(t)sin(3*t), @(t)cos(5*t));

在畫參數式的曲線時,參數的預設範圍仍然是 $[-2\pi, 2\pi]$。

ezplot 指令亦可用於隱函數的作圖,例如若要畫出 $x^3+2x^2-3x+5-y^2+10=0$ 的圖,可以執行下列範例:

Example 9: 08-一般數學函數的處理與分析/ezplot03.m% ezplot 指令亦可用於隱函數的作圖 ezplot(@(x,y)x^3+2*x^2-3*x-y^2+15);[Warning: Function failed to evaluate on array inputs; vectorizing the function may speed up its evaluation and avoid the need to loop over array elements.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('ezplotfeval', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\private\ezplotfeval.m', 56)" style="font-weight:bold">ezplotfeval</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\private\ezplotfeval.m',56,0)">line 56</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('ezplot>ezimplicit', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m', 267)" style="font-weight:bold">ezplot>ezimplicit</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m',267,0)">line 267</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('ezplot', 'C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m', 163)" style="font-weight:bold">ezplot</a> (<a href="matlab: opentoline('C:\Program Files\MATLAB\toolbox\matlab\specgraph\ezplot.m',163,0)">line 163</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('ezplot03', 'D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\ezplot03.m', 2)" style="font-weight:bold">ezplot03</a> (<a href="matlab: opentoline('D:\users\jang\books\matlabProgramming4guru\example\08-一般數學函數的處理與分析\ezplot03.m',2,0)">line 2</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'd:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'd:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('d:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

ezplot 指令還有其它選項,可詳見 MATLAB 線上支援。

Hint
「ezplot」中的「ez」即代表英文的「easy」,亦即就是「簡單容易」的意思。類似繪圖指令還有 ezplot3、ezpolar、ezsurf、ezmesh、ezsurfc、ezmeshc、econtour,ezcontourf 等 ,詳見 MATLAB 線上支援。


MATLAB程式設計:進階篇