数值积分法的matlab程序

合集下载

数值积分的MATLAB实现

数值积分的MATLAB实现

数值积分的MATLAB实现数值积分是通过数值方法计算定积分的近似值。

MATLAB是一种功能强大的数值计算软件,提供了多种函数和工具箱用于数值积分的实现。

在MATLAB中,常用的数值积分方法包括梯形法则、辛普森法则和龙贝格法。

梯形法则是最简单的数值积分方法之一、它的基本思想是将要积分的区间划分成多个小的梯形并计算每个梯形的面积,然后将这些面积相加得到最终的近似积分值。

在MATLAB中,可以使用trapz函数进行梯形法则的计算。

例如,要计算函数sin(x)在区间[0, pi]的积分,可以使用以下代码:```MATLABx = linspace(0, pi, 1000); % 在[0, pi]区间生成1000个等间隔的点y = sin(x); % 计算函数sin(x)在每个点的值integral_value = trapz(x, y) % 使用梯形法则进行数值积分```辛普森法则是一种更精确的数值积分方法,它使用二次多项式来逼近被积函数。

在MATLAB中,可以使用simpson函数进行辛普森法则的计算。

例如,上面例子中的积分可以改用辛普森法则进行计算:```MATLABintegral_value = simpson(x, y) % 使用辛普森法则进行数值积分```龙贝格法是一种高效的自适应数值积分方法,它通过逐步加密网格和逼近函数来提高积分的精度。

在MATLAB中,可以使用quad和quadl函数进行龙贝格法的计算。

例如,计算函数sin(x)在区间[0, pi]的积分:```MATLAB```除了上述方法外,MATLAB还提供了许多其他的数值积分函数和工具箱,用于处理不同类型的积分问题。

例如,int和integral函数可以用于处理多重积分和奇异积分。

Symbolic Math Toolbox中的函数可以用于计算符号积分。

需要注意的是,数值积分是一种近似方法,计算结果的误差与划分区间的精细程度有关。

用matlab实现romberg积分法

用matlab实现romberg积分法

一、概述在数值分析中,求解定积分是一项重要的任务。

传统的数值积分方法包括梯形法则、辛普森法则等。

而Romberg积分法,是一种更加精确的数值积分方法,它通过不断增加区间的细分,逐步提高数值积分的精度。

在本文中,我们将尝试用MATLAB实现Romberg积分法,探索其优势和应用。

二、Romberg积分法原理Romberg积分法的基本原理是通过对梯形法则和辛普森法则进行逐步的细分和修正,以获得更加精确的数值积分结果。

假设我们需要求解函数 f(x) 在区间 [a, b] 上的定积分,那么Romberg积分法的步骤可以概括为以下几点:1. 将区间 [a, b] 均匀分成若干个子区间;2. 计算每个子区间上的梯形规则和辛普森规则的数值积分;3. 利用已知结果进行Richardson外推,修正数值积分的误差;4. 逐步增加子区间的细分,直到达到所需的精度要求。

三、MATLAB实现Romberg积分法我们可以使用MATLAB编程语言来实现Romberg积分法,以下是一个示例代码:function [I, R] = romberg(f, a, b, n)h = (b - a) ./ (2 .^ (0:n-1));R = zeros(n, n);R(1, 1) = (b - a) * (feval(f, a) + feval(f, b)) / 2;for j = 2:nsubtotal = 0;for i = 1:2^(j-2)subtotal = subtotal + feval(f, a + (2*i - 1) * h(j));endR(j, 1) = R(j-1, 1)/2 + h(j) * subtotal;endfor k = 2:nfor j = k:nR(j, k) = (4^(k-1) * R(j, k-1) - R(j-1, k-1)) / (4^(k-1) - 1); endendI = R(n, n);通过以上的MATLAB代码,我们可以轻松地实现Romberg积分法,对给定的函数和区间进行数值积分,并得到精确的积分结果。

MATLAB数值积分及算例

MATLAB数值积分及算例

6.2.3 被积函数由一个表格定义
(要求积分,但是函数没有直接给出,只是自己在 做实验时得到的一组相关联的数据)
在MATLAB中,对由表格形式定义的函数关系的求定积分问 题用trapz(X,Y)函数。其中向量X,Y定义函数关系Y=f(X)。
例4 用trapz函数计算定积分。
命令如下:
X=1:0.01:2.5; Y=exp(-X); trapz(X,Y)
例2 求定积分:
x sin x
dx
0 (1 cos x cos x)
(1) 被积函数文件fx.m。
function f=fx(x) f=x.*sin(x)./(1+cos(x).*cos(x));
(2) 调用函数quad8求定积分。
I=quad8('fx',0,pi)
例3
分别用quad函数和quad8函数求定积分
global ki;ki=0; I=dblquad('fxy',-2,2,-1,1) ki
6.2 数值积分的实现方法
6.2.1 变步长辛普生法
基于变步长辛普生法,MATLAB给出了quad函数来 求定积分。该函数的调用格式为:
[I, n] = quad('fname', a, b, tol, trace) 其中fname是被积函数名。a和b分别是定积分的下 限 和 上 限 。 tol 用 来 控 制 积 分 精 度 , 缺 省 时 取 tol=0.001。trace控制是否展现积分过程,若取非0则 展现积分过程,取0则不展现,缺省时取trace=0。 返回参数I即定积分值,n为被积函数的调用次数。
2.5 exdx
1
的近似值,并在相同的积分精度下,比较函数的调

Matlab数值积分程序集合

Matlab数值积分程序集合

Matlab数值积分程序集合[图书馆+网络收集]近来学习数值积分,手头积累了不少程序,也拿来和各位朋友分享一下。

主要是来自数值积分教材和网络,基本的原理也就不打算多说了,随便搜索一下就可以得到,那就开始上代码了,呵呵,非原创,但是全部验证过,有疑问可以给我e-mail:1 梯形数值积分的MATLAB主程序function T=rctrap(fun,a,b,m)%fun 函数,a 积分上限 b积分下限 m 递归次数n=1;h=b-a; T=zeros(1,m+1); x=a;T(1)=h*(feval(fun,a)+feval(fun,b))/2;for i=1:mh=h/2; n=2*n; s=0;for k=1:n/2x=a+h*(2*k-1); s=s+feval(fun,x);endT(i+1)=T(i)/2+h*s;endT=T(1:m);e.g运行后屏幕显示精确值F s,用rctrap计算的递归值T和T与精确值F s的绝对误差w T>> ) exp((-x^.2./2)./(sqrt(2*pi)))T=rctrap(fun,0,pi/2,14), syms tfi=int(exp((-t^2)/2)/(sqrt(2*pi)),t,0, pi/2);Fs= double(fi), wT= double(abs(fi-T))fun =@(x)exp((-x^.2./2)./(sqrt(2*pi)))T =Columns 1 through 71.4168 1.3578 1.3313 1.3195 1.3142 1.3119 1.3109Columns 8 through 141.3105 1.3103 1.3102 1.3102 1.3101 1.3101 1.3101Fs =0.4419wT =Columns 1 through 70.9749 0.9159 0.8894 0.8776 0.8723 0.8700 0.8690Columns 8 through 140.8686 0.8684 0.8683 0.8683 0.8683 0.8682 0.8682>>2 复合辛普森(Simpson)数值积分的MATLAB主程序function y=comsimpson(fun,a,b,n)% fun 函数 a 积分上限 b积分下限 n 分割小区间数z1=feval (fun,a)+ feval (fun,b);m=n/2;h=(b-a)/(2*m); x=a;z2=0; z3=0; x2=0; x3=0;for k=2:2:2*mx2=x+k*h; z2= z2+2*feval (fun,x2);for k=3:2:2*mx3=x+k*h; z3= z3+4*feval (fun,x3);endy=(z1+z2+z3)*h/3;由于Matlab自带了 quad就是这个算法所以比较少自己编3 龙贝格数值积分的MATLAB主程序function [RT,R,wugu,h]=romberg(fun,a,b, wucha,m)%fun被积函数 a,b积分上下限 wucha两次相邻迭代绝对差值 m 龙贝格积分表最大行数%RT 龙贝格积分表 R 数值积分结果 wucha 误差估计 h 最小步长n=1;h=b-a; wugu=1; x=a;k=0; RT=zeros(4,4);RT(1,1)=h*(feval(fun,a)+feval(fun,b))/2;while((wugu>wucha)&(k<m)|(k<4))k=k+1; h=h/2; s=0;for j=1:nx=a+h*(2*j-1); s=s+feval(fun,x);endRT(k+1,1)= RT(k,1)/2+h*s; n=2*n;for i=1:kRT(k+1,i+1)=((4^i)*RT(k+1,i)-RT(k,i))/(4^i-1);endwugu=abs(RT(k+1,k)-RT(k+1,k+1));endR=RT(k+1,k+1);>> F=inline('1./(1+x)'); [RT,R,wugu,h]=romberg(F,0,1.5,1.e-8,13) syms xfi=int(1/(1+x),x,0,1.5); Fs=double(fi),wR=double(abs(fi-R)), wR1= wR - wuguRT =1.0500 0 0 00 00.9536 0.9214 0 00 00.9260 0.9168 0.9165 00 00.9187 0.9163 0.9163 0.91630 00.9169 0.9163 0.9163 0.9163 0.91630.9164 0.9163 0.9163 0.9163 0.9163 0.9163R =0.9163wugu =2.9436e-011h =0.0469Fs =0.9163wR =9.8007e-011wR1 =6.8571e-011>>6 复合梯形法function [I,step] = CombineTraprl(f,a,b,eps)%f 被积函数%a,b 积分上下限%eps 精度%I 积分结果%step 积分的子区间数if(nargin ==3)eps=1.0e-4;endn=1;h=(b-a)/2;I1=0;I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b))/h; while abs(I2-I1)>epsn=n+1;h=(b-a)/n;I1=I2;I2=0;for i=0:n-1x=a+h*i;x1=x+h;I2=I2+(h/2)*(subs(sym(f),findsym(sym(f)),x)+subs(sym(f ),findsym(sym(f)),x1));endendI=I2;step=n;7 辛普森法function [I,step] = IntSimpson(f,a,b,type,eps)%type = 1 辛普森公式%type = 2 辛普森3/8公式%type = 3 复合辛普森公式if(type==3 && nargin==4)eps=1.0e-4; %缺省精度为0.0001endI=0;switch typecase 1,I=((b-a)/6)*(subs(sym(f),findsym(sym(f)),a)+...4*subs(sym(f),findsym(sym(f)),(a+b)/2)+...subs(sym(f),findsym(sym(f)),b));step=1;case 2,I=((b-a)/8)*(subs(sym(f),findsym(sym(f)),a)+...3*subs(sym(f),findsym(sym(f)),(2*a+b)/3)+ ...3*subs(sym(f),findsym(sym(f)),(a+2*b)/3)+subs(sym( f),findsym(sym(f)),b));step=1;case 3,n=2;h=(b-a)/2;I1=0;I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym (sym(f)),b))/h;while abs(I2-I1)>epsn=n+1;h=(b-a)/n;I1=I2;I2=0;for i=0:n-1x=a+h*i;x1=x+h;I2=I2+(h/6)*(subs(sym(f),findsym(sym(f )),x)+...4*subs(sym(f),findsym(sym(f)), (x+x1)/2)+...subs(sym(f),findsym(sym(f)),x1 ));endendI=I2;step=n;end8 牛顿-科茨法function I = NewtonCotes(f,a,b,type)%type = 1 科茨公式%type = 2 牛顿-科茨六点公式%type = 3 牛顿-科茨七点公式I=0;switch typecase 1,I=((b-a)/90)*(7*subs(sym(f),findsym(sym(f)),a)+...32*subs(sym(f),findsym(sym(f)),(3*a+b)/4)+...12*subs(sym(f),findsym(sym(f)),(a+b)/2)+...32*subs(sym(f),findsym(sym(f)),(a+3*b)/4)+7*su bs(sym(f),findsym(sym(f)),b));case 2,I=((b-a)/288)*(19*subs(sym(f),findsym(sym(f)),a)+...75*subs(sym(f),findsym(sym(f)),(4*a+b)/5)+...50*subs(sym(f),findsym(sym(f)),(3*a+2*b)/5)+...50*subs(sym(f),findsym(sym(f)),(2*a+3*b)/5)+...75*subs(sym(f),findsym(sym(f)),(a+4*b)/5)+19*s ubs(sym(f),findsym(sym(f)),b));case 3,I=((b-a)/840)*(41*subs(sym(f),findsym(sym(f)),a)+...216*subs(sym(f),findsym(sym(f)),(5*a+b)/6)+...27*subs(sym(f),findsym(sym(f)),(2*a+b)/3)+...272*subs(sym(f),findsym(sym(f)),(a+b)/2)+...27*subs(sym(f),findsym(sym(f)),(a+2*b)/3)+...216*subs(sym(f),findsym(sym(f)),(a+5*b)/6)+41* subs(sym(f),findsym(sym(f)),b));end9 高斯公式function I = IntGauss(f,a,b,n,AK,XK)if(n<5 && nargin == 4)AK = 0;XK = 0;elseXK1=((b-a)/2)*XK+((a+b)/2);I=((b-a)/2)*sum(AK.*subs(sym(f),findsym(f),XK1));endta = (b-a)/2;tb = (a+b)/2;switch ncase 0,I=2*ta*subs(sym(f),findsym(sym(f)),tb);case 1,I=ta*(subs(sym(f),findsym(sym(f)),ta*0.5773503+tb)+...subs(sym(f),findsym(sym(f)),-ta*0.5773503+tb));case 2,I=ta*(0.55555556*subs(sym(f),findsym(sym(f)),ta*0.7745 967+tb)+...0.55555556*subs(sym(f),findsym(sym(f)),-ta*0.7 745967+tb)+...0.88888889*subs(sym(f),findsym(sym(f)),tb));case 3,I=ta*(0.3478548*subs(sym(f),findsym(sym(f)),ta*0.86113 63+tb)+...0.3478548*subs(sym(f),findsym(sym(f)),-ta*0.86 11363+tb)+...0.6521452*subs(sym(f),findsym(sym(f)),ta*0.339 8810+tb)...+0.6521452*subs(sym(f),findsym(sym(f)),-ta*0.3 398810+tb));case 4,I=ta*(0.2369269*subs(sym(f),findsym(sym(f)),ta*0.90617 93+tb)+...0.2369269*subs(sym(f),findsym(sym(f)),-ta*0.90 61793+tb)+...0.4786287*subs(sym(f),findsym(sym(f)),ta*0.538 4693+tb)...+0.4786287*subs(sym(f),findsym(sym(f)),-ta*0.5 384693+tb)+...0.5688889*subs(sym(f),findsym(sym(f)),tb)); end10 区间逐次分半梯形法function q=DblTraprl(f,a,A,b,B,m,n)if(m==1 && n==1) %梯形公式q=((B-b)*(A-a)/4)*(subs(sym(f),findsym(sym(f)),{a,b})+...subs(sym(f),findsym(sym(f)),{a,B})+...subs(sym(f),findsym(sym(f)),{A,b})+...subs(sym(f),findsym(sym(f)),{A,B}));else %复合梯形公式 C=4*ones(n+1,m+1);C(1,:)=2;C(:,1)=2;C(n+1,:)=2;C(:,m+1)=2;C(1,1)=1;C(1,m+1)=1;C(n+1,1)=1;C(n+1,m+1)=1; %C矩阵endF=zeros(n+1,m+1);q=0;for i=0:nfor j=0:mx=a+i*(A-a)/n;y=b+j*(B-b)/m;F(i+1,j+1)=subs(sym(f),findsym(sym(f)),{x,y});q=q+F(i+1,j+1)*C(i+1,j+1);endendq=((B-b)*(A-a)/4/m/n)*q;11 区间逐次分半布尔法function [I,step] = DDBuer(f,a,b,eps)if(nargin==3)eps=1.0e-4;end;n=1;h=b-a;I1=0;I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b))/h/ 2;tol=1;while tol>epsn=n+1;h=h/4;I1=I2;I2=0;for i=0:(4^(n-1)-1)x=a+h*4*i;x1=x+h;x2=x1+h;x3=x2+h;x4=x3+h;I2=I2+(2*h/45)*(7*subs(sym(f),findsym(sym(f)),x)+...32*subs(sym(f),findsym(sym(f)),x1)+...12*subs(sym(f),findsym(sym(f)),x2)+...32*subs(sym(f),findsym(sym(f)),x3)+...7*subs(sym(f),findsym(sym(f)),x4));endtol=abs(I2-I1);endI=I2;step=n;10 自适应求积法function I=SmartSimpson(f,a,b,eps)if(nargin==3)eps=1.0e-4;end;e=5*eps;I=SubSmartSimpson(f,a,b,e);function q=SubSmartSimpson(f,a,b,eps)QA=IntSimpson(f,a,b,1,eps);QLeft=IntSimpson(f,a,(a+b)/2,1,eps);QRight=IntSimpson(f,(a+b)/2,b,1,eps);if(abs(QLeft+QRight-QA)<=eps)q=QA;elseq=SubSmartSimpson(f,a,(a+b)/2,eps)+SubSmartSimpson(f,(a+b)/2,b ,eps);ende.g>> SmartSimpson('x*sin(x)',0,1)ans =0.3011>>。

(完整版)数值积分及matlab实现

(完整版)数值积分及matlab实现
将积分区间细分,在每一个小区间内用简单函 数代替复杂函数进行积分,这就是数值积分的思想, 用代数插值多项式去代替被积函数发f(x)进行积分 是本章讨论数值积分的主要内容。
建立数值积分公式的途径比较多, 其中最常用的
有两种:
(1)由积分中值定理可知,对于连续函数f(x),在
积分区间[a,b]内存在一点ξ,使得
分,因此将 选(x取) 为插值多项式, 这样f(x)的积分就
可以用其插值多项式的积分来近似代替
2.2 插值求积公式
设已知f(x)在节点 xk (k 0,1, , n) 有函数值 f (xk ) ,作n次拉格朗日插值多项式
式中
n
P(x) f (xk )lk (x)
k 0
lk (x)
n j0
b
n
f (x)dx
a
Ak f (xk )
k 0
为插值型求积公式的充要条件是公式
(
x)dx
时,则称求积公式为插值
设插值求积公式的余项为 R( f ) ,由插值余项定理得
R( f ) b f (x) P(x)dx b f (n1) ( ) (x)dx
a
a (n 1)!
其中 a, b
当f(x)是次数不高于n的多项式时,有 f (n1) (x) 0 R( f ) =0,求积公式(4)能成为准确的等式。由于闭区 间[a,b]上的连续函数可用多项式逼近,所以一个 求积公式能对多大次数的多项式f(x)成为准确等式, 是衡量该公式的精确程度的重要指标,为此给出以 下定义。
数值积分与微分
2009.4.22
数值积分和数值微分
1 引言 我们知道,若函数f(x)在区间[a,b]上连续且其原
函数为F(x),则可用Newton-Leibnitz公式

数值分析MATLAB编程——数值积分法

数值分析MATLAB编程——数值积分法

数值分析MATLAB编程——数值积分法1、调用函数--f.Mfunction y=f(x)%------------------------------------------------------------函数1 y=sqrt(4-sin(x)*sin(x));%------------------------------------------------------------函数2 %y=sin(x)/x;%if x==0% y=0;%end%------------------------------------------------------------函数3 %y=exp(x)/(4+x*x);%------------------------------------------------------------函数4 %y=(log(1+x))/(1+x*x);2、复合梯形公式--tixing.M%复合梯形公式clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');h=(b-a)/n;x=a:h:b;T=0;for k=1:n;T=0.5*h*(f(x(k))+f(x(k+1)))+T;endT=vpa(T,8)3、复合Simpson公式--simpson.M%复合Simpson公式clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');h=(b-a)/n;x=a:h:b;S=0;for k=1:n;xx=(x(k)+x(k+1))/2;S=(1/6)*h*(f(x(k))+4*f(xx)+f(x(k+1)))+S;endS=vpa(S,8)4、Romberg算法--romberg.M%Romberg算法clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');num=0:n;R=[num'];h=b-a;T=h*(f(a)+f(b))/2;t(1)=T;for i=2:n+1;u=h/2;H=0;x=a+u;while x<b;H=H+f(x);x=x+h;endt(i)=(T+h*H)/2;T=t(i);h=u;endR=[R,t'];for i=2:n+1for j=n+1:-1:1if j>=it(j)=(4^(i-1)*t(j)-t(j-1))/(4^(i-1)-1);elset(j)=0;endendR=[R,t'];endR=vpa(R,8)R(n,n)5、变步长算法(以复化梯形公式为例)--tixing2.M%复合梯形公式,确定最佳步长format longclear alla=input('请输入积分下限:');b=input('请输入积分上限:');eps=input('请输入误差:');k=1;T1=(b-a)*(f(a)+f(b))/2;T2=(T1+(b-a)*(f((a+b)/2)))/2; while abs((T1-T2)/3)>=epsM=0;n=2^k;h=(b-a)/n;T1=T2;x=a:h:b;for i=1:n;xx=(x(i)+x(i+1))/2;M=M+f(xx);endT2=(T1+h*M)/2;k=k+1;endT=vpa(T2,8)n=2^k。

matlab 数组积分

matlab 数组积分在MATLAB中,数值积分是常见的数值计算任务之一。

数值积分是对函数在给定区间上的积分值进行数值计算的过程。

在MATLAB中,有几种不同的方法可以用来进行数值积分。

一、MATLAB中的积分函数MATLAB提供了一些内置的函数,可以用来进行数值积分计算。

其中最常用的函数是`integral`函数。

`integral`函数可以用于一维和多维积分,可以使用固定步长或自适应步长算法。

下面是一个使用`integral`函数计算一维积分的示例:```matlabf = @(x) exp(-x^2); %定义需要积分的函数a = -1; %积分下限b = 1; %积分上限result = integral(f, a, b); %计算积分disp(result); %输出结果```在这个示例中,我们首先定义了需要积分的函数`f`,然后定义了积分的下限`a`和上限`b`。

然后我们使用`integral`函数来计算积分的值,并将结果存储在`result`变量中。

最后,我们使用`disp`函数来输出积分的结果。

除了`integral`函数,MATLAB还提供了其他一些积分函数,如`quad`、`quadl`、`quadgk`等。

这些函数提供了不同的积分算法和参数设置,可以根据具体的需求选择合适的函数进行数值积分计算。

二、积分方法在进行数值积分时,常用的方法包括:1.矩形法:将积分区间划分为若干个子区间,然后在每个子区间上选取某个点的函数值作为近似值。

这种方法简单易懂,但精度较低。

2.梯形法:将积分区间划分为若干个子区间,然后在每个子区间上通过线性插值得到函数的近似值,再对近似值进行积分。

这种方法比矩形法精度更高,但仍然有误差。

3.辛普森法:将积分区间划分为若干个子区间,然后在每个子区间上使用二次插值得到函数的近似值,再对近似值进行积分。

这种方法的精度比梯形法更高,但计算量也更大。

三、示例下面我们通过一个具体的示例来演示如何在MATLAB中进行数值积分计算。

如何在Matlab中进行数值积分和数值解

如何在Matlab中进行数值积分和数值解在数学和工程领域,数值积分和数值解是常见的技术手段,可以帮助我们求解复杂的数学问题和实际工程中的模型。

本文将介绍如何使用Matlab进行数值积分和数值解,以及一些注意事项和常用的方法。

一、数值积分数值积分是计算定积分的近似值的方法,可以通过数值逼近或数值插值来实现。

在Matlab中,有几种常用的函数可以用于数值积分,比如trapz、quad等。

1. trapz函数trapz函数是用梯形法则计算积分的函数。

它的使用方法是将要积分的函数作为输入的第一个参数,x轴上的点作为输入的第二个参数。

例如,要计算函数f(x)在区间[a, b]上的积分,可以使用以下代码:result = trapz(x, f(x));2. quad函数quad函数是使用自适应数值积分算法计算积分的函数。

它的使用方法是将要积分的函数作为输入的第一个参数,积分区间的下限和上限作为输入的第二个和第三个参数。

例如,要计算函数f(x)在区间[a, b]上的积分,可以使用以下代码:result = quad(@(x) f(x), a, b);二、数值解数值解是使用数值方法求解复杂的数学问题或实际工程中的模型的近似解。

在Matlab中,有几种常用的函数可以用于数值解,比如fsolve、ode45等。

1. fsolve函数fsolve函数是用于求解非线性方程组的函数。

它的使用方法是将非线性方程组表示为一个函数,然后将该函数作为输入的第一个参数。

例如,要求解方程组f(x) = 0,可以使用以下代码:x = fsolve(@(x) f(x), x0);其中x0是方程的初始猜测值。

2. ode45函数ode45函数是求解常微分方程初值问题的函数。

它的使用方法是将微分方程表示为一个函数,然后将该函数作为输入的第一个参数。

例如,要求解常微分方程dy/dx = f(x, y),可以使用以下代码:[t, y] = ode45(@(t, y) f(t, y), tspan, y0);其中tspan是时间区间,y0是初始条件。

matlab中的微分方程的数值积分

MATLAB是一种流行的数学软件,用于解决各种数学问题,包括微分方程的数值积分。

微分方程是许多科学和工程问题的数学描述方式,通过数值积分可以得到微分方程的数值解。

本文将介绍在MATLAB中如何进行微分方程的数值积分,以及一些相关的技巧和注意事项。

一、MATLAB中微分方程的数值积分的基本方法1. 常微分方程的数值积分在MATLAB中,常微分方程的数值积分可以使用ode45函数来实现。

ode45是一种常用的数值积分函数,它使用4阶和5阶Runge-Kutta 方法来求解常微分方程。

用户只需要将微分方程表示为函数的形式,并且提供初值条件,ode45就可以自动进行数值积分,并得到微分方程的数值解。

2. 偏微分方程的数值积分对于偏微分方程的数值积分,在MATLAB中可以使用pdepe函数来实现。

pdepe可以求解具有定解条件的一维和二维偏微分方程,用户只需要提供偏微分方程的形式和边界条件,pdepe就可以进行数值积分,并得到偏微分方程的数值解。

二、在MATLAB中进行微分方程数值积分的注意事项1. 数值积分的精度和稳定性在进行微分方程的数值积分时,需要注意数值积分的精度和稳定性。

如果数值积分的精度不够,可能会导致数值解的误差过大;如果数值积分的稳定性差,可能会导致数值解发散。

在选择数值积分方法时,需要根据具体的微分方程来选择合适的数值积分方法,以保证数值解的精度和稳定性。

2. 初值条件的选择初值条件对微分方程的数值解有很大的影响,因此在进行微分方程的数值积分时,需要选择合适的初值条件。

通常可以通过对微分方程进行分析,或者通过试验求解来确定合适的初值条件。

3. 数值积分的时间步长在进行微分方程的数值积分时,需要选择合适的时间步长,以保证数值积分的稳定性和效率。

选择时间步长时,可以通过试验求解来确定合适的时间步长,以得到最优的数值解。

三、MATLAB中微分方程数值积分的实例以下通过一个简单的例子来演示在MATLAB中如何进行微分方程的数值积分。

数值积分matlab

数值积分matlab数值积分是数学中的一个重要分支,它是通过数值方法来计算函数的积分值。

在实际应用中,很多函数的积分无法通过解析方法求得,这时候就需要使用数值积分的方法来进行计算。

在本文中,我们将介绍如何使用Matlab进行数值积分。

Matlab是一种强大的数学计算软件,它提供了许多数值积分的函数,包括quad、quadl、quadgk等。

这些函数可以用来计算一维和多维函数的积分值。

我们来看一维函数的积分计算。

假设我们要计算函数f(x)在区间[a,b]上的积分值,可以使用quad函数来进行计算。

quad函数的语法格式为:[q,err] = quad(fun,a,b,tol)其中,fun是要计算的函数句柄,a和b是积分区间的上下限,tol 是误差容限。

函数quad会返回积分值q和误差err。

例如,我们要计算函数f(x)=x^2在区间[0,1]上的积分值,可以使用以下代码:fun = @(x) x.^2;[q,err] = quad(fun,0,1);运行以上代码,可以得到积分值q=0.3333和误差err=1.1102e-16。

接下来,我们来看多维函数的积分计算。

假设我们要计算函数f(x,y)在矩形区域[a,b]×[c,d]上的积分值,可以使用quad2d函数来进行计算。

quad2d函数的语法格式为:[q,err] = quad2d(fun,a,b,c,d)其中,fun是要计算的函数句柄,a、b、c和d是积分区间的上下限。

函数quad2d会返回积分值q和误差err。

例如,我们要计算函数f(x,y)=x^2+y^2在矩形区域[0,1]×[0,1]上的积分值,可以使用以下代码:fun = @(x,y) x.^2+y.^2;[q,err] = quad2d(fun,0,1,0,1);运行以上代码,可以得到积分值q=0.6667和误差err=1.1102e-16。

除了quad和quad2d函数外,Matlab还提供了许多其他的数值积分函数,如quadl、quadgk、integral等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(4)四阶亚当姆斯预估校正法:
clear all close all a=[0,1,0;0,0,1;-22.06,-27,-10]; b=[0;0;40.6]; u=1; for k=1:4 if (k==1) h=0.01; elseif (k==2) h=0.1; elseif (k==3) h=0.105; else (k==4) h=0.21; end x=[0;0;0]; y=x'; t(1)=0; for i=1:3 t(i+1)=h*i; k1=a*x+b*u; k2=a*(x+h/2*k1)+b*u; k3=a*(x+h/2*k2)+b*u; k4=a*(x+h*k3)+b*u; x=x+h/6*(k1+2*k2+2*k3+k4); y=[y;x']; y1=y'; end for i=4:1000 t(i+1)=h*i;
(3)给出仿真结果曲线图。
欧拉法:
改进欧拉法:
四阶龙格库塔法:
四阶亚当姆斯预估校正法:
实验结果得到四阶亚当姆斯预估校正法的临界步长约为 0.21。
5、实验结果及分析:四种方法的精度比较、稳定性比较,步长 稳定区是否符合实验前的理论分析值。其他需要总结的问题。
精度比较: 从保存的数据文件来看, 四阶龙格库塔法和四阶亚当姆斯预估校正法的精度 较高,大约数量级在 104 ,改进欧拉法次之,在 103 数量级上,欧拉法最低,在 102 数量 级上,与理论的结果相符程度较好。 稳定性比较:从实验结果看,四种方法在步长一样且较小的情况下,都能较快的达到稳 定。而且,同一种方法随着步长的增加,达到稳态的时间会增加。但是由于四种方法的临界 步长不相同,因而随着步长的增加,达到稳态的时间有所不同。 步长稳定区:从实验仿真的结果可以看出,实际的临界步长符合实验前理论的分析值。 而且四阶龙格库塔法的临界步长最大,四阶亚当姆斯预估校正法的临界步长最小。 本实验中四阶亚当姆斯预估校正法不能自启动, 需要用四阶龙格库塔法计算其起始的值。
(2)改进欧拉法:
clear all close all
a=[0,1,0;0,0,1;-22.06,-27,-10]; b=[0;0;40.6]; u=1; for k=1:4 if (k==1) h=0.01; elseif (k==2) h=0.1; elseif (k==3) h=0.16; else (k==4) h=0.321; end x=[0;0;0]; y=x'; t(1)=0; subplot(2,2,k) for i=1:1000 t(i+1)=h*i; x1=x+(a*x+b*u)*h; x=x+[(a*x+b*u)+(a*x1+b*u)]*h/2; y=[y;x']; end t1=0:0.01:10; y1=1.84-4.95*t1.*exp(-1.88*t1)-1.5*exp(-1.88*t1)-0.34*exp(-6.24*t 1); plot(t,y) hold on plot(t1,y1,'k-.','linewidth',2) xlabel('time(sec)') ylabel('·ùÖµy') legend('y','doty','ddoty','y-shuzhi') if (k==1) title('eulerp h=0.01') axis([0,10,-1.5,3.5]) elseif (k==2) title('eulerp h=0.1') axis([0,10,-1.5,3]) elseif (k==3) title('eulerp h=0.16 axis([0,10,-1.5,2]) else (k==4) title('eulerp h=0.321 临界') axis([0,50,-20,5]) 0.5*临界')
6、收获。
(1)这次试验我了解到连续系统仿真不同的数值积分法在精度上,步长稳定区以及稳 定性上有了较为直观的理解, 可以基本上掌握了不同数值积分法的选取在稳态精度上的不同。 (2)本次试验在 matlab 编程上有了较高的提高,在编程过程中,对 matlab 编程会出现 的问题以及解决方法有了基本上的掌握,收获较大。

(3)理论分析:计算系统特征值。结合系统特征值,对四种方法的稳定性进行分析,确定 每种方法步长的取值范围,即 h 临界。
1.8680 用 matlab 计算系统的特征值为: D 1.8928 ,可见系统的特征值有三个,我们取 6.2392
最大的特征值为: = 6.2392 。由四种方法的稳定区域可得: 方法 欧拉法 改进欧拉法 四阶龙格库塔法 四阶亚当姆斯法-显式 四阶亚当姆斯法-隐式 稳定区域 步长 h 临界步长 0.3206 0.3206 0.4456 0.048 0.2944
end end
(3)四阶龙哥库塔法:
clear all close all a=[0,1,0;0,0,1;-22.06,-27,-10]; b=[0;0;40.6]; u=1; for k=1:4 if (k==1) h=0.01; elseif (k==2) h=0.1; elseif (k==3) h=0.223; else (k==4) h=0.447; end x=[0;0;0]; y=x'; t(1)=0; subplot(2,2,k) for i=1:1000 t(i+1)=h*i; k1=a*x+b*u; k2=a*(x+h/2*k1)+b*u; k3=a*(x+h/2*k2)+b*u; k4=a*(x+h*k3)+b*u; x=x+h/6*(k1+2*k2+2*k3+k4); y=[y;x']; end t1=0:0.01:10; y1=1.84-4.95*t1.*exp(-1.88*t1)-1.5*exp(-1.88*t1)-0.34*exp(-6.24*t 1); plot(t,y) hold on plot(t1,y1,'k-.','linewidth',2) xlabel('time(sec)') ylabel('·ùÖµy') legend('y','doty', if (k==1) title('rk h=0.01') 'ddoty','y-shuzhi')
P yn yn f (tn , yn )h 1 改进欧拉法: ; h C P P yn 1 yn [ f (tn , yn ) f (tn 1 , yn 1 )] 2
k1 f (tn , yn ) k2 f (tn h , yn h k1 ) 2 2 h h 四阶龙哥库塔法: k3 f (tn , yn k2 ) ; 2 2 k4 f (tn h, yn hk3 ) yn 1 yn h (k1 2k2 2k3 k4 ) 6
(2,0)
(2,0) (2.78,0)
0 h 0.3206
0 h 0.3206 0 h 0.4456
0 h 0.048 0 h 0.2944
( 310 , 0)
( 90 49 , 0)
由于四阶亚当姆斯预估校正法综合受到显式与隐式的影响,其临界步长应在 0.048~0.2944 之间,具体值需用实验验证出来。
h P y y (55 f n 59 f n 1 37 f n 2 9 f n 3 ) n 1 n 24 四阶亚当姆斯预估校正法: y C y h 9 f P 19 f 5 f f n 1 n n 1 n n 1 n2 24
此处 U 为单位阶跃信号。
1 0 0 0 0 1 ,b 设: a 0 0 。 22.06 27 10 40.6
(2)分别写出四种方法的计算公式; 欧拉法: yn 1 yn f (tn , yn )h ;
控制系统仿真实验
姓名: 王体强 班 级 : 120324 学 号 : 12031190 指导教师: 王卫红 时 间 : 2015 年 4 月 13 日
控制系统仿真实验
1、实目的:
进一步掌握数值积分法; 进一步掌握 MATLAB 软件的使用方法。
2、实验设备:
数字计算机,MATLAB 软件
3、实验预备:
(1)将传递函数化为一阶微分方程组(即状态方程) ; 设: y1 y , y2 y , y3 y
1 0 y1 0 y1 0 y 0 0 1 2 y2 0 U 22.06 27 10 40.6 y3 y3
k_1=a*y1(:,i)+b*u; k_2=a*y1(:,i-1)+b*u; k_3=a*y1(:,i-2)+b*u; k_4=a*y1(:,i-3)+b*u; x1=x+h/24*(55*k_1-59*k_2+37*k_3-9*k_4); k_5=a*x1+b*u; x=x+h/24*(9*k_5+19*k_1-5*k_2+k_3); y=[y;x']; y1=y'; end t1=0:0.01:10; y2=1.84-4.95*t1.*exp(-1.88*t1)-1.5*exp(-1.88*t1)-0.34*exp(-6.24*t 1); subplot(2,2,k) plot(t,y) hold on plot(t1,y2,'k-.','linewidth',2) xlabel('time(sec)') ylabel('·ùÖµy') legend('y','doty','ddoty','y-shuzhi') if (k==1) title('admas h=0.01') axis([0,10,-1,3]) elseif (k==2) title('admas h=0.1') axis([0,10,-1,3]) elseif (k==3) title('admas h=0.105 axis([0,10,-1,3]) else (k==4) title('admas h=0.21 临界') axis([0,20,-3,3]) end end 0.5*临界')
相关文档
最新文档