我試圖計算這兩個運算式的絕對值的總和,但我有點困惑,因為總和應該是相同的,對吧?
考慮積分:
abs(sin(x))dx 的積分
abs(cos(x))dx 的積分
很容易看出,它們下面的面積是相同的,實際上兩個積分都回傳 4。
我撰寫了一個簡單的腳本來均勻地采樣這些函式并將所有采樣值加在一起。撇開比例不談,兩個運算式應該產生相同的結果,但它們不會。這是代碼:
import numpy as np
angles = np.linspace(0, 2*np.pi, 1000)
line1, line2= [], []
for n in angles:
line1.append(np.abs(np.cos(n)))
line2.append(np.abs(np.sin(n)))
print(sum(line1), sum(line2))
結果如下:
636.983414656738 635.9826284722284
總和幾乎正好相差 1。我知道它們不是 4,因為缺少一些常數因子,但重點是,值應該相同。我在這里完全遺漏了什么還是這是一個錯誤?
uj5u.com熱心網友回復:
考慮將樣本減少到 3 個的極端情況:
In [93]: angles = np.linspace(0, 2*np.pi, 3)
In [94]: angles
Out[94]: array([0. , 3.14159265, 6.28318531])
In [95]: np.cos(angles)
Out[95]: array([ 1., -1., 1.])
In [96]: np.sin(angles)
Out[96]: array([ 0.0000000e 00, 1.2246468e-16, -2.4492936e-16])
對于更大的樣本,額外1的 for仍然存在。cos
In [97]: angles = np.linspace(0, 2*np.pi, 1001)
In [98]: np.sum(np.abs(np.cos(angles)))
Out[98]: 637.6176779711009
In [99]: np.sum(np.abs(np.sin(angles)))
Out[99]: 636.6176779711009
但是如果我們告訴它跳過2*np.pi終點,值匹配:
In [100]: angles = np.linspace(0, 2*np.pi, 1001, endpoint=False)
In [101]: np.sum(np.abs(np.cos(angles)))
Out[101]: 637.256653677874
In [102]: np.sum(np.abs(np.sin(angles)))
Out[102]: 637.2558690641631
uj5u.com熱心網友回復:
因為您的積分方法,一個簡單的“總和”,具有在這種情況下不能忽略的系統誤差。
現在試試這個:
import numpy as np
angles = np.linspace(0, 2*np.pi, 1000)
line1, line2= [], []
for n in angles:
line1.append(np.abs(np.cos(n)))
line2.append(np.abs(np.sin(n)))
i1=np.trapz(line1,angles)
i2=np.trapz(line2,angles)
print(i1,i2,abs(2*(i1-i2)/(i1 i2)))
結果是:
4.000001648229352 3.9999967035417043 1.2361721666315376e-06
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516076.html
下一篇:將多索引轉換為3dnumpy陣列
