c语言 求定积分的通用函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 求定积分的通用函数相关的知识,希望对你有一定的参考价值。

请问这里哪里错了???
#include<stdio.h>
#include<math.h>
void main()

float integral(float a,float b,float(*p)(float x) );
float f1(float x);
float f2(float x);
float f3(float x);
float f4(float x);
float f5(float x);

float x;
float a=5,b=7;
float result;
printf("请输入x的值:\n");
scanf("%f",&x);

result=integral(a,b,f1);
result=integral(a,b,f2);
result=integral(a,b,f3);
result=integral(a,b,f4);
result=integral(a,b,f5);

float f1(float x)

float s;
s=1+x;
return s;

float f2(float x)

float s;
s=2*x+3;
return s;

float f3(float x)

float s;
s=(float)exp(x)+1; //e的x次方+1
return s;

float f4(float x)

float s;
s=(1+x)*(1+x);
return s;

float f5(float x)

float s;
s=x*x*x;
return s;

float integral(float a,float b,float(*p)(float x) )

float i,result,x;
for(i=a;i<=b;i++)

result+=(*p)(x);

return result;
printf("结果是: %3.3f",result);

对于一重定积分来说其求解可以使用梯形法进行求解,计算公式如下所示:

其中,f(x)为被积函数,为横坐标的两点间的间隔,越小,则计算出的结果越精确。

对于求解此类问题可以使用C语言中的回调函数编写通用的计算函数,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include<math.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

参考技术A float integral(float a,float b,float(*p)(float x) )

float i,result,x;
for(i=a;i<=b;i++)

result+=(*p)(x);

return result;
printf("结果是: %3.3f",result);


这里错了,return result;
printf("结果是: %3.3f",result);
换一个位置,return 就跳出函数了,不会打印出来本回答被提问者采纳
参考技术B 哥们儿?你这代码能运行?我复制你的怎么不行呀? 参考技术C 我也没有试,就看了一下,上面的函数调用时,参数的定义在下面,没定义先用,不服合语法吧追问

没呢。。不过我在主函数那里声明了喔。。

追答

我的意思是,你的声明在下面,可上面调用的时候,参数还没声明啊,我是这个意思

追问

噢。。原来这样啊。。

追答

你改好了,哪里错了呢

追问

最后 return result; 那里错了,我先跳了出来所以结果输不出来,谢谢你帮忙啦。。。

追答

啊,这到没事,不过,那种声明在下面的语法居然没错?我还真没那样学过。恩,C中,return是结束语。这到是,当时只顾看上面那些,没看下面,呵呵。我也受教了。

Matlab中不定积分和定积分的实现

MATLAB提供的用于积分运算的函数是int( )(不定积分和定积分)和quad( )(定积分的数值计算),首先学习int( )的用法,int( )可以完成函数的不定积分和定积分运算,它先求出函数的原函数,如果需要求定积分,则在原函数的基础上按牛顿-莱布尼兹公式求定积分的值:

  • int(fun) 计算函数fun关于默认变量的不定积分
  • int(fun, x) 计算函数fun关于变量x的不定积分
  • int(fun, x, a, b) 计算函数fun关于变量x从a到b的定积分

计算不定积分 ∫ ( x 5 + x 3 − x 4 ) d x \\int(x^5+x^3-\\frac{\\sqrt{x}}{4})dx (x5+x34x )dx

使用下面程序实现

clear
syms x
y=x^5+x^3-sqrt(x)/4
int(y,x)
pretty(ans)

效果为
在这里插入图片描述
计算定积分 ∫ 0 1 ( x e x ( 1 + x ) 2 ) d x \\int_{0}^{1}(\\frac{xe^x}{(1+x)^2})dx 01((1+x)2xex)dx

使用下面程序实现

clear
syms x
y=(x*exp(x))/(1+x)^2;
int(y,x,0,1)

效果为
在这里插入图片描述

计算广义积分 ∫ − 2 − 1 ( 1 x ( x 2 − 1 ) ) d x \\int_{-2}^{-1}(\\frac{1}{x\\sqrt{(x^2-1)}})dx 21(x(x21) 1)dx

使用下面程序实现

clear
syms x
int(1/x/sqrt(x*x-1),x,-2,-1)

效果为
在这里插入图片描述
计算广义积分 ∫ − ∞ + ∞ ( 1 ( x 2 + 1 ) + ( x 2 + 4 ) ) d x \\int_{-\\infty}^{+\\infty}(\\frac{1}{(x^2+1)+(x^2+4)})dx +((x2+1)+(x2+4)1)dx

使用下面程序实现

clear
syms x
int(1/(x*x+1)/(x*x+4),x,-inf,inf)

效果为
在这里插入图片描述
并非所有的积分都可以用MATLAB软件通过函数int( )来完成运算,函数int( )完成的是符号运算而不是数值运算,因此,当积分不存在初等形式的原函数时,函数int( )便不能完成积分运算。所以下面将使用quad()进行数值积分计算:
quad(fun,a,b),其中fun是被积函数,a是积分下限,b是积分上限,fun一般用函数文件来定义

计算定积分 ∫ 0 π ( x s i n x 1 + c o s 2 x ) d x \\int_{0}^{\\pi}(\\frac{xsinx}{1+cos^2x})dx 0π(1+cos2xxsinx)dx

首先定义被积函数, 在磁盘上建立一个函数文件f.m, 内容如下:

function y=f(x)
y=x.*sin(x)./(1+cos(x).^2)

接着,在另一个文件或命令窗口中输入:

I=quad(@f,0,pi

效果为
在这里插入图片描述
计算积分 ∫ − 1 1 g ( x ) d x \\int_{-1}^{1}g(x)dx 11g(x)dx,其中
g ( x ) = { 1 + x 2 c o s x x ≤ 0 e − x s i n x x > 0 g(x)=\\left\\{ \\begin{array}{lr} 1+x^2cosx & x \\leq 0 \\\\ e^{-x}sinx & x >0 \\\\ \\end{array} \\right. g(x)={1+x2cosxexsinxx0x>0

建立磁盘文件g.m如下:

function y=g(x)
if x<=0
	y=1+x.*x.*cos(x)
else
	y=exp(-x).*sin(x)
end

接着,在另一个文件或命令窗口中输入:

I=quad(@g,-1,0)+quad(@g,0,1)

在这里插入图片描述
如果被积函数是一个分段函数,则需要以分段点为界为开积分,否则有可能出现错误

以上是关于c语言 求定积分的通用函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言求函数定积分

用C语言编写一个求定积分的程序

用C语言求定积分

C语言如何求定积分?

急!!!利用函数指针变量编写一个求定积分的通用函数,

matlab求定积分和不定积分