程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python計算折線與坐標軸的面積(正負抵消)

編輯:Python

計算下圖中折線與y軸圍成的面積,藍色為負,黃色為正,正負抵消後的和。

  • 采用梯形面積和累加,
  • 由於業務需要,本例以130為邊界,分別求50-130之間的面積,以及130-210之間的面積>

本例只給 ( 50 , x 1 ) , ( 70 , x 2 ) , ( 90 , x 3 ) , ( 130 , x 4 ) , ( 190 , x 5 ) , ( 230 , x 6 ) (50, x_1),(70, x_2),(90, x_3),(130, x_4),(190, x_5),(230, x_6) (50,x1​),(70,x2​),(90,x3​),(130,x4​),(190,x5​),(230,x6​),這 6 個點, 其中 x 1 = 0 x_1=0 x1​=0

  • 區域1面積: 是一個三角形,為 底*高/2 即為: x 2 × ( 70 − 50 ) ÷ 2 x_2\times{(70-50)\div{2}} x2​×(70−50)÷2
  • 區域2面積:梯形面積,上底+下底*高/2,即為: ( x 1 + x 2 ) × ( 90 − 70 ) ÷ 2 (x_1+x_2)\times{(90-70)\div{2}} (x1​+x2​)×(90−70)÷2
  • 區域3面積:可以直接上底+下底*高/2,(已經過驗證),分析過程,藍色三角形和黃色三角形是相似三角形,。$$
    • 首先判斷 a = ∣ x 2 ∣ − ∣ x 3 ∣ a=\mid x_2 \mid-\mid{x_3}\mid a=∣x2​∣−∣x3​∣的大小,若 a > 0 a>0 a>0,而且1和2面積正負抵消,剩余就是求3的面積,即梯形3的面積則面積為 ( x 2 + ∣ x 3 ∣ ) × (x_2+\mid x_3\mid)\times{} (x2​+∣x3​∣)×
  • 區域4,類似1區域3
  • 區域5,類似於區域3

復雜寫法:

aera['down'] = df_10min_down.apply(lambda x: sum( \
[0.5*(abs(i[0][0])/(abs(i[0][0])+abs(i[0][1])))*i[1]*i[0][0]*(1-(i[0][1]/i[0][0])**2) if i[0][0]*i[0][1] < 0 else 0.5*(i[0][0]+i[0][1])*i[1] \
for i in zip(zip(x[:-1], x[1:]), height[:6])]), axis=1)
aera['up'] = df_10min_up.apply(lambda x: sum( \
[0.5*(abs(i[0][0])/(abs(i[0][0])+abs(i[0][1])))*i[1]*i[0][0]*(1-(i[0][1]/i[0][0])**2) if i[0][0]*i[0][1] < 0 else 0.5*(i[0][0]+i[0][1])*i[1] \
for i in zip(zip(x[:-1], x[1:]), height[6:])]), axis=1)

簡化寫法(推薦)

aera['down'] = df_10min_down.apply(lambda x: sum([0.5*(i[0][0]+i[0][1])*i[1] for i in zip(zip(x[:-1], x[1:]), height[:6])]), axis=1)
aera['up'] = df_10min_up.apply(lambda x: sum([0.5*(i[0][0]+i[0][1])*i[1] for i in zip(zip(x[:-1], x[1:]), height[6:])]), axis=1)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved