新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
问题就是出在数据类型上的选用上,precision=0.0000001时已经超过了float的数据范围,所以导致数据截断后precision=0.000000,从而程序在计算积分时可能陷入死循环,应该采用double型数据类型。其实不推荐楼主用如此多的define语句,程序的可读性和风格应该重于编程员的劳动度。。。
成都创新互联公司专注于企业成都全网营销、网站重做改版、龙泉网站定制设计、自适应品牌网站建设、H5页面制作、商城网站建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为龙泉等各大城市提供网站开发制作服务。
还有楼主对自然对数e的define也已经超过了计算机的可识别范围。。您那样精确的定义e并不会在结果上获得更加精确地结果,其实反倒会起到相反的作用,要知道与其用一个这样可能导致内存出错以及必定会导致数据截断的变量来实现精度的提高远远不如采用一个更精确的积分算法,而且c语言提供了自然数e为底的指数函数~而且貌似您的积分算法是不准确的,梯形积分的定义并非如此,其再两端的函数值应该只取1/2.希望您多加细心~
如果不介意的话,就是你的precision应该改为step~这样会能更加准备的表达了这个变量的作用,在你的程序中precision变量其实是积分步长~在数值计算方法中积分精度的控制往往不是通过细化步长来表达,而是通过后一个积分值-前一个积分值precision 这样来实现精度控制~呵呵
积分分为两种,数值积分,公式积分。
公式积分:部分函数可以直接用公式求得其不定积分函数。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;
}
下面的代码就是使用矩形法求定积分的。
分别求了sin(x) cos(x) e^x 的定积分
#include iostream
#include cmath
using namespace std;
float integral (float (*p) (float), float a, float b, int n);
float fsin (float); // 对fsin函数作声明
float fcos (float); // 对fcos函数作声明
float fexp (float); // 对fexp函数作声明
int main()
{
float a1, b1, a2, b2, a3, b3, c, (*p) (float);
int n = 40; // 划分40个小矩形
cout "input a1,b1(sin(x) 定积分的下限和上限):"; //输入求sin(x) 定积分的下限和上限
cin a1 b1;
cout "input a2,b2:(cos(x) 定积分的下限和上限 )"; // 输入求cos(x) 定积分的下限和上限
cin a2 b2;
cout "input a3,b3:(e^x定积分的下限和上限)";
cin a3 b3;
p = fsin;
c = integral(p, a1, b1, n); // 求出sin(x)的定积分
cout "The integral of sin(x) is :" c endl;
p = fcos;
c = integral(p, a2, b2, n); // 求出cos(x)的 定积分
cout "The integral of cos(x) is :" c endl;;
p = fexp;
c = integral(p, a3, b3, n); // 求出 的定积分
cout "The integral of exp(x) is :" c endl;
return 0;
}
float integral(float (*p) (float), float a, float b, int n)
//用矩形法求定积分的通用函数
{
int i;
float x, h, s;
h = (b - a) / n;
x = a;
s = 0;
for (i = 1; i = n; i++)
{
x = x + h;
s = s + (*p) (x) * h;
}
return(s);
}
float fsin(float x) // 计算sin(x) 的函数
{
return sin(x);
}
float fcos(float x) // 计算cos(x) 的函数
{
return cos(x);
}
float fexp(float x) // 计算exp(x)的函数
{
return exp(x);
}
源代码如下:
#include#includefloat f1(float x)
{
return(1.0+x);
}
float f2(float x)
{
return(2.0*x+3.0);
}
float f3(float x)
{
return(exp(x)+1);
}
float f4(float x)
{
return(pow(1+x,2));
}
float f5(float x)
{
return(pow(x,3));
}
float fsimp(float a,float b,float (*p)(float))
{
float c,s;
c=(a+b)/2;
s=(b-a)/6*(p(a)+4*p(c)+p(b));
return s;
}
int main()
{
float a,b;
printf("请输入积分下限a的值:");
scanf("%f",a);
printf("请输入积分上限b的值:");
scanf("%f",b);
printf("%f\n",fsimp(a,b,f1));
}
扩展资料
1、对应于一个积分式要有一段程序,可以改变程序的一小部分来改变所要求的积分式。
2、除数不能位0。
3、两个整数相除,结果仍是整数。
4、若被除数其中有一个为浮点数或者两个都为浮点数,则结果为浮点类型。操作数必须为整数,不能是浮点数。