当前位置:首页 » 编程语言 » c语言龙贝格算法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言龙贝格算法

发布时间: 2022-02-11 17:09:33

❶ 龙贝格求积,c语言代码

#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=0;k<n;k++)
{
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=1;k<=m;k++)
{
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

❷ 用Romberg算法计算下列积分的C语言程序

误差界eps%被积函数为f(x)=(x^3+sin(x))/x;积分区间为[0.3,0.8]
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void)
{
/* int i,j,n;
float *d=(float *)malloc(sizeof(float)*N);
float *x=(float *)malloc(sizeof(float)*N);
float *y=(float *)malloc(sizeof(float)*N);
float *u=(float *)malloc(sizeof(float)*N);
free(a);free(b);free(c);free(d);free(x);free(y);free(l);

return 0;
*/
double b=0.8;
double a=0.3;
double h=0.0; //
double eps=1.0e-5;//误差界eps
int kmax=20; //最大递推次数
double T1=0.0,S1=0.0,C1=0.0,R1=0.0,T2=0.0,S2=0.0,C2=0.0,R2=0.0;
double sum;
double *x,*fx;
int i;
h=b-a;
T1=h/2*((pow(a,3)+sin(a))/a+(pow(b,3)+sin(b))/b);
printf("T1:%13.12f\n",T1);
for(int k=0;k<kmax;k++)
{
h=(b-a)/(pow(2,k+1));
x=(double *)malloc(sizeof(double)*int(pow(2,k)));
for(i=0;i<pow(2,k);i++)
{
x[i]=a+(2*i+1)*h;
}
fx=(double *)malloc(sizeof(double)*int(pow(2,k)));
sum=0.0;
for(i=0;i<pow(2,k);i++)
{
fx[i]=(pow(x[i],3)+sin(x[i]))/x[i];
sum+=fx[i];
}
T2=T1/2+sum*h;
printf("T2:%13.12f\n",T2);
S2=T2+(T2-T1)/3;
printf("S%d:%13.12f\n",int(pow(2,k)),S2);
if(k<2)
{
if(k==1)
{
C2=S2+(S2-S1)/15;
printf("C1:%13.12f\n",C2);
}
}
else
{
C2=S2+(S2-S1)/15;
printf("C%d:%13.12f\n",int(pow(2,k-1)),C2);
R2=C2+(C2-C1)/63;
printf("R%d:%13.12f\n",int(pow(2,k-2)),R2);
if(fabs(R2-R1)<eps)
break;
R1=R2;
}
T1=T2;S1=S2;C1=C2;
free(x);free(fx);
}
printf("所求积分I=%13.12f\n",R2);
return 0;
}

❸ c语言用龙贝格法求积分

语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

中文名
C语言
外文名
The C Programming Language
类别
计算机通用程序设计语言
创始人
Dennis MacAlistair Ritchie
创始时间
1972年
发源
BCPL语言
主要编译器
Clang、GCC、MSVC、Turbo C等
启发语言
B语言、汇编、ALGOL68
操作系统
多平台

❹ 用c语言,不用c++,编程龙贝格求积分

我的建议是上网搜索开源的数学包,里面保证有这些算法。用google搜索更好。

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

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 = 0; k < n; k++)
{
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 = 1; k <= m; k++)
{
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 = 0; i < m; i++)
{
int j;
if (!(i % j))
{
cout<<T[i]<<endl;
}
else
{
cout<<T[i]<<" ";
}
j++;

❻ C语言实现用龙贝格法进行积分数值计算的 课程 设计

#include<stdio.h>
#include<math.h>

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 = 0; k < n; k++)
{
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 = 1; k <= m; k++)
{
s = 4.0 * s; //[pow(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 = 0; i < m; i++)
{
int j;
if (!(i % j))
{
printf("%lf\n",T[i]);
}
else
{
printf("%lf ",T[i]);
}
j++;
}
}

int main()
{
double a;
double b;
double epsion;

printf("Please input the lower limit: ");
scanf("%lf",&a);
printf("Please input the upper limit: ");
scanf("%lf",&b);
printf("Please input the precision : ");
scanf("%lf",&epsion);
Romberg( a, b, epsion, function);
return 0;
}

❼ 用c语言,不用c++求解龙贝格积分


//龙贝格方法c语言实现
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
floatf(floatx){return(4/(1+x*x));}
floatRomberg(floata,floatb)
{intk=1;floatS,x,T1,T2,S1,S2,C1,C2,R1,R2,h=b-a,precision;
T1=h*(f(a)+f(b))/2;
while(1){S=0;x=a+h/2;
do
{S+=f(x);x+=h;}while(x<b);
T2=(T1+h*S)/2.0;
if(fabs(T2-T1)<precision)return(T2);
S2=T2+(T2-T1)/3.0;
if(k==1)
{T1=T2;S1=S2;h/=2;k+=1;continue;}
C2=S2+(S2-S1)/15.0;
if(k==2)
{C1=C2;T1=T2;S1=S2;h/=2.0;k+=1;continue;}
R2=C2+(C2-C1)/63;
if(k==3)
{R1=R2;C1=C2;T1=T2;S1=S2;h/=2;k+=1;continue;};
if(fabs(S1-S2)<precision)return(S2);
R1=R2;C1=C2;T1=T2;S1=S2;
h/=2;k+=1;return(R1);}}
main(){inti;floata,b,precision,S,clrscr();
printf(" Inputintegratef(x)thebegin:");
scanf("%f",&a);
printf(" Inputintegratef(x)theend:");
scanf("%f",&b);
printf(" inputprecision:");
scanf("%f",&precision);S=Romberg(a,b);
printf("Theresultis:%f",S);
getch();return(S);}

❽ 求龙贝格算法 c语言代码

《C++ 数值算法》一书上有完整的代码和讨论

❾ 龙贝格求积公式的算法

对区间[a, b],令h=b-a构造梯形值序列{T2K}。
T1=h[f(a)+f(b)]/2
把区间二等分,每个小区间长度为 h/2=(b-a)/2,于是
T2 =T1/2+[h/2]f(a+h/2)
把区间四(2)等分,每个小区间长度为h/2 =(b-a)/4,于是
T4 =T2/2+[h/2][f(a+h/4)+f(a+3h/4).....................
把[a,b] 2等分,分点xi=a+(b-a)/ 2 ·i (i =0,1,2 · · · 2k)每个小区间长度为(b-a)/ 2 .
例:
I = ∫(4/(1+X) )dx 积分区间为0到1.
解 按上述五步计算,此处 f(x)=4/(1+x) a=0 b=1 f(0)=4 f(1)=2
由梯形公式得
T1=1/2[f(0)+f(1)]=3
计算f(1/2)=16/5 用变步长梯形公式得
T2=1/2[T1+f(1/2)]=3.1
由加速公式得
S1=1/3(4T2-T1)=3.133333333
求出f(1/4) f(3/4) 进而求得
T4=1/2{T2+1/2[f(1/4)+f(3/4)]}
=3.131176471
S2=1/3(4T4-T2)=3.141568628
C1=1/15(16S2-S1)=3.142117648
计算f(1/8) f(3/8) f(5/8) f(7/8)进而求得
T8=1/2{T4+1/4[f(1/8)+f(3/8)+f(5/8)+f(7/8)]}
=3.138988495
S4=1/3(4T8-T4)=3.141592503
C2=1/15(16S4-S2)=3.141594095
R1=1/63(64C2-C1)=3.141585784
把区间再二分,重复上述步骤算得
T16=3.140941613 S8=3.141592652
C4=3.141592662 R2=3.141592640
由于 |R1-R2|<=0.00001,计算可停止,取R2=3.14159 N Tn Sn Cn Rn 1 3 3.133333333 3.142117648 3.141585784 2 3.1 3.141568628 3.141594095 3.141592640 4 3.131176471 3.141592503 3.141592662 8 3.138988495 3.141592652 16 3.140941613

❿ 求一个数值分析 龙贝格积分的C语言程序的代码。

这个程序,我正好在学计算方法的时候写过,直接贴代码
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 = 0; k < n; k++)
{
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 = 1; k <= m; k++)
{
s = 4.0 * s; //[pow(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 = 0; i < m; i++)
{
int j;
if (!(i % j))
{
cout<<T[i]<<endl;
}
else
{
cout<<T[i]<<" ";
}
j++;
}
}

int main()
{
double a;
double b;
double epsion;

cout<<"Please input the lower limit: ";
cin>>a;
cout<<"Please input the upper limit: ";
cin>>b;
cout<<"Please input the precision : ";
cin>>epsion;
Romberg( a, b, epsion, function);
return 0;
}
希望对您有所帮助!!!