簡體   English   中英

Simpson規則與python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM