对于一重定积分来说其求解可以使用梯形法进行求解,计算公式如下所示:
创新互联主营长丰网站建设的网络公司,主营网站建设方案,成都app软件开发,长丰h5重庆小程序开发搭建,长丰网站营销推广欢迎长丰等地区企业咨询
其中,f(x)为被积函数,为横坐标的两点间的间隔,越小,则计算出的结果越精确。
对于求解此类问题可以使用C语言中的回调函数编写通用的计算函数,代码如下:
#include stdio.h
#include stdlib.h
#includemath.h
//功能:返回f(x)在积分区间[a,b]的值
//参数:FunCallBack 指向用于计算f(x)的函数
// a 积分区间的起始值
// b 积分区间的结束值
// dx 横坐标的间隔数,越小计算结果越准确
double Calculate(double (*FunCallBack)(double x),
double a,double b,double dx)
{
double doui;
double total = 0; //保存最后的计算结果
for (doui = a; doui = b; doui += dx)
{
total += FunCallBack(doui)*dx;
}
return total;
}
double f2(double x)
{
return x*x;
}
double f(double x)
{
return x;
}
double f3(double x)
{
return x*x*x ;
}
int main()
{
double total;
total = (Calculate(f, 2, 3, 0.000001));
printf("total = %lf\n", total);
total = (Calculate(f2, 2, 3, 0.000001));
printf("total = %lf\n", total);
total = (Calculate(f3, 2, 3, 0.000001));
printf("total = %lf\n", total);
return 0 ;
}
其中,函数f,f2,f3为自行编写的关于x的被积函数。
运行结果:
total = 2.500000
total = 6.333331
total = 16.249991
积分分为两种,数值积分,公式积分。
公式积分:部分函数可以直接用公式求得其不定积分函数。C语言中可以直接用积分公式写出其积分函数。
数值积分:按照积分的定义,设置积分范围的步长,用梯形面积累加求得其积分。
以【f(x)=x*sin(x) 从1到2的积分】为例:
#include math.h
#include stdio.h
double integral(double(*fun)(double x),double a,double b,int,n){
double s,h,y;
int i;
s=(fun(a)+fun(b))/2;
h=(b-a)/n; /*积分步长*/
for(i=1;in;i++)
s=s+fun(a+i*h);
y=s*h;
return y;/*返回积分值*/
}
double f(double x){
return(x*sinx) /*修改此处可以改变被积函数*/
}
int main(){
double y;
y=integral(f,1.0,2.0,150);/*修改此处可以改变积分上下限和步数,步长=(上限-下限)/步数*/
printf("y=%f\n",y);
return 0;
}
typedef struct{
float limit; //输出限幅
float target; //设置量
float feedback; //实测量
float Kp; //比例系数
float Ki; //积分系数
float Kd; //微分系数
float eSum; //误差积分
float e0; //当前误差
float e1; //上一次误差
}PIDType;
#define max(a, b) (ab? a:b)
#define min(a, b) (ab? a:b)
#define range(x, a, b) (min(max(x, a), b))
float pid_pos_update(PIDType *p)
{
float pe, ie, de;
float out=0;
//计算当前误差
p-e0 = p-target - p-feedback;
//误差积分
p-eSum += p-e0;
//误差微分
de = p-e0 - p-e1;
pe = p-e0;
ie = p-eSum;
p-e1 = p-e0;
//数据增量
out = pe*(p-Kp) + ie*(p-Ki) + de*(p-Kd);
//输出限幅
out = range(out, -p-limit, p-limit);
return out;
}
double thelta = 1e-7;
double a = 0,b = B;
double result = 0;
for(double t = a;tb;t+=thelta)
{
result+=t*M(t);
}
M那个函数你自己编个函数就行了;