误差界eps%被积函数为f(x)=(x^3+sin(x))/x;积分区间为[03,08]
#include<stdioh>
#include<stdlibh>
#include<mathh>
int main(void)
{
/ int i,j,n;
float d=(float )malloc(sizeof(float)N);
float x=(float )malloc(sizeof(float)N);
float y=(float )malloc(sizeof(float)N);
float u=(float )malloc(sizeof(float)N);
free(a);free(b);free(c);free(d);free(x);free(y);free(l);
return 0;
/
double b=08;
double a=03;
double h=00; //
double eps=10e-5;//误差界eps
int kmax=20; //最大递推次数
double T1=00,S1=00,C1=00,R1=00,T2=00,S2=00,C2=00,R2=00;
double sum;
double x,fx;
int i;
h=b-a;
T1=h/2((pow(a,3)+sin(a))/a+(pow(b,3)+sin(b))/b);
printf("T1:%1312f\n",T1);
for(int k=0;k<kmax;k++)
{
h=(b-a)/(pow(2,k+1));
x=(double )malloc(sizeof(double)int(pow(2,k)));
for(i=0;i<pow(2,k);i++)
{
x[i]=a+(2i+1)h;
}
fx=(double )malloc(sizeof(double)int(pow(2,k)));
sum=00;
for(i=0;i<pow(2,k);i++)
{
fx[i]=(pow(x[i],3)+sin(x[i]))/x[i];
sum+=fx[i];
}
T2=T1/2+sumh;
printf("T2:%1312f\n",T2);
S2=T2+(T2-T1)/3;
printf("S%d:%1312f\n",int(pow(2,k)),S2);
if(k<2)
{
if(k==1)
{
C2=S2+(S2-S1)/15;
printf("C1:%1312f\n",C2);
}
}
else
{
C2=S2+(S2-S1)/15;
printf("C%d:%1312f\n",int(pow(2,k-1)),C2);
R2=C2+(C2-C1)/63;
printf("R%d:%1312f\n",int(pow(2,k-2)),R2);
if(fabs(R2-R1)<eps)
break;
R1=R2;
}
T1=T2;S1=S2;C1=C2;
free(x);free(fx);
}
printf("所求积分I=%1312f\n",R2);
return 0;
}
Excel中只能实现带积分符号的函数显示,而不能实现积分的运算。
显示函数可以使用插入公式来进行编辑显示。
专业的公式编辑器可以编辑所有的公式功能。它无论是Word、Excel还是PowerPoint中都可以使用。
退出公式编辑器就可以见到完整的公式了。
同时需要注意的是,公式编辑器是OFFICE在安装时的一个选项,如果在安装时此项没有选的话,是不能进行公式编辑的。遇到没有安装的情况,可以通过重新更改安装OFFICE来解决。
积分是微分的逆运算,即知道了函数的导函数,反求原函数。在应用上,积分作用不仅如此,它被大量应用于求和,通俗的说是求曲边三角形的面积,这巧妙的求解方法是积分特殊的性质决定的。
画图程序:
x=linspace(-02,07,100);
f1=x;
f2=31055x^5-515x^4+22945x^3-04345x^2+11845x;
plot(x,f1,x,f2,'r');
首先是求交点,也就是求方程的根,如下:
f=@(x)31055x^5-515x^4+22945x^3-04345x^2+01845x;
z=fzero(f,07)
z =
06704
两个根为06704和0;
然后就是分别求积分,也就是与X轴的面积,再相减就是所围的面积
>> data=@(x)31055x^5-515x^4+22945x^3-04345x^2+11845x;
y1=quad(data,0,06704)
y1 =
02459
>> f=@(x)x;
y2=quad(f,0,06704)
y2 =
02247
>> ff=y1-y2
ff =
00212
ff即为面积!!!
题主给出的积分函数,用matlab 求解,可以这样做
1、确定x在-300,300中,取若干个x(i)数据,如
x=-300:10:300;
2、使用for循环语句,将x(i)代入积分函数I(x)中,使用int函数计算其积分值,同时将值赋值给Ix数组变量中
for n=1:600/t+1
syms x
A_1=int(cos((pi(x^2))/2),x,a1(1,n),a2(1,n));
A_2=int(sin((pi(x^2))/2),x,a1(1,n),a2(1,n));
Ix(n)=1000(lambda/(2L))((A_1)^2+(A_2)^2);
end
3、最后用plot函数,绘出其x—I(x)的图形
运行程序,可以得到如下结果。
Matlab计算定积分的具体步骤如下:
1、以f(x)=e^2x+sin(x+π/3) ,积分下限:a=0,积分上限:b=π/4 为例。首先,建立被积函数M文件;点击New,选择Function;
2、在编辑器中输入指令:function f=f(x);f=exp(2x)sin(x+pi/3);(注意,用 )
3、保存函数文件到自己的工作路径,比如G:\matlab\work。
输入指令:cd G:\matlab\work,是该路径成为当前路径。
4、matlab中计算积分的两种指令:
1F=quad('fname',a,b,tol,trace) Simpson数值积分法
2F=quad8('fname',a,b,tol,trace) Newton-Cotes数值积分法
其中: fname是被积函数表达式或函数名,a,b分别是上下限,tol可以控制积分精度,省略则取0001;trace=1则用图形表示积分过程,trace=0,没有图形。
两者 比较,quad8精度更高。
5、调用积分函数squad进行计算。输入指令: F=quad('f(x)',0,pi/4),如图,回车后可得到计算结果18612。其他函数,只要修改函数文件中的表达式即可。
问题就是出在数据类型上的选用上,precision=00000001时已经超过了float的数据范围,所以导致数据截断后precision=0000000,从而程序在计算积分时可能陷入死循环,应该采用double型数据类型。其实不推荐楼主用如此多的define语句,程序的可读性和风格应该重于编程员的劳动度。。。
还有楼主对自然对数e的define也已经超过了计算机的可识别范围。。您那样精确的定义e并不会在结果上获得更加精确地结果,其实反倒会起到相反的作用,要知道与其用一个这样可能导致内存出错以及必定会导致数据截断的变量来实现精度的提高远远不如采用一个更精确的积分算法,而且c语言提供了自然数e为底的指数函数~而且貌似您的积分算法是不准确的,梯形积分的定义并非如此,其再两端的函数值应该只取1/2希望您多加细心~
如果不介意的话,就是你的precision应该改为step~这样会能更加准备的表达了这个变量的作用,在你的程序中precision变量其实是积分步长~在数值计算方法中积分精度的控制往往不是通过细化步长来表达,而是通过后一个积分值-前一个积分值<precision 这样来实现精度控制~呵呵
#include<stdioh>
void main()
{ double n ,s,f0,h,x,i;
printf("输入区间分隔数n:");
scanf("%lf",&n); //这里是字母l,不是数字
h=10/n;
f0=40;
s=00;
for(i=1;i<n;i++)
{ s+=f0h; x=ih;
f0=40/(10+xx);}/∫4/(1+xx)dx 积分上下限位0到1/
printf("用矩形法求得定积分为:%1f\n",s); }
以上就是关于用Romberg算法计算下列积分的C语言程序全部的内容,包括:用Romberg算法计算下列积分的C语言程序、用Excel计算积分如何进行、求一段matlab求积分程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)