c語言微分
❶ 用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能有所突破!!
❷ 怎樣用c語言實現理想微分pid簡單的計算機繪圖程序
這是C語言的程序用的的積分分離,增量式演算法你可以看看~在我用的片子是89C52
/*********************************************************/
/* 名稱: float PIDprocess1 */
/* 功能: PID adjust */
/* 說明: */
/* 調用: */
/* 輸入: float xdata *Yn, float xdata *Rn */
/* 返回值: deltaPn */
/*********************************************************/
float PIDprocess1()
{
int data E_0;
float data deltaPn,deltaPi,deltaPp,deltaPd,PsumCopy;
E_0=SetTemperature1-CurrentTemperature1;
if(abs(E_0)>Emax)
{
deltaPp=(float)Kp*(E_0-E_11);
deltaPd=(float)Kd*(E_0-2*E_11+E_21);
// if(deltaPd>=dPdmax) deltaPd=0;
deltaPn=deltaPp+deltaPd;
}
else
{
if(abs(E_0)>E0)
{
deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);
}
else
{ //小誤差時的處理
deltaPi=(float)Ki*E_0;
// if(fabs(deltaPi)<dPimin) deltaPi=0;
}
deltaPp=(float)Kp*(E_0-E_11);
deltaPd=(float)Kd*(E_0-2*E_11+E_21);
// if(deltaPd>=dPdmax) deltaPd=0;
deltaPn=deltaPp+deltaPi+deltaPd;
}
/* if(fabs(deltaPn)>dPmax)
{
if(deltaPn>0) deltaPn=dPmax;
else deltaPn=-dPmax;
} */
Psum1+=deltaPn;
PsumCopy=Psum1;
if(PsumCopy>Pmax) PsumCopy=Pmax;
if(PsumCopy<Pmin) PsumCopy=Pmin;
E_21=E_11;
E_11=E_0;
return(PsumCopy);
}
/*********************************************************/
/* 名稱: float PIDprocess2 */
/* 功能: PID adjust */
/* 說明: */
/* 調用: */
/* 輸入: float xdata Yn, float xdata Rn */
/* 返回值: Psum2 */
/*********************************************************/
float PIDprocess2()
{
int data E_0;
float data deltaPn,deltaPi,PsumCopy;
E_0=SetTemperature2-CurrentTemperature2;
if(abs(E_0)>Emax)
{
deltaPn=(float)Kp*(E_0-E_12)+(float)Kd*(E_0-2*E_12+E_22);
}
else
{
if(abs(E_0)>E0)
{
deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);
}
else
{ //小誤差時的處理
deltaPi=(float)Ki*E_0;
}
deltaPn=(float)Kp*(E_0-E_12)+deltaPi+(float)Kd*(E_0-2*E_12+E_22);
}
/* if(fabs(deltaPn)>dPmax)
{
if(deltaPn>0) deltaPn=dPmax;
else deltaPn=-dPmax;
}*/
Psum2+=deltaPn;
PsumCopy=Psum2;
if(PsumCopy>Pmax) PsumCopy=Pmax;
if(PsumCopy<Pmin) PsumCopy=Pmin;
E_22=E_12;
E_12=E_0;
return(PsumCopy);
}
❸ 微積分用C語言怎麼表達編程
c不是專門用來運算的,所以說你也不用期待有幾個符號加上函數就能求出微分和積分。如果實在要算微積分只能用微元法,把間隔取得足夠小,用數值方法算出微分和積分
❹ 如何編寫C語言程序求解這個微分方程
沒微分方程應該用MATLAB解決
❺ C語言如何實現微積分運算
計算微積分有很多數值逼近的演算法,任何可以計算微積分的語言都是用這種方法比如插值多項式,構造數值積分來計算的。只有近似值,沒有準確值。你需要自己編程,編運算方法來計算。具體的lz去參看相關的書籍,比如計算方法
❻ C語言 經典R-K方法解微分方程 謝謝大家了,新手~~最好還寫點說明,非常感謝!!
#include<stdio.h>
/*
針對你給的問題
dy/dt=t/y
y(2.0)=1 2.0<=t<=2.6 h=0.2 怎麼輸入、輸出呢?
*/
double f(double x,double y)//這是你給的問題的函數t/y
{
return x/y;
}
void Runge_Kutta4(double y0,double x0,double h,double b)//四階的Runge_Kutta法
{
double y1;double k[4];int i=0;
while (1){
i++;
k[0]=f(x0,y0);
k[1]=f(x0+h/2.0,y0+h*k[0]/2.0);
k[2]=f(x0+h/2.0,y0+h*k[1]/2.0);
k[3]=f(x0+h,y0+h*k[2]);
y1=y0+h*(k[0]+2*k[1]+2*k[2]+k[3])/6.0;
printf("%d\t%f\t%f\n",i,x0+h,y1);//這里是C語言的輸出
//cout<<i<<'\t'<<x0+h<<'\t'<<y1<<'\n'; 這是C++語言的輸出
if(x0+2*h>=b)break;
y0=y1;x0=x0+h;
}
}
void main()
{
Runge_Kutta4(1.0,2.0,0.2,2.6);
}
結果:
1 2.200000 1.356505
2 2.400000 1.661361
全改C語言了 如有不明再問我吧
你的串號我已經記下,採納後我會幫你製作