[英]Simpson Rule with python
對於我的數字課程,我必須使用simpsons規則來近似下面列出的三個不同函數的積分....我的代碼運行但它沒有給我正確的近似值,我不知道為什么....
import math
def F(x):
c = x * math.log(x)
return c
def G(x):
g = 2 / (x**2 + 4)
return g
def H(x):
h = x**2 * math.cos(x)
return h
def simpsonRule(f, a, b, n):
h = (b-a)/n
k = 0
z = 0
for i in range(1, (n//2) - 1):
k += 2*f(a+(2*i*h))
for i in range(1, (n//2)):
z += 4*f(a+((2*i)-1)*h)
return (h*(f(a) + k + z + f(b))) / 3
AA = simpsonRule(F, 1, 2, 4)
CC = simpsonRule(G, 0, 2, 6)
DD = simpsonRule(H, 0, math.pi, 6)
print(AA)
print(CC)
print(DD)
在使用Python 2.x的情況下,問題可能是由變量類型引起的。 在expersion h = (ba)/n
右側的所有變量都是int
,因此解釋器假定h
必須是int
。 問題可以通過類型轉換來解決
a = float(a)
b = float(b)
在該表達式之前插入。
上面提到的行為是特定於Python 2的,並且已經在Python 3中修復,假設在這種情況下為float
。 請參閱此處使用Python中的類型轉換的更多示例。
沒有轉換的輸出:
0.0
0
-1.36541969235
帶轉換的輸出:
0.208501009808
0.577327327327
-1.36541969235
我認為問題是你的range()
上限range()
調用是由1.從來沒有達到上限所以它應該超出你想要的一個。 我已經包含了一個額外的測試用例sin(x)
,我知道正確答案(~1):
import math
def E(x):
return math.sin(x)
def F(x):
return x * math.log(x)
def G(x):
return 2 / (x**2 + 4)
def H(x):
return x**2 * math.cos(x)
def simpsonRule(f, a, b, n):
h = (b - a) / n
k = 0
z = 0
for i in range(1, n // 2):
k += 2 * f(a + 2 * i * h)
for i in range(1, n // 2 + 1):
z += 4 * f(a + (2 * i - 1) * h)
return h * (f(a) + k + z + f(b)) / 3.0
AA = simpsonRule(F, 1, 2, 4)
CC = simpsonRule(G, 0, 2, 6)
DD = simpsonRule(H, 0, math.pi, 6)
EE = simpsonRule(E, 0, math.pi / 2, 100)
print(AA)
print(CC)
print(DD)
print(EE)
OUTPUT
> python3 test.py
0.6363098297969493
0.7853979452340107
-6.274868388453119
1.0000000003382359
>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.