MATLAB使用教程(三)——慢慢練手做項目啦——新手來看

·前言

在上一篇文章中,我們學習了

  1. 在matlab中對外輸出
  2. 格式化字符串
  3. 在文件中編寫
  4. 調整matlab的字符編碼格式
  5. 編寫代碼時的一些小提示

本講開始

計算一元二次方程

這一講我們以科學計算開始,使用matlab計算精確度很高,我們可以嘗試來計算一下黃金分割率(定義大家可以自行百度一下,這裏就不再說了):

計算黃金分割率的公式是:\phi = \frac{\sqrt5 \pm 1}{2}

如果使用加法,得到的是1.618........,如果使用減法,得到的是0.618........,這兩個結果都是正確的。因爲他們兩個只相差1.

首先,我們把這個公式轉化一下,把根號去掉,轉化爲一個一元二次方程:

\phi = \frac{\sqrt5\pm1}{2} \rightarrow 2\phi = \sqrt5\pm1 \rightarrow 2\phi \pm 1 = \sqrt5 \rightarrow \phi^{2} -1 - \phi = 0 (因爲+號時無解,所以捨去)

然後我們就只需要使用matlab解開這個方程了!

clear;
clc;
%% 本程序求解黃金分割率的比值
% r^2 - r - 1 = 0的解就是比值。
p = [1 -1 -1];
% 此數組代表了上式的二次項係數、一次項係數和常數項。
r = roots(p);
print_str = sprintf('r^2 - r - 1 = 0的結果是:%f和%f\n', r);
disp(print_str);

可以看到結果如下:

 可以看到,這兩個數就是我們需要的結果了。

當然,如果我們實現不知道各個係數,只知道我們的公式(假設),我們可以使用solve函數來計算,可以大大節省我們的時間:

%% 第二種計算的方法。
clear;
clc;
r2 = solve('r^2 - r - 1 = 0');
print_str = sprintf('r*r - r - 1 = 0的結果是:%f和%f\n', r2);
disp(print_str);

同樣也能得到我們想要的結果,但同時注意:佔位符是 %f 千萬不能寫成其他的。

但是你可能覺得這個精確度不高,沒問題,使用 vpa 方法可以提高精確度到很多位!!

第一個參數是我們的數據,第二個參數是我們精確到小數點後的位數。可以得到很多位的結果(好像理論是無限,但是前提是電腦的CPU夠厲害並且你有足夠的耐心並且你的內存夠大!!在我的電腦上,計算到小數點後五萬位已經有明顯的一秒左右延遲了。)

PS: 關於版本適配的問題,感謝朋友sky1023指出了一點版本不同,solve()函數在2018版用法見圖片,我教程裏使用的是matlab2016R的版本。

看一元方程的圖形

上面我們計算了這個方程,大家知道,在數學中,一元二次方程的表現是開口向上或者向下的拋物線,方程的解就是與X軸的交點(即零點)。

那麼如何在matlab中表現呢?下面上代碼!

%% 顯示函數的圖像
f = inline( 'x^2 - x - 1');  % 寫出我們的函數
% 但是這個inline馬上就不能用了,但是隻是前期學習,不要介意
ezplot(f, -4, 4);   %顯示我們的函數圖形,
hold on;

運行我們就能得到我們想要的東西:

大家可以看到,在 x = 0 的水平線處有我們的兩個x的值。

有個小疑問?

加入我們寫成另一個形式呢(1/x - (x - 1))?很容易知道,這倆圖像雖然圖形不一樣,但是也是黃金分割率公式的變形,只需移項消元即可得到這個形式,很明顯,這個世子有個點是不存在的(點0,不能爲分母),這個公式的圖形也明顯類似於反比例函數(在點0處的間斷點是第二類間斷點,0+0處是正無窮大,0-0處是負無窮大)。

這個沒問題!matlab會計算我們需要的函數圖形,有間斷點會計算極限,儘可能的滿足我們(這次我們在代碼裏標出這個解的位置),代碼如下:

%% 第二種形式
f = inline('1/x - (x - 1)');  % 寫出我們的函數
ezplot(f, -2, 2);
zeor1 = fzero(f, 1);  % 找第一個函數零點,在x=1附近
zero2 = fzero(f, -1); % 找第二個函數零點,在x=-1附近
hold on;
plot(zeor1, 0, 'o'); % 在第一個零點出畫一個字母o
plot(zero2, 0, 'o'); % 在第一個零點出畫一個字母o

而圖形,如同我們預期,顯示出了一個雙曲線,並且在零點處標出了我們的符號:

小彩蛋:

計算 sinx/x 的0處的比值。我們知道,當x->0的時候,sinx 和x是等價無窮小,比值是1,那麼,我們看一下圖形把!

那麼這個圖形的函數,大家自己解決哦!!

今日總結

我們今天學習瞭如下知識點:

  1. 使用roots函數求一元二次方程的根。
  2. 使用solve函數求方程的根(注意哦,沒說是幾次的。大家可以試試三次函數等,甚至沒實數根的大家也可以試試,我們要從認識得到實踐,然後再根據實踐得到新的認識!)
  3. 使用inline函數和ezplot函數一起繪製函數圖形(小技巧:ezplot音似:easy plot,簡單繪製,方便我們記憶)
  4. 使用 fzero 函數和 plot 函數繪製某一點處的零點。

今天到這裏了!謝謝大家觀看。希望我們一起進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章