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语言了  如有不明再问我吧
你的串号我已经记下,采纳后我会帮你制作
