日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

台湾国立大学郭彦甫Matlab教程笔记(20) root finding(numeric)

發(fā)布時(shí)間:2025/4/5 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 台湾国立大学郭彦甫Matlab教程笔记(20) root finding(numeric) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

臺(tái)灣國(guó)立大學(xué)郭彥甫Matlab教程筆記(20) root finding(numeric)

symbolic vs. numeric符號(hào)法和數(shù)值法的區(qū)別對(duì)比
symbolic
1)advantages
analytical solutions解析解
let you intuit憑感覺知道 things about solution form憑感覺知道解的形式
2)disadvantages
sometimes can’t be solved有時(shí)候解不出來
can be overly complicated過于復(fù)雜

numeric
1)advantages
always get a solution通常有解
can make solutions accurate 解很準(zhǔn)確
easy to code 代碼簡(jiǎn)單
2)disadvantages
hard to extract a deeper understanding
很難有更深的理解

這幾課的第二單元

numeric solver數(shù)值解

如何運(yùn)用matlab中的內(nèi)建函數(shù)

回顧一下function handle @
這里為什么還要復(fù)習(xí)function handle 呢?因?yàn)榇龝?huì)講的numeric solver 需要用到function handle

作用:a handle is a function pointer
pass functions to other functions
舉例子:一個(gè)函數(shù)的輸入是一個(gè)函數(shù)
下面是一個(gè)xy_plot()函數(shù),可以繪制圖像

function [y]=xy_plot(input,x) y=input(x); plot(x,y,'r--'); xlabel('x'); ylabel('function(x)'); end

try:xy_plot(@sin,0:0.01:2pi);%畫出sin()函數(shù)的圖像
xy_plot(@atan,0:0.01:2pi);%畫出arctan()函數(shù)的圖像

畫出來的arctan(x)的圖像:


我們開始講numeric root solver 根數(shù)值求解

fsolve()函數(shù)的使用

a numeric root solver

關(guān)于fsolve()函數(shù)的用法:

(來源于百度百科)
舉例

例程:
f2= @(x) (1,2*x+0.3+x.*sin(x));
這個(gè)叫做inline function 內(nèi)聯(lián)函數(shù)

fsolve(f2,0)%f2是一個(gè)函數(shù)句柄, 0是初始猜測(cè),然后fsolve會(huì)幫我們解這個(gè)方程f(x)=0
代碼:
f2= @(x) (1,2*x+0.3+x.*sin(x));
fsolve(f2,0)%

function tolerance 什么意思呢? 函數(shù)容差

計(jì)算出來

練習(xí)題:解二元方程組,使用數(shù)值解法fsolve

查資料
在matlab中輸入 help fsolve,然后進(jìn)入 fsolve參考頁,學(xué)習(xí)一下fsolve 的用法

看下面的 二元非線性方程組的求解例題
題目:兩個(gè)變量的方程組如下

求解過程:
【1】寫一個(gè)函數(shù),這個(gè)函數(shù)函數(shù)體中是兩個(gè)代求的方程,然后保存為.m文件
【2】用句柄@調(diào)用函數(shù)
【3】給初值,用fsolve()函數(shù)解決。
(來源:matlab官方文檔)

我的求解過程:
root2d.m文件中:
function F= root2d(x)%函數(shù)名是root2d
F(1)=2x-y-exp(-x);%函數(shù)體是兩個(gè)代求方程
F(2)=-x+2y-exp(-y);
end
上面代碼是錯(cuò)誤的,需要用x(1)和x(2)來表示x和y,不能直接用y。

代碼修改為:
function F= root2d(x)%函數(shù)名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

function F= root2d(x)%函數(shù)名root2d F(1)=2*x(1)-x(2)-exp(-x(1));%用x(1) and x(2)表示不同的 變量,比如x,y F(2)=-x(1)+2*x(2)-exp(-x(2)); end

調(diào)用代碼:
fun=@root2d;%函數(shù)句柄調(diào)用root2d函數(shù)
x0=[-5,-5];%初始值
fsolve(fun,x0)

fun=@root2d;%函數(shù)句柄調(diào)用root2d函數(shù) x0=[-5,-5];%初始值 fsolve(fun,x0)

計(jì)算結(jié)果x=0.5671 y=0.5671

另外一個(gè) numeric root solver

fzero()函數(shù)

find the zero if and only if the function crosses the x-axis
fzero 需要注意,函數(shù)必須穿過x軸才有解。如果和x軸相切而不穿過,則fzero解不出來。
舉例:求 f=x^2的根

例程:下面就是解不出來
f=@(x) x.^2;
fzero(f,0.1)%f:function handle ; 0.1:initial guess

f=@(x) x.^2; fzero(f,0.1)%f:function handle ; 0.1:initial guess

運(yùn)行結(jié)果:

可以用fsolve(f,0.1)解出值
但是精度不夠


然后 fsolve() 和 fzero() 函數(shù)有進(jìn)階的用法
options

用法:
options =optimset(‘maxiter’,1e3,‘tolfun’,1e-10);

options =optimset('maxiter',1e3,'tolfun',1e-10);

使用一個(gè)function : optimset () option set 可以使算出來的數(shù)值精度更高

例程:
f=@(x) x.^2;
options =optimset(‘maxiter’,1e3,‘tolfun’,1e-10);
fsolve(f,0.1,options)
fzero(f,0.1,options)

f=@(x) x.^2; options =optimset('maxiter',1e3,'tolfun',1e-10); fsolve(f,0.1,options) fzero(f,0.1,options)

在誤差為1*10的-10次方的情況下,求得數(shù)值解為


數(shù)值解還有另外一個(gè)函數(shù),用來對(duì)付polynomial多項(xiàng)式

finding roots of polynomials:root()函數(shù)

舉例:


代碼:
roots([1,-3.5,2.75,2.125,-3.875,1.25])
得到多項(xiàng)式的解:

練習(xí)題
使用roots()這個(gè)函數(shù)求解下面多項(xiàng)式的解

代碼:roots([1,-6,-12,81])
得到的多項(xiàng)式的解

這些fsolve 和fzero 是如何運(yùn)作的呢?

兩種主要的數(shù)值求根方法:
一種是有區(qū)間包夾的:括號(hào)法
另一種是沒有區(qū)間包夾的,代表是牛頓法

數(shù)值方法停止運(yùn)算需要兩個(gè)標(biāo)準(zhǔn)要滿足:要么是精度夠了,要么是運(yùn)算次數(shù)達(dá)到了

下面看第一種method

bisection method (bracketing)括號(hào)法

現(xiàn)在進(jìn)行到這里

bisection method (bracketing)

用二分法來找
lowerbond upperbond

iteration 遞歸,迭代
整個(gè)二分法的迭代過程:
其中,r是區(qū)間中點(diǎn),然后不斷循環(huán),區(qū)間不斷減半逼近根植

二分算法流程圖
bisection algorithm flowchart

下面看另外一個(gè)方法牛頓法

newton-raphson method(open)牛頓法

適用條件
1)函數(shù)連續(xù)
2)導(dǎo)數(shù)已知

牛頓法算法:

牛頓法思路:過f(x0)一點(diǎn)作切線,交x軸交點(diǎn)為x1,然后找到函數(shù)值f(x1),過該點(diǎn)再作切線,接著交x軸,不停迭代下去。知道找到曲線與x軸交點(diǎn)(方程的根)為止

牛頓法算法流程圖

下面我們來看一下二分法和牛頓法的比較

二分法和牛頓法的優(yōu)缺點(diǎn):
二分法:需要區(qū)間,結(jié)果比較可靠,但是比較慢
牛頓法:速度快,有時(shí)候不收斂,同時(shí)需要知道函數(shù)的微分

下面是最后一個(gè)單元 遞歸函數(shù)

recursive functions 遞歸函數(shù)

自己調(diào)用自己 functions that call themselves

舉例:計(jì)算階乘factorial

階乘可以用另一個(gè)階乘來表示(遞推公式)
n!=n*(n-1)!

遞歸函數(shù)大家都學(xué)過,這里使用英文版的了解一下。
遞歸函數(shù)需要退出條件,基礎(chǔ)情況;需要遞推公式

下面給出一個(gè)計(jì)算階乘的遞歸函數(shù)

function output =fact(n) if n==1output =1; else output=n*fact(n-1); endend

參考資料:
[1]B站av41338843視頻
[2]matlab官方文檔

【總結(jié)一下】
學(xué)習(xí)了求解非線性方程組的函數(shù)fsolve()的使用。
還有一個(gè)求根函數(shù)fzero(),適用條件:函數(shù)圖像穿過x軸
還有針對(duì)多項(xiàng)式的求根公式roots()

后面介紹了兩種求根的原理:二分法和牛頓法(切線逼近,速度快)
最后提及 遞歸函數(shù)recursive function

總結(jié)

以上是生活随笔為你收集整理的台湾国立大学郭彦甫Matlab教程笔记(20) root finding(numeric)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。