網站首頁 編程語言 正文
1. 栗子
為了加深大家的印象,首先我們來看個例子:
圖示如下:
2. 矩形計算面積
我們知道,在數學中,積分運算表示上述曲線和x軸圍成的封閉區域的面積,為此,我們在數值預算中,來近似計算上述區域的面積,最直觀的想法就是拆成一個個小的矩形來計算對應的面積。
2.1 左側邊長計算面積
為了計算每個小矩形的面積,設計到邊長高的選擇,這里我么以左側函數取值作為對應矩形的高來計算相應的小矩形的面積,圖示如下:
對應的代碼如下:
import numpy as np x = np.linspace(0, 3, 1001) f = lambda x: x**3 - 4*x**2 + 4*x + 2 a = 0.5 b = 2.5 Ax = np.linspace(a, b, 101) Ay = f(Ax) def defInt_left(f, a, b, N): ? ? # left-hand point ? ? result = 0; FX = []; Xn = [] ? ? dx = abs(b - a)/N ? ? while a < b: ? ? ? ? result += f(a)*dx ? ? ? ? FX += [f(a)] ? ? ? ? Xn += [a] ? ? ? ? a += dx ? ? return result, FX, Xn, dx N = 4 I_left, FX, Xn, dx = defInt_left(f, a, b, N) print(I_left)
上述代碼中,我們將橫坐標拆分為4小份,也就是拆分成4個小矩形,然后使用函數左側的點坐位小矩形的高,上述代碼的運行結果如下:
5.25
2.2 右側邊長計算面積
這里和上述原理類似,只不過每個小矩形的高采用右側邊長函數取值來近似計算,圖例如下:
樣例代碼如下:
def defInt_right(f, a, b, N): ? ? # right-hand point ? ? result = 0; FX = []; Xn = [] ? ? dx = abs(b - a)/N ? ? while a < b: ? ? ? ? result += f(a + dx)*dx ? ? ? ? FX += [f(a + dx)] ? ? ? ? Xn += [a] ? ? ? ? a += dx ? ? return result, FX, Xn, dx N = 4 I_right, FX, Xn, dx = defInt_right(f, a, b, N) print(I_right)
運行結果如下:
5.0
2.3 中值邊長計算面積
看了上述兩種近似計算方式,有同學就說有取左側點算出來面積大的,有取右側點算出來面積小的,那干脆折中一下,我們來以中值坐位矩形的高來計算對應的面積。圖例如下:
代碼實現如下:
def defInt_middle(f, a, b, N): ? ? # middle point ? ? result = 0; FX = []; Xn = [] ? ? dx = abs(b - a)/N ? ? while a < b: ? ? ? ? result += f(a + dx/2)*dx ? ? ? ? FX += [f(a + dx/2)] ? ? ? ? Xn += [a] ? ? ? ? a += dx ? ? return result, FX, Xn, dx N = 4 I_mid, FX, Xn, dx = defInt_middle(f, a, b, N) print(I_mid)
運行結果如下:
5.0625
3. 梯形計算面積
讀到這里的同學可能會思考,既然可以將封閉區域劃分成一個個的小矩形,那當然也可以將其劃分成梯形來近似計算相應的面積,圖例如下:
樣例代碼如下:
def defInt_trapezoid(f, a, b, N): ? ? # trapezoidal rule ? ? result = 0; FXa, FXb = [], []; Xn = [] ? ? dx = abs(b - a)/N ? ? while a < b: ? ? ? ? result += (f(a) + f(a + dx))*dx/2 ? ? ? ? FXa += [f(a)]; FXb += [f(a + dx)] ? ? ? ? Xn += [a] ? ? ? ? a += dx ? ? return result, FXa, FXb, Xn, dx N = 4 I_trap, FXa, FXb, Xn, dx = defInt_trapezoid(f, a, b, N) print(I_trap)
運行結果如下:
5.125
4. 真值比對
最后,我們來針對不同的N來講封閉區域劃分成對應的小份,分別針對性的計算上述四種方式的積分值,樣例代碼如下:
Nx = range(1, 11) I1, I2, I3, I4 = [], [], [], [] for Ni in Nx: ? ? i1, *_ = defInt_left(f, a, b, Ni); I1 += [i1]; ? ? i2, *_ = defInt_right(f, a, b, Ni); I2 += [i2]; ? ? i3, *_ = defInt_middle(f, a, b, Ni); I3 += [i3]; ? ? i4, *_ = defInt_trapezoid(f, a, b, Ni); I4 += [i4];
最后將其與真值進行對比,如下:
可以看出,隨著劃分區域的增多,采用梯形計算面積方式最逼近真值。
5. 總結
本文重點介紹了使用不同面積劃分方法來近似計算積分取值的原理和相應的代碼實現,其中采用梯形計算面積的方式隨著劃分子區域數目的增加最接近真值,推薦大家使用。
原文鏈接:https://blog.csdn.net/sgzqc/article/details/122817967
相關推薦
- 2022-01-20 docker是干什么的,docker常用命令每日一練
- 2022-09-23 Matlab幾個常用的繪圖顏色搭配推薦_相關技巧
- 2023-03-30 C/C++經典楊輝三角問題解決方案_C 語言
- 2022-06-02 利用Python繪畫雙擺操作分享_python
- 2022-05-27 TensorFlow和Numpy矩陣操作中axis理解及axis=-1的解釋_python
- 2022-08-20 C#?Chart折線圖使用鼠標滾輪放大、縮小和平移曲線方式_C#教程
- 2022-06-12 C語言?深入探究動態規劃之區間DP_C 語言
- 2022-07-12 微信小程序布局框架初步了解(彈性容器)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支