#include<stdio.h>
#include<math.h>
#define ARRAYBOUND 10001
void main()
{
int i = 0 //辅助变量,最常见那种
int n = 0 //将所求定积分函数曲线在x轴方向,平均分成n等分n越大,结果越精确不过限于此算法限制n<ARRAYBOUND,否则溢出.
float x[ARRAYBOUND]//ARRAYBOUND维浮点数组,存放离散的x坐标值
float y[ARRAYBOUND]//ARRAYBOUND维浮点数组,存放每个x坐标对应的函数值x[i],y[i]满足y[i]=f(x[i]),f是你要求定积分的函数
float x0 = 0.0 //定积分下限
float xn = 0.0 //定积分上限
float h = 0.0 //面积微元宽度
float J = 0.0 //辅助变量
/*f=x^3*/ //这里说明要求定积分的是函数f(x)=x*x*x(y等于x的立方,x^3是vb的写法)
// printf("input x0,xn,n:")
printf("请分别输入下限(x0),上限(xn),精度(n):")
scanf("%f",&x0)
scanf("%f",&xn)
scanf("%d",&n)
h=(xn-x0)/n//将函数图形在x方向平分成n份,h是每个面积微元的宽度
x[0]=x0 //将积分下限赋值给x[0]
for(i=0i<=n &&n<ARRAYBOUNDi++)
{
x[i]=x[0]+i*h //计算n个离散的横坐标值,存入x[]数组
y[i]=(float)pow(x[i],3)//计算n个横坐标对应的函数值,存入y[]数组。在此可以改变要求积分的函数
}
// J=0.0
for(i=0i<漏销ni++)
{
//J=J+y[i]+y[i+1]
J+=y[i]//将所有纵坐标值代数相加,存入J
}
//J=J*h/2.0
J=J*h//所有微元面积一次求解,因为∑h*y[i]=h*∑y[i]
printf("\nn=%d \n所求定积分值是: %f\n",n,J)
}
我将//J=J+y[i]+y[i+1]改为J+=y[i]将//J=J*h/2.0改纳搜伍为J=J*h只是帮助lz理解
其实,这两种表达在理论上是等价的,不过我发现修改后,在n同样大小的情况下,结果的精度有一点点下降,还真不知为什么???
这样的话lz应该能理解了吧,其实一楼的算法还有不少值得改进的地方,希洞或望lz能有所突破!!
这个是标准正态分布的积分。求行信搜出a0+a1x1+a2x2+a3x3+a4x4+a5x5+a6x6+a7x7+a8x8,然后查正态分布表
P=φ(a0+a1x1+a2x2+a3x3+a4x4+a5x5+a6x6+a7x7+a8x8)
对于这种∅坦念(t)=1/√2π exp(-t^2/2)求不出不定积分的函数,软件和程序只能估算出他们在一个
已知的档历数值处的积分值。。因为a0+a1x1+a2x2+a3x3+a4x4+a5x5+a6x6+a7x7+a8x8不是个已知的数值,所以算不出来的。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)