四階龍格庫塔法的基本思想_數值常微分方程-歐拉法與龍格-庫塔法

5f7d210d7aba89911d413d7a6321380a.png

大三時候在跳蚤市場閑逛,從一位數學院的學長那里買了一些閑書,最近翻出來剛好有李榮華、劉播老師的《微分方程數值解法》和王仁宏老師的《數值逼近》,結合周善貴老師的《計算物理》課程,整理一下筆記。

本文整理常微分方程數值求解的歐拉法與龍格-庫塔法。

一般地,動力學系統的時間演化可以用常微分方程的初值問題來描述,例如設一維簡諧運動的回復力:

,有則運動方程:
。令
,可以將二階微分方程轉化為一階微分方程組:

因此本文主要整理一階常微分方程初值問題的數值解法。

一階常微分方程初值問題

在區域
上連續,對于一個給定的常微分方程
及初值
,求解
。為了保證解
存在、唯一且連續依賴初值
,要求
滿足Lipschitz條件:

存在常數L,使得

對所有
成立。

假設

總滿足上述條件。常用的近似解法有級數解法等近似解析方法,以及下文整理的數值方法:歐拉法與龍格-庫塔法。

歐拉法

將區間

作N等分,每一小區間長度
稱為步長,
稱為節點。根據初值
,代入微分方程可直接解出
的導數值

推導

1、根據泰勒展開式:

略去二階小量,得:

以此類推,得到遞推公式:

2、數值積分推導

可得:
,使用左矩形積分得:

以此類推,可得到:

為了提高精度,可以使用梯形積分代替矩形積分,即:

以此類推,得到改進的歐拉法:

Python計算實例

為例,其精確解為
,使用歐拉法求解的Python代碼如下:
import math
from matplotlib import pyplot as pltt_0 = 0
y_0 = 1
tau = 0.1
i = 1
solve = []
Euler = []
t = []
while i < 100:if i == 1:y_n = y_0t_n = t_0Euler.append(y_n)solve.append(math.exp(t_n))t.append(t_n)func = y_ny_n = y_n + tau * funct_n = t_n + taui += 1plt.plot(t, Euler, c='green', label=' Euler method')
plt.plot(t, solve, c='red', label=' accuracy')
plt.fill_between(t, solve, Euler, facecolor='blue', alpha=0.2)
plt.title('Euler method', fontsize=19)
plt.xlabel('t', fontsize=19)
plt.ylabel('y', fontsize=19)
plt.legend()
plt.show()

cda8ba226be41aa65c6090c27e6287bc.png

作圖可以看到,當迭代步數較多后,歐拉法的結果逐漸落后于精確指數解的增長速度。下面分析歐拉法的誤差來源。

中,略去了高階小量
,因此在每一步的遞推中,都有局部截斷誤差
,其階為

在計算中,我們更關心精確解和數值解之間的誤差

,稱為整體誤差,其滿足

根據Lipschitz條件,可得:

,可得:

局部截斷誤差

的二階量,設
,得:
,整體誤差是
的一階量。同理可得,改進的歐拉法局部截斷誤差
的三階量
,整體誤差是
的二階量

穩定性分析

如果計算的初值不能精確給定,例如存在測量、舍入誤差等,在計算過程中,每一步傳遞的誤差連續依賴于初始誤差,則稱算法穩定,否則該算法不穩定。

對于不同的初值

,有

兩式相減,得:

根據Lipschitz條件,可得:

連續依賴于初始誤差,歐拉法穩定。同理,改進的歐拉法也穩定。

龍格-庫塔法

龍格庫塔法的主要思想:在

點的附近選取一些特定的點,然后把這些點的函數值進行線性組合,使用組合值代替泰勒展開中
點的導數值。

泰勒展開:

,根據多元函數求導法則有:

以此類推,可以得到:

同時,我們可以寫出泰勒展開的形式解:

其中:

通項為:

基本思路是,利用當前點的函數值

可以計算出
,然后引入參數
和步長
可以計算出
,之后使用
和步長
計算
,以此類推,直到

現在把

展開:

代入得:

代入
可得:

與泰勒展開式

相比較,可知:

2個方程有3個未知數,因此有無窮多個解,可采用

,則:

,可以改寫為:

此即為二階龍格-庫塔法。

與上一節的歐拉法公式對比:

,因此二階龍格-庫塔法取參數
時,即為改進的歐拉法。

Python計算實例

仍以

為例,其精確解為
,使用二階龍格-庫塔法求解的Python代碼如下:
import math
from matplotlib import pyplot as pltt_0 = 0
y_0 = 1
z_0 = 1
tau = 0.1
i = 1
j = 1
solve = []
Euler = []
R_K = []
t = []
while i < 100:if i == 1:y_n = y_0t_n = t_0R_K.append(y_n)solve.append(math.exp(t_n))t.append(t_n)func_n = y_nfunc_m = y_n + tau * func_ny_n = y_n + 0.5 * tau * (func_n + func_m)t_n = t_n + taui += 1
t = []
while j < 100:if j == 1:z_n = z_0t_n = t_0Euler.append(z_n)t.append(t_n)func = z_nz_n = z_n + tau * funct_n = t_n + tauj += 1plt.scatter(t, R_K, marker='^', c='blue', s=70, label=' R-K method')
plt.plot(t, Euler, c='green', label=' Euler method')
plt.plot(t, solve, c='red', label=' accuracy')
plt.fill_between(t, solve, Euler, facecolor='yellow', alpha=0.2)
plt.title('Euler method & R-K method', fontsize=19)
plt.xlabel('t', fontsize=19)
plt.ylabel('y', fontsize=19)
plt.legend()
plt.show()

f17a23f6060521c23508b39b23f1537e.png

黃色部分表示數值解和精確解的偏離,可以看到,二階龍格-庫塔法(改進的歐拉法)精確度得到了很大的提升。

二階龍格-庫塔法中,泰勒展開到了

階,通過與泰勒展開系數進行對比,可以得到含3個未知數的2個方程。依次類推,如果泰勒展開到了
階,對比
可以得到
階龍格-庫塔法。常用經典四階龍格-庫塔法:

Reference:

1、周善貴,《計算物理》課程講義

2、李榮華,劉播,《微分方程數值解法》

3、王仁宏,《數值逼近》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383043.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OC中的類

OC中類 OC中類的定義 在Xcode中創建一個新的類&#xff0c;會自動給你生成兩個文件一個是.h另外一個是.m文件,你新創建的類默認繼承了NSObject類&#xff0c;因為有一些方法都需要基類中的方法。比如alloc分配內存 OC中用來描述類的使用interface 類名&#xff1a;父類來進行…

裝配組件_基于Haption力反饋系統的交互式裝配仿真

在一個新工業產品的設計過程中&#xff0c;裝配規劃是非常重要的任務。如果規劃不好將造成很大的資金浪費&#xff0c;致使組件不能正確地集成。例如典型問題&#xff1a;移動一個組件到指定位置但空間不足&#xff1b;使用工具夠不到螺絲&#xff1b;操作者沒有足夠的視域以保…

OC中的基本容器和基本數據類型

基本數據類型 NSRange 是一個結構體&#xff0c;里面有兩個數據成員數據類型都為NSUInteger 就是c語言中的無符號整形&#xff0c;一個是location表示集合的起始地址&#xff0c;另外一個變量是length表示從起始地址開始算多少個元素。 NSRange的三種創建方式 //1.NSRange r…

python程序開發總結_python開發總結

兩本不錯的書&#xff1a;《Python參考手冊》&#xff1a;對Python各個標準模塊&#xff0c;特性介紹的比較詳細。《Python核心編程》&#xff1a;介紹的比較深入&#xff0c;關鍵是&#xff0c;對Python很多高級特性都有介紹。一個開源代碼&#xff1a;openstack&#xff0c;關…

Centos7通過yum安裝jsoncpp庫

拒絕下載軟件包 一堆網上下載安裝包&#xff0c;為了編譯暗轉包又下載插件&#xff0c;是真麻煩 看看有沒有jsoncpp的相關庫 $ yum list | grep jsoncpp-devel然后執行這兩句&#xff0c;就完了 yum install jsoncpp.x86_64 yum install jsoncpp.devel.x86-64多簡單

作為唯一索引_Mysql什么情況下不走索引?

本文基于Mysql5.7版本和InnoDB存儲引擎。1、InnoDB索引組織表在InnoDB引擎中&#xff0c;表都是按照主鍵順序組織存放的&#xff0c;這種存放方式的表稱為索引組織表。InnoDB存儲引擎中的表&#xff0c;都有主鍵&#xff0c;如果沒有顯式聲明主鍵&#xff0c;則采取以下措施&am…

python捕獲全局異常統一管理_python中如何用sys.excepthook來對全局異常進行捕獲、顯示及輸出到error日志中...

使用sys.excepthook函數進行全局異常的獲取。1. 使用MessageDialog實現異常顯示&#xff1b;2. 使用logger把捕獲的異常信息輸出到日志中&#xff1b;步驟&#xff1a;定義異常處理函數&#xff0c; 并使用該函來替換掉系統的內置處理函數&#xff1b;對于threading.py的異常捕…

r語言系統計算上是奇異的_R語言實現并行計算

Python作為多線程的編程語言在并行方面相對于R語言有很大的優勢&#xff0c;然而作為占據統計分析一席之地的R語言自然不能沒有并行計算的助力。那么我們來看下在R語言中有哪些并行的包&#xff1a;隱式并行&#xff1a;OpenBLAS&#xff0c;Intel MKL&#xff0c;NVIDIA cuBLA…

cansina 目錄_dirmap - 一個高級web目錄、文件掃描工具-華盟網

Dirmap一個高級web目錄掃描工具&#xff0c;功能將會強于DirBuster、Dirsearch、cansina、御劍需求分析經過大量調研&#xff0c;總結一個優秀的web目錄掃描工具至少具備以下功能&#xff1a;并發引擎能使用字典能純爆破能爬取頁面動態生成字典能fuzz掃描自定義請求自定義響應結…

唯有自己變得強大_物競天擇,適者生存,唯有強大自己,方能百毒不侵

物競天擇&#xff0c;適者生存&#xff0c;這是亙古不變的道理。面對生活中的困難&#xff0c;人生路上的挫折&#xff0c;我們只有足夠堅強&#xff0c;足夠勇敢&#xff0c;足夠強大&#xff0c;才能戰勝這一切。人活著要明白&#xff0c;你所有的負面&#xff0c;都源于你的…

樹莓派c語言運行_樹莓派完成簡單的編程(四)

在上一篇文章中&#xff0c;我們學習了Vi文本編輯器&#xff0c;那么用它可以實現什么功能呢&#xff1f;樹莓派python以及c語言編程這里我選擇了最簡單和很流行的兩種編程語言&#xff1a;C語言和Python。實現最簡單的功能&#xff0c;輸出hello world。Python編程簡介Python是…

mysql 讀寫引擎_揭秘MySQL存儲引擎spider

轉自&#xff1a;興趣部落?buluo.qq.com導讀&#xff1a; Spider是為MySQL/MariaDB開發的一個特殊引擎&#xff0c;具有內嵌分片功能。現在它已經被集成到MariaDB10.0及以上版本中&#xff0c;作為MariaDB的一個新的主要性。Spider的主要功能是將數據分散到多個后端節點&#…

python中的與或非_「Python基礎」 While 循環語句

Python 編程中 while 語句用于循環執行程序&#xff0c;即在某條件下&#xff0c;循環執行某段程序&#xff0c;以處理需要重復處理的相同任務。其基本形式為&#xff1a;while 判斷條件&#xff1a;執行語句……執行語句可以是單個語句或語句塊。判斷條件可以是任何表達式&…

lamp mysql大小限制_LAMP 調優之:MySQL 服務器調優

關于 MySQL 調優有 3 種方法可以加快 MySQL 服務器的運行速度&#xff0c;效率從低到高依次為&#xff1a;替換有問題的硬件。對 MySQL 進程的設置進行調優。對查詢進行優化。替換有問題的硬件通常是我們的第一考慮&#xff0c;主要原因是數據庫會占用大量資源。不過這種解決方…

go定時器 每天重復_Go語言學習基礎-定時器、計時器

Timer計時器如果希望在將來的某個時間點執行Go代碼&#xff0c;或者在某個時間間隔重復執行Go代碼&#xff0c;使用Go內置的timer和ticker功能。先看定時器timer&#xff0c;然后再看計時器ticker。定時器代表未來的單個事件。告訴定時器需要等待多長時間&#xff0c;它返回一個…

html類名定義規則_HTML入門筆記1

HTML 是誰發明的?Tim Berners-LeeHTML起手式&#xff1a;HTML起手式 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

mysql主從虛擬機_虛擬機centos7Mysql實現主從配置

環境搭建在虛擬機上和創建兩個一模一樣的centos7系統&#xff0c;并安裝相同版本的mysql(可以先創建一個再克隆)在master上操作登錄mysqlmysql -u root -p使用mysqluse mysql;創建用戶CREATE USER lystbc1% IDENTIFIED BY Lys135426tbc;給用戶授權GRANT REPLICATION SLAVE ON *…

怎樣檢測mysql5.5安裝成功_64位wiN7系統中裝配MySQL5.5.17(測試安裝成功哦!)

64位wiN7系統中安裝mysql5.5.17(測試安裝成功哦&#xff01;&#xff01;~~)下載地址&#xff1a;[url] http://www.mysql.com/downloads/mysql/[/url]下載的話需要登錄,你只需按照要求注冊一個賬號,然后下載即可.我下載的是mysql-5.5.17-winx64.msi版本.安裝步驟:Step 1. Mysq…

xcode 創建模擬器_Xcode編譯WebKit

下載WebKit源碼1)進入https://webkit.org/2)點擊頁面的 Get Started 進入新頁面&#xff0c;如下圖所示3)點擊 Getting the code 進入新頁面&#xff0c;如下圖所示4)在源碼下載頁面&#xff0c;有多種下載方式&#xff0c;包括直接下載代碼zip包&#xff0c;通過SVN下載&#…

mysql iscsi_iscsi共享存儲的簡單配置和應用

1、環境介紹SCSI(Small Computer System Interface)是塊數據傳輸協議&#xff0c;在存儲行業廣泛應用&#xff0c;是存儲設備最基本的標準協議。從根本上說&#xff0c;iSCSI協議是一種利用IP網絡來傳輸潛伏時間短的SCSI數據塊的方法&#xff0c;ISCSI使用以太網協議傳送SCSI命…