龙贝格算法就积分的c语言程序

龙贝格算法就积分的c语言程序,第1张

C++实现如下:

#include<iostream>

#include<cmath>

using namespace std

const int MAXRepeat = 100 //最大允许重复

double function(double x)//被积函数,根据自己的需要手工输入

{

double s

s = 1.0 / (1 + x)

return s

}

void Romberg(double a, double b, double epsion, double f(double x))

{

int m = 1

int n = 1

int k

double h

double ep

double p

double xk

double s

double q

double T[MAXRepeat]

h = b - a

T[0] = 0.5 * h * (f(a) + f(b))

ep = epsion + 1.0

while ((ep >= epsion) &&(m <MAXRepeat))

{

p = 0.0

for (k = 0k <nk++)

{

xk = a + (k + 0.5) * h// n-1

p = p + f(xk) //计算∑f(xk+h/2),T

} // k=0

p = (T[0] + h * p) / 2.0 //T`m`(h/2),变步长梯形求积公式

s = 1.0

for (k = 1k <= mk++)

{

s = 4.0 * s //[pwww.hbbz08.com ow(4,m)T`m`(h/2)-T`m`(h)]/[pow(4,m)-1],2m阶牛顿柯斯特公式,即龙贝格公式

q = (s * p - T[k - 1]) / (s - 1.0)

T[k-1] = p

p = q

}

ep = fabs(q - T[m - 1])

m++

T[m - 1] = q

n++// 2 4 8 16

h /= 2.0

}

for (int i = 0i <mi++)

{

int j

if (!(i % j))

{

cout<<T[i]<<endl

}

else

{

cout<<T[i]<<" "

}

j++

下面是使用龙贝格算法求积分的matlab程序代码

clear

clc

format

long

f='4/(1+x^2)'

%这是被积函数

x='x'

%这是被积自变量

a=0

%这是积分下限

b=1

%这是积分上限

e=1e-5

%这是积分误差限制

%以下是龙贝格积分算法,是目前最为成熟的积分算法,具有收敛速度快,精度可以自定义的优点

%

I为积分的估计值

%

n为迭代次数,2^(n-1)是等分区间的份数

T(1,1)=(b-a)/2*(subs(f,x,a)+subs(f,x,b))

T=double(T)

n=2

h=b-a

T(2,1)=T(1,1)/2+h/2*double(subs(f,x,a+h/2))

T(2,2)=4/3*T(2,1)-1/3*T(1,1)

d=T(2,2)-T(1,1)

while

d>e

n=n+1

h=h/2

T(n,1)=T(n-1,1)/2

for

i=1:2^(n-2)

T(n,1)=T(n,1)+h/2*double(subs(f,x,a+(i-1/2)*h))

end

for

i=2:n

k=4^(i-1)

T(n,i)=k/(k-1)*T(n,i-1)-1/(k-1)*T(n-1,i-1)

end

d=abs(T(n,n)-T(n-1,n-1))

end

I=T(n,n)

%输出计算值

望采纳!谢谢!

#include<iostream.h>

#include<math.h>

# define Precision 0.000001//积分精度要求

# define e 2.71828183

#define MAXRepeat 10 //最大允许重复

double function(double x)//被积函数

{

double s

s=pow(e,x)*cos(x)

return s

}

double Romberg(double a,double b,double f(double x))

{

int m,n,k

double y[MAXRepeat],h,ep,p,xk,s,q

h=b-a

y[0]=h*(f(a)+f(b))/2.0//计算T`1`(h)=1/2(b-a)(f(a)+f(b))

m=1

n=1

ep=Precision+1

while((ep>=Precision)&&(m<MAXRepeat))

{

p=0.0

for(k=0k<nk++)

{

xk=a+(k+0.5)*h// n-1

p=p+f(xk) //计算∑f(xk+h/2),T

} // k=0

p=(y[0]+h*p)/2.0 //T`m`(h/2),变步长梯形求积公式

s=1.0

for(k=1k<=mk++)

{

s=4.0*s// pow(4,m)

q=(s*p-y[k-1])/(s-1.0)//[pow(4,m)T`m`(h/2)-T`m`(h)]/[pow(4,m)-1],2m阶牛顿柯斯特公式,即龙贝格公式

y[k-1]=p

p=q

}

ep=fabs(q-y[m-1])//前后两步计算结果比较求精度

m=m+1

y[m-1]=q

n=n+n // 2 4 8 16

h=h/2.0//二倍分割区间

}

return q

}

main()

{

double a,b,Result

cout<<"请输入积分下限:"<<endl

cin>>a

cout<<"请输入积分上限:"<<endl

cin>>b

Result=Romberg( a, b, function)

cout<<"龙贝格积分结果:"<<Result<<endl

return 0

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuhongyi666/archive/2008/12/23/3589002.aspx


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7776222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存