台湾国立大学郭彦甫Matlab教程笔记(20) root finding(numeric)
臺灣國立大學郭彥甫Matlab教程筆記(20) root finding(numeric)
symbolic vs. numeric符號法和數值法的區別對比
symbolic
1)advantages
analytical solutions解析解
let you intuit憑感覺知道 things about solution form憑感覺知道解的形式
2)disadvantages
sometimes can’t be solved有時候解不出來
can be overly complicated過于復雜
numeric
1)advantages
always get a solution通常有解
can make solutions accurate 解很準確
easy to code 代碼簡單
2)disadvantages
hard to extract a deeper understanding
很難有更深的理解
這幾課的第二單元
numeric solver數值解
如何運用matlab中的內建函數
回顧一下function handle @
這里為什么還要復習function handle 呢?因為待會講的numeric solver 需要用到function handle
作用:a handle is a function pointer
pass functions to other functions
舉例子:一個函數的輸入是一個函數
下面是一個xy_plot()函數,可以繪制圖像
try:xy_plot(@sin,0:0.01:2pi);%畫出sin()函數的圖像
xy_plot(@atan,0:0.01:2pi);%畫出arctan()函數的圖像
畫出來的arctan(x)的圖像:
我們開始講numeric root solver 根數值求解
fsolve()函數的使用
a numeric root solver
關于fsolve()函數的用法:
(來源于百度百科)
舉例
例程:
f2= @(x) (1,2*x+0.3+x.*sin(x));
這個叫做inline function 內聯函數
fsolve(f2,0)%f2是一個函數句柄, 0是初始猜測,然后fsolve會幫我們解這個方程f(x)=0
代碼:
f2= @(x) (1,2*x+0.3+x.*sin(x));
fsolve(f2,0)%
function tolerance 什么意思呢? 函數容差
計算出來
練習題:解二元方程組,使用數值解法fsolve
查資料
在matlab中輸入 help fsolve,然后進入 fsolve參考頁,學習一下fsolve 的用法
看下面的 二元非線性方程組的求解例題
題目:兩個變量的方程組如下
求解過程:
【1】寫一個函數,這個函數函數體中是兩個代求的方程,然后保存為.m文件
【2】用句柄@調用函數
【3】給初值,用fsolve()函數解決。
(來源:matlab官方文檔)
我的求解過程:
root2d.m文件中:
function F= root2d(x)%函數名是root2d
F(1)=2x-y-exp(-x);%函數體是兩個代求方程
F(2)=-x+2y-exp(-y);
end
上面代碼是錯誤的,需要用x(1)和x(2)來表示x和y,不能直接用y。
代碼修改為:
function F= root2d(x)%函數名root2d
F(1)=2x(1)-x(2)-exp(-x(1));%用x(1) and x(2)表示不同的 變量,比如x,y
F(2)=-x(1)+2x(2)-exp(-x(2));
end
調用代碼:
fun=@root2d;%函數句柄調用root2d函數
x0=[-5,-5];%初始值
fsolve(fun,x0)
計算結果x=0.5671 y=0.5671
另外一個 numeric root solver
fzero()函數
find the zero if and only if the function crosses the x-axis
fzero 需要注意,函數必須穿過x軸才有解。如果和x軸相切而不穿過,則fzero解不出來。
舉例:求 f=x^2的根
例程:下面就是解不出來
f=@(x) x.^2;
fzero(f,0.1)%f:function handle ; 0.1:initial guess
運行結果:
可以用fsolve(f,0.1)解出值
但是精度不夠
然后 fsolve() 和 fzero() 函數有進階的用法
options
用法:
options =optimset(‘maxiter’,1e3,‘tolfun’,1e-10);
使用一個function : optimset () option set 可以使算出來的數值精度更高
例程:
f=@(x) x.^2;
options =optimset(‘maxiter’,1e3,‘tolfun’,1e-10);
fsolve(f,0.1,options)
fzero(f,0.1,options)
在誤差為1*10的-10次方的情況下,求得數值解為
數值解還有另外一個函數,用來對付polynomial多項式
finding roots of polynomials:root()函數
舉例:
代碼:
roots([1,-3.5,2.75,2.125,-3.875,1.25])
得到多項式的解:
練習題
使用roots()這個函數求解下面多項式的解
代碼:roots([1,-6,-12,81])
得到的多項式的解
這些fsolve 和fzero 是如何運作的呢?
兩種主要的數值求根方法:
一種是有區間包夾的:括號法
另一種是沒有區間包夾的,代表是牛頓法
數值方法停止運算需要兩個標準要滿足:要么是精度夠了,要么是運算次數達到了
下面看第一種method
bisection method (bracketing)括號法
現在進行到這里
bisection method (bracketing)
用二分法來找
lowerbond upperbond
iteration 遞歸,迭代
整個二分法的迭代過程:
其中,r是區間中點,然后不斷循環,區間不斷減半逼近根植
二分算法流程圖
bisection algorithm flowchart
下面看另外一個方法牛頓法
newton-raphson method(open)牛頓法
適用條件
1)函數連續
2)導數已知
牛頓法算法:
牛頓法思路:過f(x0)一點作切線,交x軸交點為x1,然后找到函數值f(x1),過該點再作切線,接著交x軸,不停迭代下去。知道找到曲線與x軸交點(方程的根)為止
牛頓法算法流程圖
下面我們來看一下二分法和牛頓法的比較
二分法和牛頓法的優缺點:
二分法:需要區間,結果比較可靠,但是比較慢
牛頓法:速度快,有時候不收斂,同時需要知道函數的微分
下面是最后一個單元 遞歸函數
recursive functions 遞歸函數
自己調用自己 functions that call themselves
舉例:計算階乘factorial
階乘可以用另一個階乘來表示(遞推公式)
n!=n*(n-1)!
遞歸函數大家都學過,這里使用英文版的了解一下。
遞歸函數需要退出條件,基礎情況;需要遞推公式
下面給出一個計算階乘的遞歸函數
function output =fact(n) if n==1output =1; else output=n*fact(n-1); endend參考資料:
[1]B站av41338843視頻
[2]matlab官方文檔
【總結一下】
學習了求解非線性方程組的函數fsolve()的使用。
還有一個求根函數fzero(),適用條件:函數圖像穿過x軸
還有針對多項式的求根公式roots()
后面介紹了兩種求根的原理:二分法和牛頓法(切線逼近,速度快)
最后提及 遞歸函數recursive function
總結
以上是生活随笔為你收集整理的台湾国立大学郭彦甫Matlab教程笔记(20) root finding(numeric)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台湾国立大学郭彦甫Matlab教程笔记(
- 下一篇: 辽宁省空置房物业费减免条例?