❶ 龍貝格求積,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;
}
希望對您有所幫助!!!