首页 > 解决方案 > python中的梯形规则

问题描述

我正在尝试使用梯形规则对 n = 2^p 其中 p= [1,2...20] 的范围内的积分进行评估,以产生不同的积分值。我试图实现一个for循环来定义n和h但是我得到一个TypeError:'list'对象不能被解释为整数。有没有办法调整我的代码以产生我想要的结果?

import math as math
#define limits of our interval
a=0
b=2
#define our n value
n_vals=[2**p for p in range (0,21)]
#define our h value
h_vals=[(b-a)/n for n in n_vals]
#define our function f(x) here
f= lambda x: math.exp(x)+x**2

#we calculate the trapezium method by breaking it into smaller parts
#We use for loop calculating integral of f(x) using trapezium rule
#Combine parts to find integral
S = 0.5*(f(a) + f(b))     
for k in range(1,n_vals):
    S += f(a + k*h_vals) 
Integral = h_vals*S

print("Integral = %f" % Integral)

标签: pythonloopsfor-loop

解决方案


在这里你有一些问题,首先你需要迭代一个索引或所需的 nval 来计算 de 积分,每次我会给你一个解决方案的建议,但我认为你的方法定义不好,因为这不是你计算积分的方式

import math as math
#define limits of our interval
a=0
b=2
#define our n value
n_vals=[2**p for p in range (0,21)]
#define our h value
h_vals=[(b-a)/n for n in n_vals]
#define our function f(x) here
f= lambda x: math.exp(x)+x**2

#we calculate the trapezium method by breaking it into smaller parts
#We use for loop calculating integral of f(x) using trapezium rule
#Combine parts to find integral
for n,h in zip(n_vals,h_vals): #here n and h are the actual value for every iteration
    S = 0.5*(f(a) + f(b))     
    for k in range(1,n):
        S += f(a + k*h) #here you have a problem with definition of trapezoidal integral
    Integral = h*S
    
    print(f"Integral = {Integral}")

另一个建议是创建一个函数来计算一个区间的积分,然后调用该函数进行累积:

def trap(f,a,b):
    return ( f(a) + f(b) ) / 2 * (b-a)

import math as math
#define limits of our interval
a=0
b=2
#define our n value
n_vals=[2**p for p in range (0,21)]
#define our h value
h_vals=[(b-a)/n for n in n_vals]
#define our function f(x) here
f= lambda x: math.exp(x)+x**2

现在您的集成代码:

for n,h in zip(n_vals,h_vals):
    S = 0
    for k in range(n):
        thisA = a+k*h
        thisB = a+(k+1)*h
        S += trap(f,thisA,thisB)
    print(f"Integral for {n} partitions = {S}")

推荐阅读