#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能有所突破!!
1、微积分工具(App)
英文名:CalculusTools数学软件,用来计算导数、定积分、弧长、泰勒级数,绘制函数对应的图,包括极坐标和参数以及斜率场。此外,还包括积分表和自定义键盘。
2、matlab7.0
是MathWorks出品一款的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
是一款积分,微分,函数等都可以进行计算的软件。
扩展资料:
关于matlab7.0的主要功能
1、交互式工具可以按迭代的方式探查、设计及求解问题
2、此高级语言可用于技术计算
3、此开发环境可对代码、文件和数据进行管理
4、各种工具可用于构建自定义的图形用户界面
5、各种函数可将基于MATLAB的算法与外部应用程序和语言(如C、C++、Fortran、Java、COM以及MicrosoftExcel)集成
6、数学函数可用于线性代数、微积分、统计、傅立叶分析、筛选、优化以及数值积分等
7、二维和三维图形函数可用于可视化数据。
参考资料来源:百度百科——微积分工具
参考资料来源:百度百科——matlab7.0
辛普森法#include <stdio.h>
#include <math.h>
#define F(X) (4.0/(1+X*X))
static float EPS = 1.0E-14
static int COUNT=1
static double a=0.0, b=1.0
static double M[32],T[32],S[32],C[32],R[32],E[32]
double GETM(int K)
{ unsigned long j,n=1
double x=0,y=0,step=0
for(j=0j<Kj++) n*=2
step = (b-a)/n
x = a+step/2
for(j=0j<nj++){y+=F(x)x+=step}
return (y*step)
}
Simpson(float EPS)
{ int k=0
T[0]= (b-a)*(F(a)+F(b))/2.0
S[0]=T[0]
E[0]=1.0E10
for(k=0k<20k++)
{ M[k] = GETM(k)
T[k+1]=(M[k]+T[k])/2.0
S[k+1]=(4.0*T[k+1]-T[k])/3.0
COUNT++
E[k+1]=fabs(S[k+1]-S[k])
if(k<3)continue
if(E[k+1]<EPS)break
}
return
}
ShawResult()
{ int k
system("cls")
printf("\n K M[K] T[K] S[K]")
printf(" E[K]")
printf("\n-------------------------------------------")
printf("-----------------------------------")
for(k=0k<COUNTk++)
printf("\n%2d %20.15lf%20.15lf%20.15lf%12.4e",k,M[k],T[k],S[k],E[k])
printf("\n--------------------------------------------")
printf("-----------------------------------")
getch()
system("cls")
return
}
SaveResult()
{ int k
FILE * fp
fp=fopen("Simpson.htm","w")
if(!fp) return
fprintf(fp,"<html><head></head>")
fprintf(fp,"<body bgcolor = #006699 text = #FFff00>")
fprintf(fp,"<pre><font size=\"6\">")
fprintf(fp,"\n K M[K] T[K] S[K]")
fprintf(fp," E[K]")
fprintf(fp,"\n----------------------------------------------")
fprintf(fp,"----------------------------------")
for(k=0k<COUNTk++)
fprintf(fp,"\n%2d %20.15f%20.15f%20.15f%12.4le",k,M[k],T[k],S[k],E[k])
fprintf(fp,"\n----------------------------------------------")
fprintf(fp,"----------------------------------")
fprintf(fp,"</pre></font></body>")
fclose(fp)
return
}
main()
{ Simpson(EPS)
ShawResult()
SaveResult()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)