【scipy 基礎】--積分和微分方程

来源:https://www.cnblogs.com/wang_yb/archive/2023/11/05/17810226.html
-Advertisement-
Play Games

對於手工計算來說,積分計算是非常困難的,對於一些簡單的函數,我們可以直接通過已知的積分公式來求解,但在更多的情況下,原函數並沒有簡單的表達式,因此確定積分的反函數變得非常困難。 另外,相對於微分運算來說,積分運算則具有更多的多樣性,包括不同的積分方法(如換元積分法、分部積分法等)和積分技巧,需要根據 ...


對於手工計算來說,積分計算是非常困難的,對於一些簡單的函數,我們可以直接通過已知的積分公式來求解,但在更多的情況下,原函數並沒有簡單的表達式,因此確定積分的反函數變得非常困難。

另外,相對於微分運算來說,積分運算則具有更多的多樣性,包括不同的積分方法(如換元積分法、分部積分法等)和積分技巧,需要根據具體的函數形式選擇合適的方法,這增加了積分運算的複雜性。
而微分運算有一條基本的規則,即導數運算具有線性性質,可以通過求導法則來簡化計算。

Scipy庫的積分子模塊為我們提供了便捷的積分和微分方程計算介面。
利用Scipy,進行數學或科學研究時,可以把更多的時間花在原理和推導上,計算過程交由Scipy去處理。

1. 主要功能

Scipy的積分模塊主要用於進行數學方程的求解和過程式控制制。
該模塊提供了一組函數,可以用於求解一元和多元函數的導數、積分、二階導數和偏導數等。
此外,該模塊還提供了一些用於過程式控制制和優化的函數。

此模塊的函數主要分為以下幾類:

  1. 針對函數對象的積分
  2. 針對固定樣本的積分
  3. 常微分方程

總之,scipy.integrate模塊提供了豐富的函數和演算法,用於解決各種數學問題和過程式控制制問題。
下麵通過一些示例來瞭解其使用方法。

2. 積分運算

2.1. 一重積分

比如計算曲線 \(y = e^{-x}\)\(-0.75 \leqslant x \leqslant 0.5\)範圍內的面積。
image.png

也就是計算積分:\(\int_{-0.75}^{0.5}e^{-x}dx\)

from scipy.integrate import quad
y = lambda x: np.exp(-x)
integral, integral_err = quad(y, -0.75, 0.5)

print("面積為:{}".format(integral))
# 運行結果
面積為:1.5104693569000414

2.2. 二重積分

所謂二重積分,就是積分變數有兩個,依次在兩個變數上積分得出最終的結果。
比如,對於函數:\(z = x^2 + y^2\),相當於如下的三維曲面
image.png
計算上面的曲面在 \(-2 \leqslant x \leqslant 2\)\(-1 \leqslant y \leqslant 1\)情況下,與XY平面所包圍的體積。
即:\(\int_{-2}^2\int_{-1}^1(x^2+y^2)dydx\)

from scipy.integrate import dblquad

integrand = lambda y, x: x**2 + y**2
integral, integral_error = dblquad(integrand, -2, 2, -1, 1)

print("體積為:{}".format(integral))
# 運行結果
體積為:13.333333333333334

這個示例中的曲面在X平面Y平面上是對稱的,計算二重積分時,先積分x,還是先積分y,結果是一樣的。
也就是:\(\int_{-2}^2\int_{-1}^1(x^2+y^2)dydx = \int_{-2}^2\int_{-1}^1(x^2+y^2)dxdy\)

其他的曲面不一定是對稱的,所以二重積分時一定要註意積分的順序

3. 常微分方程求解

常微分方程是一類以未知函數和其導數為主要研究對象的數學方程,適合描述不斷變化的場景。

3.1. 一元常微分方程

比如計算物體速度的時候,如果加速度恆定,根據牛頓運動定律,很容易就能計算出速度時間的關係。
但是若加速度也會不斷變化的話,如何確定速度和時間的關係呢?

比如假設加速度速度和時間變化的關係是: \(a = v+3t\)
因為加速度也可以表示為:\(a = \frac{dv}{dt}\),也就是速度對時間的微分,即:\(a = v'\)
這樣,就得到:\(a = \frac{dv}{dt} = v' = v+3t\),其中,\(v' = v+3t\)就是一個常微分方程
假設時間t0時,速度v也為0,則得到:\(v'-v-3t=0, v(0)=0\)

下麵利用Scipy來求解這個一元常微分方程

from scipy.integrate import odeint

# v是速度,t是時間
def dvdt(v, t):
    return v + 3*t

v0 = 0
t = np.linspace(0, 1, 100)

# 結果res是 N行1列的二維數組(因為是一元方程)
res = odeint(dvdt, v0, t)

# 轉置之後第一行就是各個時間點的速度
res_v = res.T[0]

# 繪製速度和時間的關係
plt.plot(t, res_v)
plt.show()

image.png
圖中曲線的斜率就是加速度,可以看出加速度是隨時間不斷變大的。

3.2. 二元常微分方程組

對於二元常微分方程組,同樣也可以用 scipy 來求解。
比如如下方程組:
\(\begin{align*} & y_1' = y_1 + y_2^2 - 5x \quad & y_1(0)=0\\ & y_2' = 2y_1 + y_2^3 + sin(x) \quad & y_2(0)=0 \end{align*}\)

求解方法:

from scipy.integrate import odeint

# 創建方程組
def dSdx(S, x):
    y1, y2 = S
    return [
        y1 + y2**2 - 5 * x,
        2 * y1 + y2**3 + np.sin(x),
    ]

# 方程組初始值
y1_0 = 0
y2_0 = 0
S_0 = (y1_0, y2_0)

x = np.linspace(0, 1, 100)
sol = odeint(dSdx, S_0, x)

y1_sol = sol.T[0]
y2_sol = sol.T[1]

# 分別繪製y1,y2和x的關係
plt.plot(x, y1_sol, label="y1")
plt.plot(x, y2_sol, label="y2")
plt.legend()
plt.show()

image.png

4. 總結

積分常微分方程算是應用非常廣,但手工計算非常麻煩的兩種數學工具,
在學校學習高等數學的時候應該沒少吃過這兩種計算的苦。

有了Scipy的幫助,則可以擺脫這類複雜計算帶來的痛苦,讓我們可以專註於創建解決問題的方程。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 創建名為spring_mvc_file的新module,過程參考9.1節和9.5節 11.1、文件下載 11.1.1、創建圖片目錄並放置圖片 11.1.2、頁面請求示例 <a th:href="@{/test/down}">下載圖片</a> 11.1.3、控制器方法示例 package online ...
  • Dart 3.0版本新增了很多新特性,包括有名的健全的空安全;同時針對類型(包括Mixin),除之前的abstract修飾符之外,還增加了base,final,interface和sealed等修飾符。今天我們來一起看下,這些類型修飾符,它們有哪些使用場景、使用時有哪些約束,和如何組合使用…… ...
  • Go類型嵌入介紹和使用類型嵌入模擬實現“繼承” 目錄Go類型嵌入介紹和使用類型嵌入模擬實現“繼承”一、獨立的自定義類型二、繼承三、類型嵌入3.1 什麼是類型嵌入四、介面類型的類型嵌入4.1 介面類型的類型嵌入介紹4.2 一個小案例五、結構體類型的類型嵌入5.1 結構體類型的類型嵌入介紹5.2 小案例 ...
  • Python 允許用戶輸入數據。這意味著我們可以向用戶詢問輸入。在 Python 3.6 中,使用 input() 方法來獲取用戶輸入。在 Python 2.7 中,使用 raw_input() 方法來獲取用戶輸入。以下示例要求用戶輸入用戶名,併在輸入用戶名後將其列印在屏幕上: Python 3.6 ...
  • OpenSSL 中的 `SSL` 加密是通過 `SSL/TLS` 協議來實現的。`SSL/TLS` 是一種安全通信協議,可以保障通信雙方之間的通信安全性和數據完整性。在 `SSL/TLS` 協議中,加密演算法是其中最核心的組成部分之一,SSL可以使用各類加密演算法進行密鑰協商,一般來說會使用`RSA`等... ...
  • 四大函數式介面(必備) 程式員:泛型、反射、註解、枚舉 新時代程式員:lambda表達式、鏈式編程、函數式介面、Stream流式計算 函數式介面:只有一個方法的介面 @FunctionalInterface public interface Runnable { public abstract vo ...
  • 推薦一個分散式圖資料庫Nebula Graph,萬億級數據,毫秒級延時 什麼是Nebula Graph Nebula Graph 是一款開源的、分散式的、易擴展的原生圖資料庫,能夠承載包含數千億個點和數萬億條邊的超大規模數據集,並且提供毫秒級查詢 什麼是圖資料庫 圖資料庫是專門存儲龐大的圖形網路並從 ...
  • 高精度的本質是將數字以字元串的形式讀入,然後將每一位分別存放入`int`數組中,通過模擬每一位的運算過程,來實現最終的運算效果。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...