原文链接:https://www.cnblogs.com/aksoam/p/18279394
更多精彩,关注博客园主页,不断学习!不断进步!
我的主页
csdn很少看私信,有事请b站私信
博客园主页-发文字笔记-常用
有限元鹰的主页 内容:
- ABAQUS数值模拟相关
- Python科学计算
- 开源框架,编程学习笔记
哔哩哔哩主页-发视频-常用
FE-有限元鹰的个人空间 内容:
- 模拟案例
- 网格划分
- 游戏视频,及其他搬运视频
文章目录
- 我的主页
- 博客园主页-发文字笔记-常用
- 哔哩哔哩主页-发视频-常用
- 5. 高斯公式(Gauss formula)
- 5.1 常用的高斯型公式
- 高斯 – 勒让德公式
- 高斯 – 切比雪夫公式
- 高斯 – 拉盖尔公式
- 高斯 – 埃尔米特 (Gauss-Hermite) 公式
- 5.2 高斯积分的应用
5. 高斯公式(Gauss formula)
考虑带权函数的求积公式:
I [ f ] = ∫ a b ρ ( x ) f ( x ) d x ≈ ∑ i = 0 n ω i f ( x i ) (7) I[f]=\int_a^b\rho(x)f(x)\mathrm{d}x\approx\sum_{i=0}^n\omega_if(x_i)\tag{7} I[f]=∫abρ(x)f(x)dx≈i=0∑nωif(xi)(7)
其中函数 ρ ( x ) > 0 ρ(x) > 0 ρ(x)>0 为已知函数 , 称为权函数.
定义:若对于节点 x i x_i xi ∈ [a,b] 及求积系数 ω i \omega_i ωi , 求积公式(7)的代数精度为 2n+1, 则称节点 x i x_i xi 为高斯点 , ω i \omega_i ωi 为高斯系数 , 相应的求积公式 (7) 称为带权的高斯公式
高斯公式可看成是 f(x) 用高斯点上的n次插值多项式代替所得积分值 . 下面给出了确定高斯点的一种求解方法
定理5.5.2 x i x_i xi (i = 0,1,··· ,n) 是求积公式 (7) 的高斯点的充分必要条件是 : 多项式 Π ( x ) = ∏ i = 0 n ( x − x i ) \Pi(x)=\prod_{i=0}^n(x-x_i) Π(x)=∏i=0n(x−xi) 与任意次数不超过 n 的多项式 q(x) 关于权函数 ρ(x) 正交:
∫ a b ρ ( x ) Π ( x ) q ( x ) d x = 0. \int_a^b\rho(x)\Pi(x)q(x)\mathrm{d}x=0. ∫abρ(x)Π(x)q(x)dx=0.
5.1 常用的高斯型公式
I [ f ] = ∫ a b ρ ( x ) f ( x ) d x ≈ ∑ i = 0 n ω i f ( x i ) (7) I[f]=\int_a^b\rho(x)f(x)\mathrm{d}x\approx\sum_{i=0}^n\omega_if(x_i)\tag{7} I[f]=∫abρ(x)f(x)dx≈i=0∑nωif(xi)(7)
高斯 – 勒让德公式
令 ρ ( x ) ≡ 1 , [ a , b ] = [ − 1 , 1 ] \rho(x)\equiv1, [a,b]=[-1,1] ρ(x)≡1,[a,b]=[−1,1] ,此时关于权函数 ρ ( x ) = 1 \rho(x)=1 ρ(x)=1 的区间 [−1,1] 上的正交多项式为勒让德 (Legendre) 正交多项式.
n=0时:
∫ − 1 1 f ( x ) d x ≈ 2 f ( 0 ) , \int_{-1}^1f(x)\mathrm{d}x\approx2f(0), ∫−11f(x)dx≈2f(0),
n=1时:
∫ − 1 1 f ( x ) d x ≈ f ( − 1 3 ) + f ( 1 3 ) . \int_{-1}^1f(x)\mathrm{d}x\approx f\left(-\frac{1}{\sqrt{3}}\right)+f\left(\frac{1}{\sqrt{3}}\right). ∫−11f(x)dx≈f(−31)+f(31).
n=2时:
∫ − 1 1 f ( x ) d x ≈ 5 9 f ( − 3 5 ) + 8 9 f ( 0 ) + 5 9 f ( 3 5 ) . \int_{-1}^1f(x)\mathrm{d}x\approx\frac{5}{9}f\left(-\sqrt{\frac{3}{5}}\right)+\frac{8}{9}f(0)+\frac{5}{9}f\left(\sqrt{\frac{3}{5}}\right). ∫−11f(x)dx≈95f(−53)+98f(0)+95f(53).
对于一般区间[a,b]的积分,需要先变换积分区间,然后使用高斯-勒让德公式计算.
x = a + b 2 + b − a 2 t x=\frac{a+b}{2}+\frac{b-a}{2}t x=2a+b+2b−at
∫ a b f ( x ) d x = b − a 2 ∫ − 1 1 f ( a + b 2 + b − a 2 t ) d t . \int_a^bf(x)\mathrm{d}x=\frac{b-a}{2}\int_{-1}^1f\left(\frac{a+b}{2}+\frac{b-a}{2}t\right)\mathrm{d}t. ∫abf(x)dx=2b−a∫−11f(2a+b+2b−at)dt.
∫ a b f ( x ) d x ≈ b − a 2 ∑ i = 0 n ω i f ( a + b 2 + b − a 2 x i ) , \int_a^bf(x)\mathrm{d}x\approx\frac{b-a}{2}\sum_{i=0}^n\omega_if\left(\frac{a+b}{2}+\frac{b-a}{2}x_i\right), ∫abf(x)dx≈2b−ai=0∑nωif(2a+b+2b−axi),
其中, ω i \omega_i ωi 为高斯系数, x i x_i xi 为高斯点.
常用的高斯点及高斯系数表:
高斯 – 切比雪夫公式
令 ρ ( x ) = 1 1 − x 2 , [ a , b ] = [ − 1 , 1 ] . \rho(x) = \frac{1}{\sqrt{1-x^{2}}}, [a,b] = [-1,1]. ρ(x)=1−x21,[a,b]=[−1,1].,高斯点 x i x_i xi分布和对应高斯系数 ω i \omega_i ωi为:
x i = cos 2 i + 1 2 ( n + 1 ) π , i = 0 , 1 , ⋯ , n . x_i=\cos\frac{2i+1}{2(n+1)}\pi,\quad i=0,1,\cdots,n. xi=cos2(n+1)2i+1π,i=0,1,⋯,n.
ω i = π n + 1 . \omega_i=\frac{\pi}{n+1}. ωi=n+1π.
积分区间为[-1,+1]的高斯–切比雪夫公式为:
∫ − 1 1 1 1 − x 2 f ( x ) d x ≈ π n + 1 ∑ i = 0 n f ( cos 2 i + 1 2 ( n + 1 ) π ) . \int_{-1}^1\frac{1}{\sqrt{1-x^2}}f(x)\mathrm{d}x\approx\frac{\pi}{n+1}\sum_{i=0}^nf\left(\cos\frac{2i+1}{2(n+1)}\pi\right). ∫−111−x21f(x)dx≈n+1πi=0∑nf(cos2(n+1)2i+1π).
n=2时:
∫ − 1 1 1 1 − x 2 f ( x ) d x ≈ π 3 [ f ( − 3 2 ) + f ( 0 ) + f ( 3 2 ) ] . \int_{-1}^1\frac{1}{\sqrt{1-x^2}}f(x)\mathrm{d}x\approx\frac{\pi}{3}\left[f\left(-\frac{\sqrt{3}}{2}\right)+f(0)+f\left(\frac{\sqrt{3}}{2}\right)\right]. ∫−111−x21f(x)dx≈3π[f(−23)+f(0)+f(23)].
高斯 – 拉盖尔公式
令 ρ ( x ) = e − x , [ a , b ] = [ 0 , ∞ ) . \rho(x)=\mathrm{e}^{-x}, [a,b]=[0,\infty). ρ(x)=e−x,[a,b]=[0,∞). 此时高斯系数为:
ω i = x i L n + 2 2 ( x i ) , i = 0 , 1 , ⋯ , n . \omega_i=\frac{x_i}{L_{n+2}^2(x_i)},\quad i=0,1,\cdots,n. ωi=Ln+22(xi)xi,i=0,1,⋯,n.
高斯 – 拉盖尔积分公式为:
∫ 0 ∞ e − x f ( x ) d x ≈ ∑ i = 0 n ω i f ( x ) \int_0^\infty\mathrm{e}^{-x}f(x)\mathrm{d}x\approx\sum_{i=0}^n\omega_if(x) ∫0∞e−xf(x)dx≈i=0∑nωif(x)
n=0时:
∫ 0 ∞ e − x f ( x ) d x ≈ f ( 1 ) . \int_0^\infty\mathrm{e}^{-x}f(x)\mathrm{d}x\approx f(1). ∫0∞e−xf(x)dx≈f(1).
n=1时:
∫ 0 ∞ e − x f ( x ) d x ≈ 2 + 2 4 f ( 2 − 2 ) + 2 − 2 4 f ( 2 + 2 ) . \int_0^\infty\mathrm{e}^{-x}f(x)\mathrm{d}x\approx\frac{2+\sqrt2}{4}f(2-\sqrt2)+\frac{2-\sqrt2}{4}f(2+\sqrt2). ∫0∞e−xf(x)dx≈42+2f(2−2)+42−2f(2+2).
n=2,3,4时的高斯点和高斯系数:
- 公式变换
对于形如 ∫ α ∞ e − β x f ( x ) d x ( β > 0 ) \int_{\alpha}^{\infty}\mathrm{e}^{-\beta x}f(x)\mathrm{d}x (\beta>0) ∫α∞e−βxf(x)dx(β>0) 的积分,需要转换为标准高斯-拉盖尔公式的形式:
x = 1 β t + α x=\frac{1}{\beta}t+\alpha x=β1t+α
∫ α ∞ e − β x f ( x ) d x = 1 β e − α β ∫ 0 ∞ e − t f ( 1 β t + α ) d t ≈ 1 β e − α β ∑ i = 0 n ω i f ( x i β + α ) . \begin{aligned} \int_{\alpha}^{\infty}\mathrm{e}^{-\beta x}f(x)\mathrm{d}x& ={\frac{1}{\beta}}\mathrm{e}^{-\alpha\beta}\int_{0}^{\infty}\mathrm{e}^{-t}f\left({\frac{1}{\beta}}t+\alpha\right)\mathrm{d}t \\ &\approx\frac{1}{\beta}\mathrm{e}^{-\alpha\beta}\sum_{i=0}^{n}\omega_{i}f\left(\frac{x_{i}}{\beta}+\alpha\right). \end{aligned} ∫α∞e−βxf(x)dx=β1e−αβ∫0∞e−tf(β1t+α)dt≈β1e−αβi=0∑nωif(βxi+α).
对于形如 ∫ 0 ∞ g ( x ) d x \int_0^\infty g(x)\mathrm{d}x ∫0∞g(x)dx 的积分,首先确保g(x)是收敛的,其次需要转换为标准高斯-拉盖尔公式的形式:
∫ 0 ∞ g ( x ) d x = ∫ 0 ∞ e − x f ( x ) d x ≈ ∑ i = 0 n ω i f ( x i ) = ∑ i = 0 n ω i e x i g ( x i ) . \begin{gathered} \int_{0}^{\infty}g(x)\mathrm{d}x =\int_{0}^{\infty}\mathrm{e}^{-x}f(x)\mathrm{d}x\approx\sum_{i=0}^{n}\omega_{i}f(x_{i}) \\ =\sum_{i=0}^{n}\omega_{i}\mathrm{e}^{x_{i}}g(x_{i}). \end{gathered} ∫0∞g(x)dx=∫0∞e−xf(x)dx≈i=0∑nωif(xi)=i=0∑nωiexig(xi).
高斯 – 埃尔米特 (Gauss-Hermite) 公式
令 ρ ( x ) = e − x 2 , [ a , b ] = ( − ∞ , + ∞ ) . \rho(x) = \mathrm{e}^{-x^{2}}, [a,b] = (-\infty,+\infty). ρ(x)=e−x2,[a,b]=(−∞,+∞). ,高斯点为n+1次埃尔米特正交多项式 H n + 1 ( x ) H_{n+1}(x) Hn+1(x) 的零点, 对应高斯系数为:
ω i = 2 n + 2 ( n + 1 ) ! π [ H n + 2 ( x i ) ] 2 , i = 0 , 1 , ⋯ , n . \omega_i=\frac{2^{n+2}(n+1)!\sqrt{\pi}}{\left[H_{n+2}(x_i)\right]^2},\quad i=0,1,\cdots,n. ωi=[Hn+2(xi)]22n+2(n+1)!π,i=0,1,⋯,n.
此时求积公式为:
∫ − ∞ + ∞ e − x 2 f ( x ) d x ≈ ∑ i = 0 n ω i f ( x i ) , \int_{-\infty}^{+\infty}\mathrm{e}^{-x^{2}}f(x)\mathrm{d}x\approx\sum_{i=0}^{n}\omega_{i}f(x_{i}), ∫−∞+∞e−x2f(x)dx≈i=0∑nωif(xi),
n = 1 时的高斯 – 埃尔米特公式为
∫ − ∞ + ∞ e − x 2 f ( x ) d x ≈ π 2 f ( − 2 2 ) + π 2 f ( 2 2 ) . \int_{-\infty}^{+\infty}\mathrm{e}^{-x^2}f(x)\mathrm{d}x\approx\frac{\sqrt{\pi}}{2}f\left(-\frac{\sqrt{2}}{2}\right)+\frac{\sqrt{\pi}}{2}f\left(\frac{\sqrt{2}}{2}\right). ∫−∞+∞e−x2f(x)dx≈2πf(−22)+2πf(22).
n = 2 时的高斯 – 埃尔米特公式为
∫ − ∞ + ∞ e − x 2 f ( x ) d x ≈ π 6 f ( − 6 2 ) + 2 π 3 f ( 0 ) + π 6 f ( 6 2 ) \int_{-\infty}^{+\infty}\mathrm e^{-x^2}f(x)\mathrm dx\approx\frac{\sqrt{\pi}}{6}f\left(-\frac{\sqrt{6}}{2}\right)+\frac{2\sqrt{\pi}}{3}f(0)+\frac{\sqrt{\pi}}{6}f\left(\frac{\sqrt{6}}{2}\right) ∫−∞+∞e−x2f(x)dx≈6πf(−26)+32πf(0)+6πf(26)
高斯 – 埃尔米特公式的另一形式如下,g(x)需要保证广义积分收敛性:
∫ − ∞ + ∞ g ( x ) d x ≈ ∑ i = 0 n ω i e x i 2 g ( x i ) . \int_{-\infty}^{+\infty}g(x)\mathrm{d}x\approx\sum_{i=0}^n\omega_i\mathrm{e}^{x_i^2}g(x_i). ∫−∞+∞g(x)dx≈i=0∑nωiexi2g(xi).
5.2 高斯积分的应用
几种积分的python实现python">def Integ1dGuassLegendre(f, a:float=-1, b:float=1, n:int=5)->float:"""给定积分区间[a,b]和高斯积分点个数n,计算一维高斯-勒让德积分公式"""# 计算勒让德-高斯积分点及权重roots, weights = legendre_gauss_points_and_weights(n)if a==-1 and b==1:# 标准型积分result=sum([wi*f(xi) for xi,wi in zip(roots,weights)])return resultelse:# 非标准型积分, 需变换积分区间t= lambda x: 0.5*(b-a)*x+0.5*(b+a)result=0.5*(b-a)*sum([wi*f(t(xi)) for xi,wi in zip(roots,weights)])return resultdef legendre_gauss_points_and_weights(n:int)->Tuple[List[float],List[float]]:"""给定高斯点个数n,计算[-1,+1]内的勒让德-高斯积分点及权重"""import scipy.special as sp# 计算勒让德多项式的根(即高斯点)roots, weights = sp.roots_legendre(n)# sp.roots_legendre函数会返回勒让德多项式的根(即高斯点)及其对应的高斯系数。return roots, weightsdef Integ1dGuassHermite(f,n:int=3,Is_standard:bool=True)->float:"""给定n(>=1)值,积分范围[-inf,+inf],计算一维高斯-埃尔米特积分"""# 计算埃尔米特-高斯积分点及权重if n<=0:raise ValueError("高斯-埃尔米特积分时,n必须大于0")print(f"积分点个数: {n+1}, 积分范围: [-inf,+inf]")roots, weights = gauss_hermite_points_and_weights(n+1)if Is_standard:# 为标准型积分result=sum([wi*f(xi) for xi,wi in zip(roots,weights)])return resultelse:# 计算 \int_{-inf}^{+inf} g(x) dxresult=sum([wi*np.exp(xi**2)*f(xi) for xi,wi in zip(roots,weights)])return resultdef gauss_hermite_points_and_weights(n:int)->Tuple[List[float],List[float]]:"""给定高斯点个数n,计算[-inf,+inf]内的埃尔米特-高斯积分点及权重"""import scipy.special as sp# 计算埃尔米特多项式的根(即高斯点)及其对应的高斯系数roots, weights = sp.roots_hermite(n)return roots, weights
- Answer:
python">f3=lambda x: np.sin(x)/x if x!=0 else 1
from formu_lib import *
# 积分范围
a,b=0,1# 计算积分
r1=VarStepInteg1d(f3,a,b,1e-7,method=2)# 使用高斯勒让德方法计算积分
r2=Integ1dGuassLegendre(f3,a,b)print(f"复化梯形积分:{r1}")
print(f"高斯勒让德积分:{r2}")showError(r1,0.9460831)
showError(r2,0.9460831)# 输出:
# 复化梯形积分:0.9460830464324462
# 高斯勒让德积分:0.9460830703672151
# 数值解: 0.9460830464324462, 精确解: 0.9460831, 误差: 5.662034733111406e-08
# 数值解: 0.9460830703672151, 精确解: 0.9460831, 误差: 3.132154553076945e-08
- Answer:
python">def f4(alpha:int):return lambda x: abs(x)**(alpha+0.75)a,b=-1,1r={}
n=[1,10,50,100,500,1000]
for alpha in [0,1,2]:re=[]for ni in n:re.append(Integ1dGuassLegendre(f4(alpha=alpha),a,b,ni))r[alpha]=refrom matplotlib import pyplot as plt
for alpha in [0,1,2]:plt.plot(n,r[alpha],label=f"alpha={alpha}")
plt.xlabel('gauss points number')
plt.ylabel(' Integrate Value')
plt.legend()
plt.show()
- Answer:
python"># %%
# 例题5.5.8
from formu_lib import *
f5=lambda x: np.cos(x)result=Integ1dGuassHermite(f5,5)
showError(result, 1.3803884470)# 积分点个数: 5, 积分范围: [-inf,+inf]
# 数值解: 1.3803900759356564, 精确解: 1.380388447, 误差: -1.1800559906898897e-06
- Answer:
python"># %%
# 例题5.5.9
from formu_lib import *
g=lambda x: 1/(1+x**3)
n=[1,5,10,50,100]
result=[Integ1dGuassLaguerre(g,ni,beta=0) for ni in n]
print(f"广义积分结果:{result}")
# 广义积分结果:1.1693599387646283
from matplotlib import pyplot as pltplt.plot(n,result)
plt.xlabel('gauss points number')
plt.ylabel(' Integrate Value')
plt.title('Gauss-Laguerre Integration Value VS Points Number')
plt.show()
# 收敛于1.2091