定积分c语言
⑴ c语言 求定积分的通用函数
对于一重定积分来说其求解可以使用梯形法进行求解,计算公式如下所示:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//功能:返回f(x)在积分区间[a,b]的值
//参数:FunCallBack指向用于计算f(x)的函数
//a积分区间的起始值
//b积分区间的结束值
//dx横坐标的间隔数,越小计算结果越准确
doubleCalculate(double(*FunCallBack)(doublex),
doublea,doubleb,doubledx)
{
doubledoui;
doubletotal=0;//保存最后的计算结果
for(doui=a;doui<=b;doui+=dx)
{
total+=FunCallBack(doui)*dx;
}
returntotal;
}
doublef2(doublex)
{
returnx*x;
}
doublef(doublex)
{
returnx;
}
doublef3(doublex)
{
returnx*x*x;
}
intmain()
{
doubletotal;
total=(Calculate(f,2,3,0.000001));
printf("total=%lf
",total);
total=(Calculate(f2,2,3,0.000001));
printf("total=%lf
",total);
total=(Calculate(f3,2,3,0.000001));
printf("total=%lf
",total);
return0;
}
其中,函数f,f2,f3为自行编写的关于x的被积函数。
运行结果:
total=2.500000
total=6.333331
total=16.249991
⑵ 有关c语言用梯形法求定积分的一个程序,请帮忙修改
#include<stdio.h>
#include<math.h>
doublef(doublex)
{
returnsqrt(4-x*x);
}
main()
{
doublea,b,s1,s2,s,h,m=1E-6;
intn,i;
printf("请输入积分下限a和积分上限b ");
scanf("%lf%lf",&a,&b);
s2=0;
n=10000;
// do
{
s1=s2;
n=2*n;
h=(b-a)/n;
i=1;
s2=0;
do
{
s=(f(a+i*h)+f(a+(i-1)*h))*h/2;
s2=s2+s;
i=i+1;
}
while(i<=n);
}
// while((fabs(s1-s2))>(m*(fabs(s2)-fabs(s1))));
printf("f(x)在[a,b]上的定积分为%.10lf",s2);
return0;
}
⑶ c语言用蒙特卡洛方法求定积分 大佬帮忙看看哪里不对
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
doublejifen(int,int,int,int);
intmain()
{
inta,b,d,n;
doublec;
srand((unsigned)time(NULL));
printf("请输入ab ");
scanf("%d%d",&a,&b);
printf("请输入n ");
scanf("%d",&n);
d=1+b*b;
c=jifen(a,b,d,n);
printf("积分为%lf ",c);
return0;
}
doublejifen(inta,intb,intd,intn)
{
inti,m=0;
doublex,y,result;
for(i=1;i<=n;i++){
x=(double)rand()/(double)(RAND_MAX)*(b-a)+a;
y=(double)rand()/(double)(RAND_MAX)*d;
if(y<=1+x*x)m++;
}
result=(double)m*(b-a)*d/n;
returnresult;
};
如上 使用double 在最后加入result的强制转换
另外在x定义那里,改为(rand/rand_max)*(b-a)+a
因为是a,b 之间的距离随机加a,当a不为0时原来的式子是错的。
⑷ 用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
由上面的比较可知,梯形法的精度要高于矩形法。
⑸ 怎么用C语言用累积梯形面积求定积分
#include <stdio.h>
typedef double Fun(double x);
double integral(Fun f, double x1, double x2, int n)
{
double delta = (x2 - x1) / n;
double I = 0.5 * (f(x1) + f(x2))* delta;
int i = 1;
for( ; i < n; i++)
I += f(x1 + delta * i)* delta;
return I;
}
double fun(double x)
{
return x * x;
}
int main()
{
double a, t, ret;
int n;
printf("输入积分左右端点a,t,梯形个数n\n");
scanf("%lf %lf %d", &a, &t, &n);
ret = integral(fun, a, t, n);
printf("x^2在[%lf,%lf]上的定积分为%lf\n", a, t, ret);
return 0;
}
运行结果
输入积分左右端点a,t,梯形个数n
0 1 2000
x^2在[0.000000,1.000000]上的定积分为0.333333
⑹ 用“累计梯形面积”法求定积分求高手!!!! (c语言)
#include "math.h"
double f(double x) /*定义被积函数*/
{
return x*x+3*x+2;
}
double integrate(double a,double b) /*定义积分公式函数*/
{double t,h;
int i,n=100;
t=0.5*(f(a)+f(b));
h=fabs(a-b)/n;
for(i=1;i<n;i++)
t+=f(a+i*h);
t=t*h;
return t;
}
void main() /*定义主函数*/
{printf("\n%f\n",integrate(0,2));}
⑺ C语言求定积分的问题。
根据梯形法求积分的原理,设间隔h= (b-a)/n,则积分近似计算公式为:
s = h/2 *[f(a)+f(a+h)] +h/2 *[f(a+h)+f(a+2h)] +...+h/2 *[f(b-h)+f(b)]
=h/2 *[f(a)+f(b)] + h*[ f(a+h) + f(a+2h) +f(a+3h) + ... +f(b -h)]
令积分s初始值为h/2 *[f(a)+f(b)] ,后面令i=1,...,n-1来迭代s = s+h*f(a+ih)。
⑻ C语言实习用梯形法或辛普森法求解定积分的值
//梯形法求定积分
#include<stdio.h>
#include<math.h>
//定义被积函数
double func(double x){
return sin(x)*cos(x);
}
void main(){
double a,b,h,x,sum;
int i,n;
printf("Input a b and n: ");
scanf("%lf%lf%d",&a,&b,&n);
h=(b-a)/n;
x=a;
sum=(func(a)+func(b))/2;
for(i=1; i<n; i++){
x += h;
sum += func(x);
}
sum *= h;
printf("sum=%.4lf\n",sum);
}