用C语言计算微积分?

Python013

用C语言计算微积分?,第1张

我给一楼加的注释以及修改:

#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能有所突破!!

辛普森法

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

}

计算微积分有很多数值逼近的算法,任何可以计算微积分的语言都是用这种方法比如插值多项式,构造数值积分来计算的。只有近似值,没有准确值。你需要自己编程,编运算方法来计算。具体的lz去参看相关的书籍,比如计算方法