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#includefloat f1(float x)
{
return(1.0+x);
}
float f2(float x)
{
return(2.0*x+3.0);
}
float f3(float x)
{
return(exp(x)+1);
}
float f4(float x)
{
return(pow(1+x,2));
}
float f5(float x)
{
return(pow(x,3));
}
float fsimp(float a,float b,float (*p)(float))
{
float c,s;
c=(a+b)/2;
s=(b-a)/6*(p(a)+4*p(c)+p(b));
return s;
}
int main()
{
float a,b;
printf("請輸入積分下限a的值:");
scanf("%f",&a);
printf("請輸入積分上限b的值:");
scanf("%f",&b);
printf("%f ",fsimp(a,b,f1));
}
(2)c語言積分函數擴展閱讀
1、對應於一個積分式要有一段程序,可以改變程序的一小部分來改變所要求的積分式。
2、除數不能位0。
3、兩個整數相除,結果仍是整數。
4、若被除數其中有一個為浮點數或者兩個都為浮點數,則結果為浮點類型。操作數必須為整數,不能是浮點數。
㈢ 怎樣編寫c語言積分函數
積分分為兩種,數值積分,公式積分。
公式積分:部分函數可以直接用公式求得其不定積分函數。C語言中可以直接用積分公式寫出其積分函數。
數值積分:按照積分的定義,設置積分范圍的步長,用梯形面積累加求得其積分。
以【f(x)=x*sin(x) 從1到2的積分】為例:
#include<math.h>
#include<stdio.h>
doubleintegral(double(*fun)(doublex),doublea,doubleb,int,n){
doubles,h,y;
inti;
s=(fun(a)+fun(b))/2;
h=(b-a)/n;/*積分步長*/
for(i=1;i<n;i++)
s=s+fun(a+i*h);
y=s*h;
returny;/*返回積分值*/
}
doublef(doublex){
return(x*sinx)/*修改此處可以改變被積函數*/
}
intmain(){
doubley;
y=integral(f,1.0,2.0,150);/*修改此處可以改變積分上下限和步數,步長=(上限-下限)/步數*/
printf("y=%f ",y);
return0;
}
㈣ 用C語言計算微積分
我給一樓加的注釋以及修改:
#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能有所突破!!