按如下函数原型,采用梯形法编程实现(分成100个小梯形,再求这100个梯形面积的和)),在积分区间[a,b]内计算函数
y1=∫10(1+x2)dx和y2=∫30x1+x2dx的定积分。其中,指向函数的指针变量f用于接收被积函数的入口地址。 Integral(float (*f)(float), float a, float b);
**输出格式要求:"y1=%f\ny2=%f\n"
知识点:利用梯形法计算定积分
方法一:
#include #include #include float Fun1(float x); float Fun2(float x); float Integral(float (*f)(float), float a, float b); ///这是函数引用说明,第一个float表示函数返回值为浮点型,f表示函数名,第二个float表示参数类型是浮点型。 int main() { float y1, y2; y1 = Integral(Fun1, 0.0, 1.0); y2 = Integral(Fun2, 0.0, 3.0); printf("y1=%f\ny2=%f\n", y1, y2); } float Fun1(float x) { return 1 + x * x; } float Fun2(float x) { return x / (1 + x * x); } float Integral(float (*f)(float), float a, float b) { int i, n = 100; float s = 0, h = 0; h = (b - a) / n; //将高分为100份 s = ((*f)(a) + (*f)(b)) / 2; // 第一条上底 和最后一条下底 for (i = 1; i < n; i++) //注意是 小于 不是 小于等于 { s += (*f)(a + i * h); //除了第一和最后 , 其它都是上次 ,所以不需要除二 //(a + i * h) ==下底 } return s * h; }
方法二:
#include #include #include float Fun1(float x); float Fun2(float x); float Integral(float (*f)(float), float a, float b); int main() { float y1, y2; y1 = Integral(Fun1, 0.0, 1.0); y2 = Integral(Fun2, 0.0, 3.0); printf("y1=%0.2f\ny2=%0.2f\n", y1, y2); } float Fun1(float x) { return 1 + x * x; } float Fun2(float x) { return x / (1 + x * x); } float Integral(float (*f)(float), float a, float b) { float sum = 0; int i, n = 100; float s = 0, h = 0; h = (b - a) / n; // 把高分成100份 for (i = 1; i <= n; i++) { s = ((*f)(a + (i-1)*h) + (*f)(a + i * h))*h / 2; //(*f)== 函数表达式(fun函数) //a + i * h == 下底 //a + (i - 1)* h == 上底 sum = sum + s; } return sum; }
[…] 代码实例:采用梯形法编程实现计算函数定积分(指针) […]