牛頓法求解一元函式

2021-08-21 21:34:20 字數 3320 閱讀 8886

牛頓法求解一元函式

對於乙個簡單的一元方程我們可以通過代數運算來求解,但是對於乙個非線性的複雜一元函式例如−2

x5−8

x2+s

in(x

∗x)−

2x=0

− 2x

5−8x

2+si

n(x∗

x)−2

x=0這樣的方程,想要通過人力計算就很難辦到。

下面介紹利用牛頓法來構建的乙個一元函式方程求解的程式。

當方程沒有求根公式或者求根公式特別複雜時,利用牛頓法都可以進行迭代求解。

維基對牛頓法的定義為:

它是一種在實數域和複數域上近似求解方程的方法。方法使用函式f(x)的泰勒級數的前面幾項來尋找方程 f(y)=0的根。

先理解下泰勒級數

如果乙個函式是以實數或者複數為變數,並且該函式是可導的,那麼這個函式就可以被展開為泰勒多項式。

有如下定理:

設 n 是乙個正整數。如果定義在乙個包含 a 的區間上的函式 f 在 a 點處 n+1 次可導,那麼對於這個區間上的任意 x,都有: f(

x)=f

(a)+

f′(a

)1!(

x−a)

+f(2

)(a)

2!(x

−a)2

+...

+f(n

)(a)

n!(x

−a)n

+rn(x)f

(x)=

f(a)

+f′(

a)1!

(x−a

)+f(

2)(a

)2!(

x−a)

2+..

.+f(

n)(a

)n!(

x−a)

n+rn

(x)其中的多項式稱為函式在a 處的泰勒展開式,剩餘的rn

(x) rn(

x)是泰勒公式的餘項,是(x

−a)n(x

−a)n

的高階無窮小。

牛頓法就是利用一階泰勒展開f(

x)=f

(a)+

(x−a

)⋅f′

(a) f(x

)=f(

a)+(

x−a)

⋅f′(

a),對f(

x)=0

f (x

)=0求解得到x=

a−f(

a)f′

(a) x=a

−f(a

)f′(

a),利用其對

x x

進行不斷的迭代,直到

x' role="presentation">x

x收斂到正確的解或者逼近正確的解。

迭代公式為:xn

+1=x

n−fx

nf′(

xn) xn+

1=xn

−fxn

f′(x

n)用一段偽**表示為:

while x<0.000000001

//精度

x0 = x1

x1 = x0 - f(x0)/fdao(x1)

以上為求解方程的核心演算法。

下面是對函式表示式進行處理,包括表示式的預處理字首表示式轉化字尾表示式表示式計算表示式的求導及計算

對於使用者輸入的表示式,我們要轉化成一定的格式方便我們後續處理。

例如:轉化過程我們可以利用棧來作為臨時容器,用佇列輸出字尾表示式。具體演算法使用迪傑斯特拉提出的排程場演算法,具體演算法步驟如下(摘自維基):

如果這個記號表示乙個操作符,記做o1,那麼:

然後,將o1壓入棧的頂端。

如果這個記號是乙個左括號,那麼就將其壓入棧當中。

如果這個記號是乙個右括號,那麼:

當再沒有記號可以讀取時:

退出演算法。

假如輸入的表示式為(a+b) * (c * (d+e)),經過轉化得到a b + c d e + * *這樣的字尾表示式。

首先要解決乙個問題,通過哪種資料結構來儲存表示式,表示式的計算是乙個不遞迴環的過程,我們可以用「棧+迴圈」來處理,但為了方便遞迴處理和後序的遞迴求導,這裡用二叉樹來儲存字尾表示式。

下面是(a+b) * (c * (d+e))的表示式樹:

該樹的特點是:葉子節點為運算元,父節點為操作符,可以從葉子節點開始一直向上遞迴最終求解出整個表示式的結果。

構建表示式樹

利用字尾表示式很容易的得出表示式樹,其構建的演算法如下:

最終棧底只有乙個表示式樹,其他情況均視為表示式錯誤。

求值以根結點為操作符,左右子樹為運算元,可以對二叉樹進行遞迴求解,最終得到乙個含有未知數

x x

的簡化表示式。

對於上面得到的二叉表達樹,由於二叉表達樹根結點總是操作符,左右子樹總是表示式,因此可以對二叉表達樹進行遞迴求導。求導的過程也是乙個遞迴的構建導函式樹的過程。

例如:乙個子樹是這樣的

設計乙個導函式dao(+,a,b),利用導函式規則(a+b)』=a』+b』,對該子樹求導的偽**如下:

dao(+,a,b)

return

new root(+,dao(a),dao(b))

上面是只有「+」一種情況,在具體**中我們需要根據所有符號的導函式規則分情況處理。

最終,將導函式樹進行遞迴計算。

至此我們得到乙個表示式

t' role="presentation">t

t,乙個表示式的導dt

d t。

利用牛頓法迭代處理,最終求解出未知數。

完整**的github位址。

最終的執行效果位址點此鏈結

如有錯誤或者改進的地方,歡迎指出。

08 一元函式物件和一元謂詞

include using namespace std include string include include include set include include functional 函式物件 類過載了函式呼叫操作符,這樣的類定義的物件稱為函式物件 template class show...

鍊錶求一元函式和

include include using namespace std struct node struct node creat 建立單鏈表返回煉表頭指標,此頭指標無資料 return head 最終該頭指標無內容 void print struct node head 輸出鍊錶 coutq t2...

HYGGE 一元函式積分學

ccun 一開始覺得一元函式積分學很難,其實真的不是很難,就算是考研究生也不沒有太多偏題,所以大家首先建立自信,好好學習這一章節 考研非常重要的一章節 然後慢慢聽我道來。首先我們從不定積分開始講起。1.定積分的定義分為三個步驟 分割,做乘積,求和,求極限。2.定積分存在定理 1 設f x 在 a,b...