变步长梯形公式数值积分的Python程序

在这里插入图片描述
在这里插入图片描述

基本代码:

from sympy import *

def f(t):
    f = 2000*log(140000/(140000-2100*t))-9.8*t
    return f

x = symbols('x')
truth = integrate(f(x),(x,8,30)).evalf()
print(truth) #真值

def T(n,a,b):
    h = (b-a)/n
    tra_result = 0
    for i in range(n):
        tra_result += 1 / 2 * h * (f(a + i * h) + f(a + (i + 1) * h))  # 梯形积分算法
    return tra_result

n = 1 #步长,就是将(a,b)区间分为多少个块
a = 8
b = 30
#快速迭代
I = T(2*n,a,b) + (T(2*n,a,b) - T(n,a,b))/3
print(I)

结果:

11061.3355350810
11065.7163277322

迭代至特定误差

让我们看看变步长梯形公式比普通梯形公式快多少,相对误差小于10^-6,迭代停止。
普通梯形公式的效果见我之前的文章
梯形公式的数值积分的Python程序

from sympy import *

def f(t):
    f = 2000*log(140000/(140000-2100*t))-9.8*t
    return f

x = symbols('x')
truth = integrate(f(x),(x,8,30)).evalf()
print(truth) #真值

def T(n,a,b):
    h = (b-a)/n
    tra_result = 0
    for i in range(n):
        tra_result += 1 / 2 * h * (f(a + i * h) + f(a + (i + 1) * h))  # 梯形积分算法
    return tra_result

n = 0 #步长,就是将(a,b)区间分为多少个块
a = 8
b = 30
while True:
    n += 1
    #快速迭代
    I = T(2*n,a,b) + (T(2*n,a,b) - T(n,a,b))/3
    error = abs(truth-I)/truth
    if error <= 10**(-6):
        print('I为:',I)
        print('n为:',n)
        break

结果:

11061.3355350810
I为: 11061.3434684075
n为: 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值