(一)目的
通过设计、编制、调试2~3个数值积分与微分算法的程序,加深对其数值计算方法及有关的基础理论知识的理解。
(二)要求
用编程语言实现复化梯形积分、Romberg积分的程序。
的自动控制误差算法求积分
Romberg积分算法求积分
复化梯形积分:
基本原理:
python实现:
import math
from scipy.misc import derivative
def func(x): # 函数
return math.pow(math.e,x)
def calculN(h,p): # 根据精度得到n
n = 2
tp = math.fabs(math.pow(h, 2) * (derivative(func, b) - derivative(func, a)))
tp /= n * n
while(tp > p):
tp *= n * n
n += 1
tp /= n * n
return n
def Tn(a, b, n, func): #复化梯形公式
sum=float(0.0)
result=float(0.0)
h = (b - a) / float(n)
for i in range(1,n):
sum=sum+func(a+i*h)
result=h/2*(func(a)+2*sum+func(b))
return result
a, b = 0, 1 # 区间值
p = 10e-5 # 精度
n = calculN(b - a,p)
print(Tn(a, b, n, func))
#令f(x)=e^x
#精度为10e-5
结果为:
f(x)=e上标x
复化梯形公式
输出解果:
积分区间为0到1 结果为1.718281828459045
E:\shuzhifenxishiyan\fuhuatixin\venv\Scripts\python.exe E:/shuzhifenxishiyan/fuhuatixin/main.py
1.718288830759191
Process finished with exit code 0
龙格积分:
基本原理:
python实现:
from sympy import *
import math
def func(x):
return math.pow(math.e,x)
truth =func(1)-func(0)
print(truth) #真值
def Tn(n,a,b):
h = (b-a)/n
result = 0
for i in range(n):
result += 1 / 2 * h * (func(a + i * h) + func(a + (i + 1) * h)) # 梯形积分算法
return result
def S(n,a,b):
I = Tn(2*n, a, b) + (Tn(2*n, a, b) - Tn(n, a, b)) / (4**1-1)
return I
def C(n,a,b):
C = S(2*n, a, b) + (S(2*n, a, b) - S(n, a, b)) / (4**2-1)
return C
n = 0 #步长,就是将(a,b)区间分为多少个块
a = 0
b = 1
while True:
n += 1
R = C(2*n, a, b) + (C(2*n, a, b) - C(n, a, b)) / (4**3-1)
error = abs(truth - R) / truth
if error <= 10 ** (-5):
print('R为:', R)
print('n为:', n)
break
龙格积分:
结果:
E:\shuzhifenxishiyan\Romberg\venv\Scripts\python.exe E:/shuzhifenxishiyan/Romberg/main.py
1.718281828459045 # 真值
R为: 1.7182818287945303
n为: 1
Process finished with exit code 0
结果如下: