用梯形法或者辛普森法数值积分,分别用Matlab和c语言实现。
- 格式:docx
- 大小:52.73 KB
- 文档页数:4
佛山科学技术学院实验报告课程名称_______________ 数值分析________________________实验项目_______________ 数值积分____________________专业班级机械工程姓名余红杰学号2111505010 指导教师陈剑成绩日期月日一、实验目的b1、理解如何在计算机上使用数值方法计算定积分 a f ""X的近似值;2、学会复合梯形、复合Simpson和龙贝格求积分公式的编程与应用。
3、探索二重积分.11 f (x, y)dxdy在矩形区域D = {( x, y) | a _ x _ b, c _ y _ d}的数值D积分方法。
二、实验要求(1)按照题目要求完成实验内容;(2)写出相应的Matlab程序;(3)给出实验结果(可以用表格展示实验结果);(4)分析和讨论实验结果并提出可能的优化实验。
(5)写出实验报告。
三、实验步骤1、用不同数值方法计算积xln xdx =-- 0 9(1)取不同的步长h,分别用复合梯形及复合辛普森求积计算积分,给出误差中关于h的函数,并与积分精确值比较两公式的精度。
(2)用龙贝格求积计算完成问题(1 )。
2、给出一种求矩形区域上二重积分的复化求积方法,然后计算二重积分..e"y dxdy,其中积分区域D二{0乞x岂1,0岂y乞1}。
1.%lnt_t.m复化梯形:function F = Int_t(x1,x2,n)%复化梯形求积公式% x1,x2为积分起点和中点%分为n个区间,没选用步长可以防止区间数为非整数。
%样点矩阵及其函数值:x = lin space(x1,x2 ,n+1);y = f(x);m = len gth(x);%本题中用Matlab计算端点位置函数值为NaN,故化为零: y(1) = 0;y(m) = 0;%算岀区间长度,步长h:h = (x2 -x1)/n;a = [1 2*o nes(1,m-2) 1];%计算估计的积分值:F = h/2*sum(a.*y);%f.mfun cti on y = f(x)y = sqrt(x).*log(x);%run 11.mclc,clear;%分为10个区间,步长0.1的积分值:F = In t_t(0,1,10);F10 = F%分为100个区间F = In t_t(0,1,100);F100 = F%误差计算W10 = abs((-4/9)-F10);W100 = abs((-4/9)-F100);W = [W10 W100]%复化辛普森:%l nt_s.mfun cti on F = In t_s(x1,x2 ,n)%复化梯形求积公式% x1,x2区间,分为n个区间。
matlab积分公式
Matlab是一个强大的数学计算软件,它不仅可以进行各种数学运算,还可以进行数值积分。
在Matlab中,有许多积分公式可以使用,下面是其中一些常用的积分公式:
1. 梯形积分公式:该公式是用梯形面积来近似计算积分的方法,通常用于离散的数据点。
2. 辛普森积分公式:该公式是用三次方程曲线来近似计算积分的方法,通常用于连续的函数。
3. 高斯-勒让德公式:该公式是将被积函数通过一个变换变成一个简单的函数,然后使用多项式求积方法来计算积分。
4. 高斯-拉盖尔公式:该公式是将被积函数通过一个变换变成一个简单的函数,然后使用乘积求积方法来计算积分。
在Matlab中,这些积分公式都可以通过调用相应的函数来实现。
例如,使用trapz函数可以进行梯形积分,使用quad函数可以进行辛普森积分,使用gaussq函数可以进行高斯求积。
需要注意的是,不同的积分公式适用于不同的函数类型和计算精度要求,所以在使用时需要根据实际情况进行选择。
- 1 -。
matlab 梯形法Matlab梯形法梯形法是一种数值积分方法,用于计算定积分的近似值。
在Matlab 中,我们可以使用梯形法来求解一元函数的定积分。
本文将介绍梯形法的原理、实现步骤以及示例代码。
一、原理介绍梯形法基于以下思想:将函数曲线下的面积近似看作是由一系列梯形的面积之和。
具体而言,我们将积分区间[a, b]分成n个小区间,然后在每个小区间上构造一个梯形,再将所有梯形的面积相加,最终得到近似的定积分值。
二、步骤分析使用梯形法求解定积分的步骤如下:1. 确定积分区间[a, b]和分割数n,其中n表示将积分区间分成n 个小区间。
2. 计算每个小区间的宽度h,即h = (b - a) / n。
3. 计算每个小区间的高度,即f(a)、f(a + h)、f(a + 2h)、...、f(b - h)、f(b)。
4. 计算每个小梯形的面积,即(A1 + A2 + A3 + ... + An),其中Ai = (f(a + (i-1) * h) + f(a + i * h)) * h / 2。
5. 将所有小梯形的面积相加,得到最终的近似定积分值。
三、示例代码下面是使用Matlab实现梯形法的示例代码:```matlabfunction result = trapezoidal_rule(f, a, b, n)h = (b - a) / n;x = a:h:b;y = f(x);result = (sum(y) - (y(1) + y(end)) / 2) * h;end% 示例使用:计算函数f(x) = x^2在区间[0, 1]上的定积分f = @(x) x.^2;a = 0;b = 1;n = 1000;result = trapezoidal_rule(f, a, b, n);disp(result);```四、总结本文介绍了Matlab梯形法的原理、步骤以及示例代码。
通过梯形法,我们可以求解一元函数的定积分,并得到近似的积分值。
一、介绍在数值计算领域中,求解定积分是一个常见的问题。
定积分的求解可以通过多种方法,其中梯形法是一种常用的数值积分计算方法。
本文将以MATLAB为工具,通过一个具体的例题来介绍使用梯形法求解定积分的步骤和过程。
二、梯形法原理梯形法是一种利用梯形逼近曲线下面积的数值积分方法。
其原理是将积分区间分成若干小段,然后用每一小段上的函数值来逼近这一小段上的曲线下面积,最后将所有小段上的梯形面积相加得到整个积分的近似值。
三、MATLAB代码实现下面我们通过一个具体的例题来演示如何使用MATLAB来实现梯形法求解定积分。
假设我们要求解如下定积分:\[ \int_{0}^{1} 3x^2 dx \]我们定义被积函数,并选择积分区间及分段数。
在MATLAB中,可以通过以下代码来实现:```matlabf = (x) 3*x^2; 定义被积函数a = 0; 积分下限b = 1; 积分上限n = 100; 分段数```我们通过循环计算每一小段上的梯形面积,并将其相加得到定积分的近似值。
具体实现代码如下:```matlabh = (b - a) / n; 计算每一小段的长度x = a:h:b; 生成积分节点y = f(x); 计算积分节点上的函数值T = h * (sum(y) - (y(1) + y(end)) / 2); 使用梯形法计算定积分近似值```我们输出计算结果并进行比较:```matlabexact_value = integral(f, a, b); 精确值error = abs(exact_value - T); 误差fprintf('定积分的近似值为:f\n', T);fprintf('定积分的精确值为:f\n', exact_value);fprintf('计算误差为:f\n', error);```四、结果分析通过上述代码的计算,我们可以得到定积分的近似值以及与精确值的比较。
复合梯形公式、复合⾟普森公式matlab 1. ⽤1阶⾄4阶Newton-Cotes公式计算积分程序:function I = NewtonCotes(f,a,b,type)%syms t;t=findsym(sym(f));I=0;switch typecase 1,I=((b-a)/2)*(subs(sym(f),t,a)+subs(sym(f),t,b));case 2,I=((b-a)/6)*(subs(sym(f),t,a)+4*subs(sym(f),t,(a+b)/2)+...subs(sym(f),t,b));case 3,I=((b-a)/8)*(subs(sym(f),t,a)+3*subs(sym(f),t,(2*a+b)/3)+...3*subs(sym(f),t,(a+2*b)/3)+subs(sym(f),t,b));case 4,I=((b-a)/90)*(7*subs(sym(f),t,a)+...32*subs(sym(f),t,(3*a+b)/4)+...12*subs(sym(f),t,(a+b)/2)+...32*subs(sym(f),t,(a+3*b)/4)+7*subs(sym(f),t,b));case 5,I=((b-a)/288)*(19*subs(sym(f),t,a)+...75*subs(sym(f),t,(4*a+b)/5)+...50*subs(sym(f),t,(3*a+2*b)/5)+...50*subs(sym(f),t,(2*a+3*b)/5)+...75*subs(sym(f),t,(a+4*b)/5)+19*subs(sym(f),t,b));case 6,I=((b-a)/840)*(41*subs(sym(f),t,a)+...216*subs(sym(f),t,(5*a+b)/6)+...27*subs(sym(f),t,(2*a+b)/3)+...272*subs(sym(f),t,(a+b)/2)+...27*subs(sym(f),t,(a+2*b)/3)+...216*subs(sym(f),t,(a+5*b)/6)+...41*subs(sym(f),t,b));case 7,I=((b-a)/17280)*(751*subs(sym(f),t,a)+...3577*subs(sym(f),t,(6*a+b)/7)+...1323*subs(sym(f),t,(5*a+2*b)/7)+...2989*subs(sym(f),t,(3*a+4*b)/7)+...1323*subs(sym(f),t,(2*a+5*b)/7)+...3577*subs(sym(f),t,(a+6*b)/7)+751*subs(sym(f),t,b));endsyms xf=exp(-x).*sin(x);a=0;b=2*pi;I = NewtonCotes(f,a,b,1)N=1:I =N=2:I =N=3:I =(pi*((3*3^(1/2)*exp(-(2*pi)/3))/2 - (3*3^(1/2)*exp(-(4*pi)/3))/2))/4N=4:I =(pi*(32*exp(-pi/2) - 32*exp(-(3*pi)/2)))/452. 已知,因此可以通过数值积分计算的近似值。
编程实现数值积分的几种--方法c语言数值计算2010-11-05 09:52:43 阅读385 评论1 字号:大中小订阅复化梯形公式在区间不大时, 用梯形公式、辛卜生公式计算定积分是简单实用的, 但当区间较大时, 用梯形公式、辛卜生公式计算定积分达不到精确度要求 . 为了提高计算的精确度,我们将[a,b] 区间n等分,在每个小区间上应用梯形公式、辛卜生公式计算定积分,然后将其结果相加,这样就得到了复化梯形公式和复化辛卜生公式。
1. 复化梯形公式将积分区间等分, 设, 则节点为对每个小区间上应用梯形公式, 然后将其结果相加,则得(3.14)称(3.14) 式为复化梯形公式 .当在[a,b] 上有连续的二阶导数时,则复化梯形公式(3.14) 的余项推导如下:因为所以在区间[a,b] 上公式(3.14) 的误差为又因为在区间[a,b] 上连续,由连续函数的性质知,在区间[a,b] 上存在一点,于是( 3.15 )复化梯形公式,复化抛物线公式和Romberg求积法的算法程序:以下程序均定义误差限为1*10^-5;1)复化梯形公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double h,t0,t,g;n=1; //赋初值h=(double)(b-a)/2;t=h*(f(a)+f(b));do{t0=t;g=0;for (i=1;i<=n;i++)g+=f((a+(2*i-1)*h));t=(t0/2)+(h*g); //复化梯形公式n*=2;h/=2;}while (fabs(t-t0)>e); //自定义误差限e printf("%.8lf",t); //输出积分的近似值return 0;}2)复化抛物线公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double f1,f2,f3,h,s0,s;f1=f(a)+f(b); //赋初值f2=f(((double)(b+a)/2));f3=0;s=((double)(b-a)/6)*(f1+4*f2);n=2;h=(double)(b-a)/4;do //复化抛物线算法{f2+=f3;s0=s;f3=0;for (i=1;i<=n;i++)f3+=f((a+(2*i-1)*h));s=(h/3)*(f1+2*f2+4*f3);n*=2;h/=2;}while (fabs(s-s0)>e); //自定义误差限printf("%.8lf",s);return 0;}3)Romberg求积法:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)double t[100][100];int main(){int n,k,i,m;double h,g,p;h=(double)(b-a)/2;t[0][0]=h*(f(a)+f(b));k=1;n=1;do //Romberg算法{g=0;for (i=1;i<=n;i++)g+=f((a+((2*i-1)*h)));t[k][0]=(t[k-1][0]/2)+(h*g);for (m=1;m<=k;m++){p=pow(4,(double)(m));t[k-m][m]=(p*t[k-m+1][m-1]-t[k-m][m-1])/(p-1);}m-=1;h/=2;n*=2;k+=1;}while (fabs(t[0][m]-t[0][m-1])>e); //自定义误差限eprintf("%.8lf",t[0][m]);return 0;}给定精度,定义误差限为1*10^-5,分别求出步长的先验估计值:用复化梯形公式计算,要求h<0. 007746。
复合梯形公式和复合辛普森公式例题复合梯形公式和复合辛普森公式例题数值计算是现代科学技术中重要的研究领域之一,而数值积分是数值计算中的一个重要分支。
数值积分是指在一定区间上用数值方法来逼近求解定积分的过程。
综合考虑精度和效率,梯形公式和辛普森公式是数值积分中比较常用的方法,而复合梯形公式和复合辛普森公式则是对前两种方法的改进和完善。
一、复合梯形公式(一)基本原理梯形公式是数值积分中运用最广泛的一种方法,其基本思想是将被积函数在区间[a,b]上的曲线用若干条梯形逼近,然后计算梯形的面积之和,得到函数曲线下的面积。
若将区间[a,b]分为n个小区间,梯形公式还可以推广为复合梯形公式。
复合梯形公式的基本原理是将整个区间[a,b]等分为n 个小区间,每个小区间的长度为h=(b-a)/n,然后对于每个小区间求出梯形的面积,并将所有梯形面积加起来得到函数曲线下的面积,并作为积分的近似值。
具体地说,复合梯形公式的表达式为:$$\int_a^b f(x)dx \approx \frac{h}{2}[f(a)+2\sum_{i=1}^{n-1} f(x_{i})+f(b)]$$其中,$x_1=a+h,x_2=a+2h,...,x_{i+1}=x_i+h,...,x_{n}=b-h$,h是小区间长度。
(二)例题现在考虑如下的积分:$$I=\int_0^1 e^{x^2} dx$$将整个区间[0,1]等分为4个小区间,得到$h=0.25$,对于每个小区间,可以分别求出梯形的面积,得到:$$\frac{h}{2}[f(0)+2f(0.25)+2f(0.5)+2f(0.75)+f(1)]$$代入函数$f(x)=e^{x^2}$,得到近似积分值为$1.4627$。
使用Matlab代码进行计算,得到具体结果为:>> f=@(x) exp(x.^2); h=0.25; x=0:h:1;I=h/2*(f(x(1))+2*sum(f(x(2:end-1)))+f(x(end))) sprintf('%.5f',I)ans =1.46270可以发现,与精确值$1.46265$相比,误差很小,说明复合梯形公式是一种很有效的近似积分方法。
梯形公式和辛普森公式是用于计算定积分的数值逼近方法。
在实际应用中,我们经常会遇到需要计算函数在某个区间上的定积分值的情况,而对于一些复杂的函数,直接进行积分计算可能会十分困难,甚至是不可能的。
我们需要借助数值逼近方法来得到积分的近似值。
梯形公式和辛普森公式都是数值积分的基本方法,它们的原理都是通过将被积函数在积分区间上进行分割,然后利用分割后的小区间上的函数值,以及各个小区间的长度来进行计算,从而得到积分的近似值。
梯形公式是一种线性插值法,它的原理是将积分区间等分成n个小区间,然后用每个小区间的两个端点处的函数值进行线性插值,将每个小区间的面积近似为一个梯形,再将所有梯形的面积相加就得到了整个积分的近似值。
具体地,对于被积函数f(x)在区间[a, b]上的积分,我们可以利用梯形公式进行近似计算:1. 将区间[a, b]等分成n个小区间,记每个小区间的长度为h,即h=(b-a)/n。
2. 根据梯形面积的计算公式,我们可以得到每个小区间上梯形的面积为(h/2)*(f(x[i])+f(x[i+1])),其中x[i]和x[i+1]分别为第i个小区间的两个端点。
3. 将所有小区间上梯形的面积相加得到整个积分的近似值,即I ≈(h/2)*(f(a)+2*f(x[1])+2*f(x[2])+...+2*f(x[n-1])+f(b))。
梯形公式的优点在于其较为简单易懂,且可以很容易地通过计算机进行程序实现。
但是需要注意的是,当被积函数在积分区间上变化较大时,梯形公式可能会产生较大的误差。
与梯形公式类似,辛普森公式也是一种数值积分的方法,它是一种二次插值法,其原理是将积分区间等分成n个小区间,然后利用每个小区间的三个节点处的函数值进行二次插值,将每个小区间的面积近似为一个二次多项式曲线下的面积,再将所有小区间的面积相加就得到了整个积分的近似值。
具体地,对于被积函数f(x)在区间[a, b]上的积分,我们可以利用辛普森公式进行近似计算:1. 将区间[a, b]等分成n个小区间,记每个小区间的长度为h,即h=(b-a)/n。
Matlab作业(一)
作业要求:用梯形法或者辛普森法数值积分,分别用Matlab和c 语言实现。
C语言
1.程序代码:
#include <stdio.h>
#include <math.h>
double fun(double x)
{
return x*x;
}
double definfresult1(double (*pfun)(double),double a,double b,double eps)
{
int n=1;
double h,k,tn,tn1,fh,fh1=0;
double fa=pfun(a);
double fb=pfun(b);
tn=(b-a)*(fa+fb)/2;
do {
for(k=0,fh1=0;k<n;k++){
h=(b-a)/(n);
fh=pfun(a + (2*k + 1)*(b-a)/(2*n));
fh=fh+fh1;
fh1=fh;
}
tn1=tn;
tn=(tn1+fh*h)/2;
n=2*n;
} while(fabs(tn- tn1) >= eps);
return tn;
}
int main()
{
double a,b,eps,definfresult;
printf("积分下限a=");
scanf("%lf",&a);
printf("积分上限b=");
scanf("%lf",&b);
printf("精度eps=");
scanf("%lf",&eps);
definfresult=definfresult1(fun,a,b,eps);
printf("\n计算结果=%.7lf\n", definfresult); }
2.运行结果:
MatLab
1.程序代码:
function y=fun1(x)
y=x*x;
function result=definf1(fhandle, a, b, eps)
fa=feval(fhandle, a);
fb=feval(fhandle, b);
tn=(b-a)*(fa+fb)/2;
tn1=0;
n=1;
fh1=0;
while abs(tn- tn1) > eps
fh1=0;
for i=0:n-1
h=(b-a)/n;
fh=feval(fhandle,a + (2*i + 1)*(b-a)/(2*n) );
fh=fh+fh1;
fh1=fh;
end;
tn1=tn;
tn=(tn1+fh*h)/2;
n=2*n;
end
result=tn;
>> result=definf1(@fun1, 0, 10,0.001 ) result =
333.3335
2.运行结果。