1. c語言如何求定積分
4.龍貝格求積公式,求解定積分
C/C++ code
#include<stdio.h>
#include<math.h>
#define f(x) (sin(x)/x)
#define N 20
#define MAX 20
#define a 2
#define b 4
#define e 0.00001
float LBG(float p,float q,int n)
{ int i;
float sum=0,h=(q-p)/n;
for (i=1;i<n;i++)
sum+=f(p+i*h);
sum+=(f(p)+f(q))/2;
return(h*sum);
}
void main()
{ int i;
int n=N,m=0;
float T[MAX+1][2];
T[0][1]=LBG(a,b,n);
n*=2;
for(m=1;m<MAX;m++)
{ for(i=0;i<m;i++)
T[i][0]=T[i][1];
T[0][1]=LBG(a,b,n);
n*=2;
for(i=1;i<=m;i++)
T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);
if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e))
{ printf("Answer=%f\n",T[m][1]); getch();
return ;
}
}
}
6. 牛頓-科特斯求積公式,求定積分
C/C++ code
#include<stdio.h>
#include<math.h>
int NC(a,h,n,r,f)
float (*a)[];
float h;
int n,f;
float *r;
{ int nn,i;
float ds;
if(n>1000||n<2)
{ if (f)
printf("\n Faild! Check if 1<n<1000!\n",n);
return(-1);
}
if(n==2)
{ *r=0.5*((*a)[0]+(*a)[1])*(h);
return(0);
}
if (n-4==0)
{ *r=0;
*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
return(0);
}
if(n/2-(n-1)/2<=0)
nn=n;
else
nn=n-3;
ds=(*a)[0]-(*a)[nn-1];
for(i=2;i<=nn;i=i+2)
ds=ds+4*(*a)[i-1]+2*(*a)[i];
*r=ds*(h)/3;
if(n>nn)
*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
return(0);
}
main()
{
float h,r;
int n,ntf,f;
int i;
float a[16];
printf("Input the x[i](16):\n");
for(i=0;i<=15;i++)
scanf("%d",&a[i]);
h=0.2;
f=0;
ntf=NC(a,h,n,&r,f);
if(ntf==0)
printf("\nR=%f\n",r);
else
printf("\n Wrong!Return code=%d\n",ntf);
getch();
}
看看這個或許有幫助
2. c語言求定積分
#include
using
namespace
std;
#define
min
0
#define
max
1.0
inline
double
f(double
x)
{
return
x*x;
}
double
ladder(int
n)//用梯形法求積分
{
double
width=(max-min)/n;
double
sum=0;
for
(double
d=min;d
>n;
if
(cin.good()&&n>0)
break;
cout<<"輸入錯誤,請重新輸入:";
cin.clear();
cin.sync();
}
cout<<"梯形法積分為:"<
評論
0
0
載入更多
3. 用C語言編寫一個求定積分的程序
這是辛普森積分法。
給你寫了fun_1( ),fun_2(),請自己添加另外幾個被積函數。
調用方法 t=fsimp(a,b,eps,fun_i);
a,b --上下限,eps -- 迭代精度要求。
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
double fun_1(double x)
{
return 1.0 + x ;
}
double fun_2(double x)
{
return 2.0 * x + 3.0 ;
}
double fsimp(double a,double b,double eps, double (*P)(double))
{
int n,k;
double h,t1,t2,s1,s2,ep,p,x;
n=1; h=b-a;
t1=h*(P(a)+P(b))/2.0;
s1=t1;
ep=eps+1.0;
while (ep>=eps)
{
p=0.0;
for (k=0;k<=n-1;k++)
{
x=a+(k+0.5)*h;
p=p+P(x);
}
t2=(t1+h*p)/2.0;
s2=(4.0*t2-t1)/3.0;
ep=fabs(s2-s1);
t1=t2; s1=s2; n=n+n; h=h/2.0;
}
return(s2);
}
void main()
{
double a,b,eps,t;
a=0.0; b=3.141592653589793238; eps=0.0000001;
// a definite integral by Simpson Method.
t=fsimp(a,b,eps,fun_1);
printf("%g\n",t);
t=fsimp(a,b,eps,fun_2);
printf("%g\n",t);
// ...
printf("\n Press any key to quit...");
getch();
}
4. C語言解決定積分
#include<stdio.h>
#include<math.h>
void main()
{
int i,n;
float x[10001],y[10001];
float x0,xn,h,JiFen;
printf("input x0,xn,n:");
scanf("%f,%f,%d",&x0,&xn,&n);
h=(xn-x0)/n;
x[0]=x0;
for(i=0;i<=n;i++)
{
x[i]=x[0]+i*h;
y[i]=pow(x[i],3);
}
JiFen=0.0;
for(i=0;i<n;i++)
{
JiFen=JiFen+y[i]+y[i+1];
}
JiFen=JiFen*h/2.0;
printf("\n");
printf("n=%d JiFen is %f",n,JiFen);
getch();
}
5. 用c語言編寫求一個定積分
給一個辛普森求積分的例子。
1. 關於辛普森法(Simpson『s Rule)[1]
辛普森法是數值方法求積分的一種方法,它與梯形法和矩形法不同,辛普森法用二次曲線去逼近實際的積分,如下圖所示:
#include<stdio.h>
#include<math.h>
typedefdouble(*funcptr)(doublea);
doubleintegrate_simpson(funcptrf,floatlower,floatupper,intn)
{
inti;
floata,b;
floath;
doubleresult;
printf("%f%f%d
",lower,upper,n);
h=(upper-lower)/n;
printf("%f
",h);
result=0;
a=lower;
b=a+h;
for(i=0;i<n;i++)
{
doubletmp;
tmp=(b-a)/6*(f(a)+4*f((a+b)/2)+f(b));
printf("%f%f%f
",a,b,tmp);
result=result+tmp;
a=b;
b=a+h;
}
returnresult;
}
doublef(doublea)
{
returnexp(a);
}
voidmain(void)
{
doublere;
re=integrate_simpson(f,0,1,100);
printf("%f
",re);
}
3. 輸出樣式
moose@debian:~$ ./a.out
0.000000 1.000000 100
0.010000
0.000000 0.010000 0.010050
0.010000 0.020000 0.010151
0.020000 0.030000 0.010253
0.030000 0.040000 0.010356
0.040000 0.050000 0.010460
0.050000 0.060000 0.010565
0.060000 0.070000 0.010672
0.070000 0.080000 0.010779
0.080000 0.090000 0.010887
0.090000 0.100000 0.010997
0.100000 0.110000 0.011107
0.110000 0.120000 0.011219
0.120000 0.130000 0.011332
0.130000 0.140000 0.011445
0.140000 0.150000 0.011560
0.150000 0.160000 0.011677
0.160000 0.170000 0.011794
0.170000 0.180000 0.011913
0.180000 0.190000 0.012032
0.190000 0.200000 0.012153
0.200000 0.210000 0.012275
0.210000 0.220000 0.012399
0.220000 0.230000 0.012523
0.230000 0.240000 0.012649
0.240000 0.250000 0.012776
0.250000 0.260000 0.012905
0.260000 0.270000 0.013034
0.270000 0.280000 0.013165
0.280000 0.290000 0.013298
0.290000 0.300000 0.013431
0.300000 0.310000 0.013566
0.310000 0.320000 0.013703
0.320000 0.330000 0.013840
0.330000 0.340000 0.013979
0.340000 0.350000 0.014120
0.350000 0.360000 0.014262
0.360000 0.370000 0.014405
0.370000 0.380000 0.014550
0.380000 0.390000 0.014696
0.390000 0.400000 0.014844
0.400000 0.410000 0.014993
0.410000 0.420000 0.015144
0.420000 0.430000 0.015296
0.430000 0.440000 0.015450
0.440000 0.450000 0.015605
0.450000 0.460000 0.015762
0.460000 0.470000 0.015920
0.470000 0.480000 0.016080
0.480000 0.490000 0.016242
0.490000 0.500000 0.016405
0.500000 0.510000 0.016570
0.510000 0.520000 0.016736
0.520000 0.530000 0.016905
0.530000 0.540000 0.017075
0.540000 0.550000 0.017246
0.550000 0.560000 0.017419
0.560000 0.570000 0.017595
0.570000 0.580000 0.017771
0.580000 0.590000 0.017950
0.590000 0.600000 0.018130
0.600000 0.610000 0.018313
0.610000 0.620000 0.018497
0.620000 0.630000 0.018683
0.630000 0.640000 0.018870
0.640000 0.650000 0.019060
0.650000 0.660000 0.019251
0.660000 0.670000 0.019445
0.670000 0.680000 0.019640
0.680000 0.690000 0.019838
0.690000 0.700000 0.020037
0.700000 0.710000 0.020239
0.710000 0.720000 0.020442
0.720000 0.730000 0.020647
0.730000 0.740000 0.020855
0.740000 0.750000 0.021064
0.750000 0.760000 0.021276
0.760000 0.770000 0.021490
0.770000 0.780000 0.021706
0.780000 0.790000 0.021924
0.790000 0.800000 0.022144
0.800000 0.810000 0.022367
0.810000 0.820000 0.022592
0.820000 0.830000 0.022819
0.830000 0.839999 0.023048
0.839999 0.849999 0.023280
0.849999 0.859999 0.023514
0.859999 0.869999 0.023750
0.869999 0.879999 0.023989
0.879999 0.889999 0.024230
0.889999 0.899999 0.024473
0.899999 0.909999 0.024719
0.909999 0.919999 0.024968
0.919999 0.929999 0.025219
0.929999 0.939999 0.025472
0.939999 0.949999 0.025728
0.949999 0.959999 0.025987
0.959999 0.969999 0.026248
0.969999 0.979999 0.026512
0.979999 0.989999 0.026778
0.989999 0.999999 0.027047
1.718280
另:
matlab中用內置的int求積分的結果:
1.718281828459046
matlab中用前述simpson法求積分的結果:
1.718281828465257
4. 注意
本例中直接調用了標准math庫里的exp(),實際上可以通過改寫函數f(),將exp也做數值求解。
6. C語言求函數定積分
問題就是出在數據類型上的選用上,precision=0.0000001時已經超過了float的數據范圍,所以導致數據截斷後precision=0.000000,從而程序在計算積分時可能陷入死循環,應該採用double型數據類型。其實不推薦樓主用如此多的define語句,程序的可讀性和風格應該重於編程員的勞動度。。。
還有樓主對自然對數e的define也已經超過了計算機的可識別范圍。。您那樣精確的定義e並不會在結果上獲得更加精確地結果,其實反倒會起到相反的作用,要知道與其用一個這樣可能導致內存出錯以及必定會導致數據截斷的變數來實現精度的提高遠遠不如採用一個更精確的積分演算法,而且c語言提供了自然數e為底的指數函數~而且貌似您的積分演算法是不準確的,梯形積分的定義並非如此,其再兩端的函數值應該只取1/2.希望您多加細心~
如果不介意的話,就是你的precision應該改為step~這樣會能更加准備的表達了這個變數的作用,在你的程序中precision變數其實是積分步長~在數值計算方法中積分精度的控制往往不是通過細化步長來表達,而是通過後一個積分值-前一個積分值<precision 這樣來實現精度控制~呵呵
7. 用c語言求定積分
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,n,k,i,x,y;
double EPS=1e-7;
a=0;//a為積分下限
b=1.57079632679459661;//b為積分上限
n=1e-7;//n控制精度
k=x=y=0;//k為輔助變數
i=0;//i為積分的值
while(k<=1/n)
{
k++;
x=k*n*b-k*n*a;
y=sin(x);//定義被積函數
i=i+b*y*n-a*y*n;
}
printf("%lf\n",i);
getchar();
}
8. 用C語言求定積分
實際問題描述:
求定積分近似值
程序代碼如下:
#include
#include
void main()
{
int i,n=1000;
float a,b,h,t1,t2,s1,s2,x;
printf("請輸入積分限a,b:");
scanf("%f,%f",&a,&b);
h=(b-a)/n;
for(s1=0,s2=0,i=1;i<=n;i++)
{
x=a+(i-1)*h;
t1=(float)exp(-x*x/2);t2(float)=exp(-(x+h)*(x+h)/2);
s1=s1+t1*h; /*矩形面積累加*/
s2=s2+(t1+t2)*h/2; /*梯形面積累加*/
}
printf("矩形法算得積分值:%f.
",s1);
printf("梯形法算得積分值:%f.
",s2);
}
程序運行結果如下:
矩形法算得積分值:0.855821
梯形法算得積分值:0.855624
由上面的比較可知,梯形法的精度要高於矩形法。
9. 用C語言求積分
好象要你自己定義函數,庫函數中好象是沒有直接可以用的積分函數的。
10. c語言求解定積分
這是第一種方法,第二種方法我沒學過,不知道原理就無能為力啦~~
#include<stdio.h>
#include<math.h>
double f(double x)
{
return 1/(1+x*x*x);
}
double y(double a,double b,int m)
{
int i;
double h=(b-a)/m,c=0.0;
for(i=1;i<m;i++)
c=c+f(a+i*h);
return ((f(a)+f(b))/2+c)*h;
}
int main()
{
printf("%f" ,y(0,1,500));
return 0;
}