#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=0;i<=n && n<ARRAYBOUND;i++)
{
x[i]=x[0]+i*h; //計算n個離散的橫坐標值,存入x[]數組
y[i]=(float)pow(x[i],3);//計算n個橫坐標對應的函數值,存入y[]數組。在此可以改變要求積分的函數
}
// J=0.0;
for(i=0;i<n;i++)
{
//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能有所突破!!