C语言如何求定积分?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何求定积分?相关的知识,希望对你有一定的参考价值。

求1/(x+x^3),区间在1-2上.急求!!!

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();

看看这个或许有帮助
参考技术A 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();

看看这个或许有帮助
参考技术B #include<stdio.h>
#include<math.h>
#define
TT
(3.141592627)
void
main()

int
i,n;
double
a,b,h,s1,s2,s3,s=0;
//scanf("%f,%f,%d",&a,&b,&n);
a
=
0;
b
=
TT/2;
n=
100;
h=(b-a)/n;
s1=sin(a);s2=sin(b);
for(i=1;i<=n;i++)

//
s=s+sin(a+(i-1))*h+sin(a+i*h);
s=s
+
sin(a
+
i
*
h);

//s3=(s1+2*s-s2)*h/2;
s3
=
(s
*
2
+
sin(a)
-
sin(b))
*
h
/
2;
printf("s=%f\n",s3);

你再消化一下
TT的值可能的再精确点
才完事。
参考技术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
0
加载更多

matlab进行数值近似积分,含变化的常数做为参数

  
技术分享技术分享技术分享技术分享技术分享
关于matlab中求定积分int和quad命令的使用

int的积分可以是定积分,也可以是不定积分(即有没有积分上下限都可以积),可以得到解析的解,比如你对x^2积分,得到的结果是1/3*x^3,这是通过解析的方法来解的。如果int(x^2,x,1,2)得到的结果是7/3 ;

quad是数值积分,它只能是定积分(就是有积分上下限的积分),它是通过simpson数值积分来求得的(并不是通过解析的方法得到解析解,再将上下限代入,而是用小梯形的面积求和得到的)。如果f=inline(‘x.^2‘);quad(f,1,2)得到的结果是2.333333,这个数并不是7/3 ;

最新心得:
看一本书上介绍quad积分时,是创建了一个子函数形式,如
function f=quadl(x)
f=x.^2;

Q=quad(‘quadl‘,0,2)

结果Q =
    2.6667

如果函数中有一个已知变量如a的话,如
function f=quadl(x)
a=2;
f=a+x.^2;




Q=quad(‘quadl‘,0,2)
结果Q =
    6.6667

当用使用inline函数的时候可以避免调用子函数的麻烦,直接把这个功能集成于总程序,如
f=inline(‘x.^2‘);quad(f,1,2)
但是当函数为
a=2;
f=inline(‘a+x.^2‘);
quad(f,1,2)

计算就会出错,说明inline中不能带已知的字母。

但是很多时候,变量a是循环变化的,这样就导致这种调用子函数的方法非常不好用,
a不能及时改变,下面的方法可以解决这个问题:

a=2;
[email protected](x)(a+x.^2);
Q=quad(f,0,2)

结果Q =
    6.6667 正确
用@来表达函数要比inline应用更广,在循环中应用更有利!

本人对matlab认知尚浅,不知道上面的说法有什么不妥的地方还请指正!
 
 
 
 
---------------------------分割线-------------------------------
matlab的积分个人感觉好奇怪,各种报错,楼主这种方法的确可用。
 
起初我用int(y,x)求积分,结果得到的还是int,也就是积不出来,所以开始使用数值近似解积分quad
 
不知道为什么我quad(f,0,inf)会报错说超出数值解,但是我用quad(f,0,10000)却可以。。。一直以为是我式子不对导致不收敛
 













































以上是关于C语言如何求定积分?的主要内容,如果未能解决你的问题,请参考以下文章

c语言 求定积分的通用函数

C语言求函数定积分

编写一个求定积分的通用函数,用它分别求以下几个积分:

用C语言编写一个求定积分的程序

matlab求定积分和不定积分

117.求定积分