数值积分方法求解答

数值积分方法求解答,第1张

在数值分析中,数值积分是计算定积分数值的方法和理论。在数学分析中,给定函数的定积分的计算不总是可行的。许多定积分不能用已知的积分公式得到精确值。数值积分是利用黎曼积分和积分中值等数学定义和定理,用数值逼近的方法近似计算给定的定积分值。借助于电子计算设备,数值积分可以快速而有效地计算复杂的积分,能够以简单的方法求解具体数值问题,但数值积分的难点在于计算时间有时会过长,有时会出现数值不稳定现象,需要较强的理论支撑。 黎曼积分(Riemann integral) 在实数分析中,由黎曼创立的黎曼积分(Riemann integral)首次对函数在给定区间上的积分给出了一个精确定义。对于一在区间上之给定非负函数,我们想要确定所代表的曲线与坐标轴所夹图形的面积,作为曲线与坐标轴所夹面积的黎曼积分。黎曼积分的核心思想就是试图通过无限逼近来确定这个积分值。如函数取负值,则相应的面积值亦取负值。 积分中值定理(Mean value theorem of integrals) 积分中值定理揭示了一种将积分化为函数值,或者是将复杂函数的积分化为简单函数的积分的方法,若函数f(x) 在 闭区间[a, b]上连续,则在积分区间[a, b]上至少存在一个点ξ,使下式成立 Integral(f(x)) on [a, b] = f(ξ)(b - a) 其中,a、b、ξ满足:a≤ξ≤b, 数值积分的必要性 数值积分的必要性源自计算函数的原函数的困难性。利用原函数计算定积分的方法建立在牛顿-莱布尼兹公式之上。然而,原函数可以用初等函数表示的函数为数不多,大部分的可积函数的积分无法用初等函数表示,甚至没有解析表达式(“积不出来”的函数)。例如常见的正态分布函数的原函数就无法用初等函数表示。 不仅如此,在很多实际应用中,可能只能知道积分函数在某些特定点的取值,或者积分函数可能是某个微分方程的解,这些都是无法用求原函数的方法计算函数的积分。另外,当积分区域是曲面、三维形体以至于高维流形时,牛顿-莱布尼兹公式也不再适用,因此只能使用数值积分计算函数的近似值。 矩形法 矩形法是一种计算定积分近似值的方法,其思想是求若干个矩形的面积之和,这些矩形的高由函数值来决定。将积分区间[a, b] 划分为n个长度相等的子区间,每个子区间的长度为(a-b)/n 。这些矩形左上角、右上角或顶边中点在被积函数上。这样,这些矩形的面积之和就约等于定积分的近似值。 由函数上的点为矩形的左上角、右上角或顶边中点来决定,又分别被称为下(左)矩形公式、上(右)矩形公式和中矩形公式。当n 逐渐扩大时,此近似值更加准确。矩形法的计算本质上是与黎曼积分的定义相吻合的。上述的点无论取哪个值,最终和式的值都将趋近于定积分的值。 梯形法 为了计算出更加准确的定积分,采用梯形代替矩形计算定积分近似值,其思想是求若干个梯形的面积之和,这些梯形的长短边高由函数值来决定。这些梯形左上角和右上角在被积函数上。这样,这些梯形的面积之和就约等于定积分的近似值。 辛普森法(Simpson's rule) 矩形法和梯形法都是用直线线段拟合函数曲线的方法,另一种形式是采用曲线段拟合函数,实现近似逼近的。辛普森法(Simpson's rule)是以二次曲线逼近的方式取代矩形或梯形积分公式,以求得定积分的数值近似解。 一般插值方法 另一种数值积分的思路是用一个容易计算积分而又与原来的函数“相近”的函数来代替原来的函数。这里的“相近”是指两者在积分区间上定积分的值比较接近。最自然的想法是采用多项式函数。比如说,给定一个函数后,在积分区间中对原来的函数进行拉格朗日插值。得到拉格朗日插值多项式以后,计算这个多项式的积分。 拉格朗日插值(Lagrange Interpolation) 拉格朗日插值是一种多项式插值方法,可以找到一个多项式,其恰好在积分区间中取的各个点取到给定函数的值。这样的多项式称为拉格朗日(插值)多项式。 数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。对于给定的n+1个点,对应于它们的次数不超过n的拉格朗日多项式有且只有一个。 牛顿-科茨公式(Newton-Cotes rule / Newton-Cotes formula) 牛顿-柯特斯公式(Newton-Cotes rule / Newton-Cotes formula)是以拉格朗日多项式插值的一般方法。梯形法则和辛普森法则便是牛顿-柯特斯公式的特例情况。 由于该拉格朗日多项式的系数都是常数,所以积函数的系数都是常数。这种方法缺点是对于次数较高的多项式而有很大误差(龙格现象),不如高斯积分法。 龙格现象(Runge Phenomenon) 在数值分析领域中, 龙格现象是用高阶多项式进行多项式插值时所出现的问题。 在某些高阶多项式等距点xi 进行插值,那么插值结果就会出现震荡。可以证明,在多项式的阶数增高时插值误差甚至会趋向无限大。 解决龙格现象的办法是使用切比雪夫节点代替等距点可以减小震荡,在这种情况下,随着多项式阶次的增加最大误差逐渐减小。这个现象表明高阶多项式通常不适合用于插值。使用分段多项式样条可以避免这个问题。如果要减小插值误差,那么可以增加构成样条的多项式的数目,而不必是增加多项式的阶次。第一类切比雪夫多项式的根(即切比雪夫节点)可以用于多项式插值。相应的插值多项式能最大限度地降低龙格现象,并且提供多项式在连续函数的最佳一致逼近。 代数精度评估 的代数精度用于衡量原函数和数值积分结果两者的逼近程度。若E(f)=0对f(x)=x^k(k=0,1,…,d)精确成立,而当f(x)=x^(d+1)时不再是精确等式,则说求积公式的代数精度是d。根据K外尔斯特拉斯的多项式逼近定理,就一般的连续函数而言,d越大E(f)越小,因此可以用代数精度的高低说明数值积分公式的优劣。

如果是纯数值积分的话:sum=0d0do t1=0d0,MAXI,dt1 do t3=0d0,MAXJ,dt3 sum=sum+dt1dt3f(t1,t3) enddoenddo

syms h c x y t k

h=662617610^-27;

c=299792458010^10;

k=138066210^-16;

t=758;

f=int((2pihc^2)/x^5)/(exp((hc)/(xkt))-1)

反正程序时这样的,但是里面没有x的值,你把x的取值范围设定出来然后带进去,就可以了

t=0:001:2pi;

x=sin(t);

s_x=cumtrapz(t,x);%s_x就是x的数值积分

plot(t,x,t,s_x)

___________

楼主请您明白一点,sin(t)的不定积分是-cos(t)+C,C是任意常数,而用数值方法作出来的是定积分,是sin(t)从0积到t的积分,因此在t=0时,就是0。根据牛顿-莱布尼茨定理,其实积出来的是-cos(t)+cos(0)即1-cos(t),这才是定积分的函数曲线。从你的贴图上看,matlabguy的结果和我的结果也是一样的,都是1-cos(t),而不是您所说的cos(t)+1。你一定要得到-cos(t)的话,就把s_x再减去1即可。还有,-cos(t)和sin(t)的曲线不是重合曲线,是两条不同的曲线,甚至相互正交。要处理离散数据积分,在这几个回答之中也只有我这个方法可行了,因为你没有函数关系,无法调用Simpson函数。

《数值计算方法及其程序实现》是编著者李华教授多年以来承担暨南大学物理系硕士研究生必修课“数值计算方法”的讲授内容汇集而成。

其内容包括七个部分:绪论、误差和数据处理、线性方程组的数值解法、非线性方程(组)的数值解法、数值积分与微分、常微分方程(组)的数值解法、偏微分方程的数值解法。

这些内容通过例题分多个步骤给以展现。《数值计算方法及其程序实现》力图探索数值计算方法教学的一种新尝试,立足于数学思维而面向科学计算,适应应用型人才的培养需要,内容处理上突出数值计算方法的基本设计和内涵理解。

你这里错在调用自定义函数的时候不需要关键字function,将其去掉则不会有这个错误提示

不过看你的代码依旧存在问题:

f=int(fun,a,b); 这一行要求fun为符号类型的变量,而你给的 fun=@(x)(x/sqrt(xx+9)); 却是函数句柄,那么这一句就会报错。

另外,这个代码试图通过int()积分得到精确值,然后比较数值积分的误差是否不超过0510^-8,这就存在一个逻辑错误,如果这个被积函数不可积(这也正是采用数值积分的目的所在),那你就无法得到原函数进行判断了。所以正确的做法是比较两次计算值,如果两次计算值的误差小于0510^-8,表明积分收敛了,这正是其计算精度。

#include <stdioh>

#include <mathh>

double integrate(double (f)(double),double a,double b)

{

double i=10/1000000;

double sum=0,x;

for(x=a;x<=b;)

{

sum+=f(x)i;

x+=i;

}

return sum;

}

double f(double x)

{

return sin(x)/x;

}

int main()

{

int a=1,b=2;

printf("%lf\n",integrate(f, a, b));

return 0;

}

法一:

A1=00625;

B1=-025;

C1=0;

syms x y

eq=(A1+B1x+C1y)(sin(2pix)sin(2piy));

a1=int(eq,y,0,x);

a2=matlabFunction(a1);

a=quadl(a2,0,1)

法二:

A1=00625;

B1=-025;

C1=0;

syms x y

eq=(A1+B1x+C1y)(sin(2pix)sin(2piy));

a1=int(eq,y,0,x);

xx=0:001:1;

yy=subs(a1,x,xx);

a=trapz(xx,yy)

以上就是关于数值积分方法求解答全部的内容,包括:数值积分方法求解答、求大神编个fortran程序是能够利用高斯数值积分定理计算任意给定的单重和二重积分。、怎么用matlab计算定积分,y=((2*pi*h*c^2)/x^5)/(exp((h*c)/(x*k*t))-1) 需要得到具体的数值,谢谢了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10214443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存