基于复化辛卜生求积公式的变步长求积算法

mac2024-07-24  62

基于复化辛卜生求积公式的变步长求积算法

1.辛卜生求积公式

对于 I ∗ = ∫ a b f ( x ) d x I^*=\int_{a}^{b}{f(x)dx} I=abf(x)dx ,差值型求积公式就是构造多项式 P n ( x ) P_n(x) Pn(x),使 I ∗ ≈ I = I ∗ = ∫ a b f ( x ) d x I^*\approx I= I^*=\int_{a}^{b}{f(x)dx} II=I=abf(x)dx。 如果以 a , c = a + b 2 , b a,c=\frac{a+b}{2},b a,c=2a+b,b为三个差值节点,构造二次插值多项式 P 2 ( X ) = ( x − c ) ( x − b ) ( a − c ) ( a − b ) f ( a ) + ( x − a ) ( x − b ) ( c − a ) ( c − b ) f ( c ) + ( x − a ) ( x − c ) ( b − a ) ( b − c ) ) f ( b ) P_2(X)=\frac{(x-c)(x-b)}{(a-c)(a-b)}f(a)+\frac{(x-a)(x-b)}{(c-a)(c-b)}f(c)+\frac{(x-a)(x-c)}{(b-a)(b-c))}f(b) P2(X)=(ac)(ab)(xc)(xb)f(a)+(ca)(cb)(xa)(xb)f(c)+(ba)(bc))(xa)(xc)f(b) 则可以推出 I = ∫ a b P 2 ( x ) d x = = λ 0 f ( a ) + λ 1 f ( c ) + λ 2 f ( b ) I=\int_a^bP_2(x)dx==\lambda_0f(a)+\lambda_1f(c)+\lambda_2f(b) I=abP2(x)dx==λ0f(a)+λ1f(c)+λ2f(b) 其中 λ 0 = ∫ a b ( x − c ) ( x − b ) ( a − c ) ( a − b ) d x = 1 6 ( b − a ) \lambda_0=\int_a^b\frac{(x-c)(x-b)}{(a-c)(a-b)}dx=\frac{1}{6}(b-a) λ0=ab(ac)(ab)(xc)(xb)dx=61(ba) λ 1 = ∫ a b ( x − a ) ( x − b ) ( c − a ) ( c − b ) d x = 4 6 ( b − a ) \lambda_1=\int_a^b\frac{(x-a)(x-b)}{(c-a)(c-b)}dx=\frac{4}{6}(b-a) λ1=ab(ca)(cb)(xa)(xb)dx=64(ba) λ 2 = ∫ a b ( x − a ) ( x − c ) ( b − a ) ( b − c ) d x = 1 6 ( b − a ) \lambda_2=\int_a^b\frac{(x-a)(x-c)}{(b-a)(b-c)}dx=\frac{1}{6}(b-a) λ2=ab(ba)(bc)(xa)(xc)dx=61(ba) 称为辛卜生求积公式。 I ∗ = ∫ a b f ( x ) d x ≈ b − a 6 [ f ( a ) + 4 f ( c ) + f ( b ) ] I^*=\int_{a}^{b}{f(x)dx}\approx \frac{b-a}{6}[f(a)+4f(c)+f(b)] I=abf(x)dx6ba[f(a)+4f(c)+f(b)] 如果把[a,b]区间分为步长为 h = b − a n h=\frac{b-a}{n} h=nba的子区间 [ x k , x k + 1 ] [x_k , x_{k+1}] [xk,xk+1],再将子区间的定积分加起来得到整个区间的定积分近似值,该公式则称为复化辛卜生公式。

取步长为 h = b − a n h=\frac{b-a}{n} h=nba,将[a,b]分为n等分,分割点为 x k = a + k h , k = 0 , 1 , 2 , 3 ⋯ n ; x_k=a+kh,k=0,1,2,3\cdots n; xk=a+kh,k=0,1,2,3n; 由辛卜生公式得: ∫ a b f ( x ) d x ≈ ∑ k = 0 n − 1 h 6 [ f ( x k ) + 4 f ( x k + x k + 1 2 ) + f ( x k + 1 ) ] \int_a^bf(x)dx\approx\sum_{k=0}^{n-1} \frac{h}{6} \left[ f(x_k)+4f(\frac{x_k+x_{k+1}}{2})+f(x_{k+1}) \right] abf(x)dxk=0n16h[f(xk)+4f(2xk+xk+1)+f(xk+1)] = h 6 [ f ( a ) + 4 ∑ k = 0 n − 1 4 f ( x k + x k + 1 2 ) + 2 ∑ k = 1 n − 1 f ( x k ) + f ( b ) ] =\frac{h}{6}\left[ f(a)+4\sum_{k=0}^{n-1}4f(\frac{x_k+x_{k+1}}{2})+2\sum_{k=1}^{n-1}f(x_k)+f(b)\right] =6h[f(a)+4k=0n14f(2xk+xk+1)+2k=1n1f(xk)+f(b)] c语言程序实现如下: 例子 ∫ 1 2 x 2 d x \int_1^2 x^2dx 12x2dx

#include <iostream> double f(double x){ return x*x; } double simpson(double (*f)(double x), double a, double b,int n){ double result=0; double step=(b-a)/n; for (int i = 0; i <n ; ++i) { result+=f(a+step*i)+4*f(a+step*(i+1/2))+f(a+step*(i+1)); } result=result*(step/6); return result; } int main(){ double x; x=simpson(f,1,2,100000); printf("%lf",x); return 0; }

结果: 2.333323 Process finished with exit code 0

最新回复(0)