線性化和牛頓法

2021-10-19 21:23:18 字數 3851 閱讀 1155

如何使用導數去估算特定的量. 例如, 假設想不借助計算器就得到的乙個較好估算. 我們知道比略大, 所以顯然可以說大約 比 3 多一點. 這沒問題, 但其實可以不費太多勁就做出乙個好得多的估算. 下面是具體做法.

先設我們想要估算的值, 因為不知道其確切 值.另一方面,我們知道確切是多少它就是由於已知當時的值, 可以繪出的函式影象, 並畫出一條通過點 (9,3) 的切線,如下圖所示

化簡可得也就是說,

現在, 只需將代人上式, 算得的值 :

因此, 我們得到結論:

這可比之前的 3 多一點要好得多! 事實上, 可以使用計算器算得約為 3.317 , 所以我們的近似值還是相當不錯的.

如果你想要估算某個量, 首先試著把它 寫成某個適當的函式的值. 在上述例子中,我們想要估算所以設函式並意識到我們感興趣的是的值. 接下來,我們選某個與很接近的數並使得容易計算. 在這個例子 中, 我們無法處理但容易計算因為 9 開根號很容易. 我們也可以選擇畢竟 25 開根號也很容易,但這就不如選 9 好, 因為 25 離 11 相當遠了. 再次, 已知函式和特殊值, 我們找出通過曲線上點的 切線. 這條切線的斜率為所以其方程為

如果設切線為則在上述方程兩邊同時加上得到

這個線性函式被稱為在處的線性化. 回想一下, 我們將把作為的近似. 所以有

並知道當很接近於時, 這個近似是非常好的! 事實上, 當實際上等於時, 這個近似是完美的! 此時上述方程的兩邊都為不過, 這並沒什麼用, 畢竟對我們已經知根知底了. 這樣, 現在有了對在接近於時的近似.

再來看一下剛才的一般方法. 我們看到

不妨定義這樣上述公式則變為

這時的情形可用下圖表示.

下面是線性化的另乙個有用應用. 假設現在要解乙個形為的方程,但 你死活都解不出來. 所以你退而求其次, 試著猜測該方程有乙個解, 並把它記為這時的情形可能如下圖所示.

從圖中可以看出,實際上並不等於零, 所以其實並不是該方程的解, 它 僅僅是解的乙個近似或估算. 可以把它視為近似的第一次嘗試, 所以在上圖中把它 標記為了「初始的近似"。牛頓法的基本思想是, 通過使用在處的線性化 來改善估算. (當然, 這意味著需要在處是可導的.)

這個線性化的軸截距記為並且顯而易見, 相對於真正的零點, 它是個比更好的近似. 這樣從乙個初始的猜測, 我們得到了乙個更好的結果. 但的值具體 是多少呢? 它就是線性化

的軸截距. 為了求軸截距, 設則我們有解 得有

由於剛才把軸截距記為於是有如下公式::

牛頓法假設是對方程的解的乙個近似. 如果令則在很多情況下,是個比更好的近似. 但有時牛頓法也會不起作用. 下面是 失效的四種不同情況.

(1)的值接近於0. 顯然, 如果

則不能為否則是沒有定義的. 在這種情況下, 在處的切線不可能 與軸相交, 因為它是水平的! 即使很接近但不等於牛頓法仍會給出乙個 很糟糕的結果. 如下圖所示的情形.

(2) 如果有不止乙個解,可能得到的不是你想要的那個解.例如在下圖中,如果你想估算左邊的根並且猜測從開始,那麼最終你估算的其實 是另乙個根

(3) 近似可能變得越來越糟.

例如, 如果方程唯一的解 是如果你嘗試對此使用牛頓法, 那麼怪 事就會出現. 你看, 除非從開始, 否則會得到

所以下乙個近似值總是你初始值的 -2 倍. 例如, 如果從開始,那麼下乙個近似值將是如果重複這個過程, 將得到等等. 結果是離正確值 0 越 來越遠. 如果遇到這類情況,牛頓法就無能為力了.

(4) 你可能陷入乙個迴圈而無法自拔. 有可能出現,你通過估算得到估 算卻又得到 a. 重複這個過程是沒有意義的,  這種情況可 能如下圖所示

如果從開始, 將算出由於為奇函式, 顯然再從 -1 開始 的計算會再次得到

from sympy import *

x = symbols('x')

#x0 = 0.5

x0 = float(input("輸入初始值:"))

# 用來儲存一步步的迭代過程

x_list = [x0]

i = 0

def f(x):

f = x * exp(x) - 1

return f

while true:   

#    如果x_0的導數為0即為極值點,牛頓法失效,退出迴圈

if diff(f(x),x).subs(x,x0) == 0:

print('極值點:',x0)

break

else:

#         diff()返回函式求導結果

x0 = x0 - f(x0)/diff(f(x),x).subs(x,x0)

i += 1

error = abs((x_list[-1] - x_list[-2]) / x_list[-1])

#        設定誤差範圍,小於則退出while迴圈

if error 

print(f'迭代第次後,誤差小於10^(-6),誤差為')

break

print(f'所求方程式的根為,\n迭代過程為')

輸入初始值:1.2

迭代第6次後,誤差小於10^(-6),誤差為9.90726474709430e-13

所求方程式的根為0.567143290409784,

迭代過程為[1.2, 0.791451914505546, 0.602629885740983, 0.568149269957630, 0.567144118692980, 0.567143290410346, 0.567143290409784]

視覺化
import matplotlib.pyplot as plt

%matplotlib inline

#設定繪圖風格

plt.style.use('ggplot')

#處理中文亂碼

plt.rcparams['font.sans-serif'] = ['microsoft yahei']

x_values = list(range(1,i+2))

y_values = x_list

#橫座標是迭代次數

#縱座標是誤差值

plt.plot(x_values,

y_values,

color = 'r', # 折線顏色

marker = '*', # 折線圖中新增圓點

markersize = 13, # 點的大小

)# 修改x軸和y軸標籤

plt.xlabel('迭代次數')

plt.ylabel('誤差值')

# 顯示圖形

反步法和反饋線性化

反步法和反饋線性化都是處理非線性系統中的工具,我感覺主要的思想都是消除非線性系統中的非線性項 反步法的方法 對每個控制量求誤差然後對誤差求導,在這個子系統內線性消除期望值導數這個值,然後再給乙個讓它全域性穩定的負項 反饋線性化 其實還沒有太搞懂,但是 非線性系統 書中給出的第乙個例子就是直接消除了控...

牛頓法和擬牛頓法

正在學習牛頓法,找到一篇非常詳細的部落格,特將目錄整理下來,方便今後回想和查詢。一 牛頓法 主要內容 1 泰勒展開式。比較基礎。2 牛頓法。從其應用的兩個方面來介紹 2.1 求方程的根 一階泰勒展開。2.2 解決最優化問題 二階泰勒展開。此部分又分為兩種情況 二維情況和高維情況。其中,二維情況比較常...

牛頓法和擬牛頓法

牛頓法和擬牛頓法是求解無約束最優化問題的常用方法,收斂速度快。牛頓法是迭代演算法,每一步需要求解目標函式的海塞矩陣 hesse matrix 的逆矩陣,計算複雜。擬牛頓法通過正定矩陣近似海塞矩陣的逆矩陣或海塞矩陣,計算速度快。牛頓法 考慮無約束優化問題 min f x 其中x 為目標函式的極小值點 ...