zoukankan      html  css  js  c++  java
  • MATLAB数值计算与数据分析(4)

    2.2.2  查表命令

    命令1  table1

    功能  一维查表

    格式  Y = table1(TAB,X0)   %返回用表格矩阵TAB中的行线性插值元素,对X0(TAB的第一列查找X0)进行线性插值得到的结果Y。矩阵TAB是第一列包含关键值,而其他列包含数据的矩阵。X0中的每一元素将相应地返回一线性插值行向量。矩阵TAB的第一列必须是单调的。

    例2-38  

    >>tab = [(1:4)' hilb(4)]

    >>y = table1(tab,[1 2.3 3.6 4])

    查表结果为:

    tab =

          1.0000    1.0000    0.5000    0.3333    0.2500

          2.0000    0.5000    0.3333    0.2500    0.2000

          3.0000    0.3333    0.2500    0.2000    0.1667

          4.0000    0.2500    0.2000    0.1667    0.1429

    Warning: TABLE1 is obsolete and will be removed in future versions.  Use INTERP1 or INTERP1Q instead.

    > In D:\MATLABR12\toolbox\matlab\polyfun\table1.m at line 31

    y =

        1.0000    0.5000    0.3333    0.2500

        0.4500    0.3083    0.2350    0.1900

        0.2833    0.2200    0.1800    0.1524

        0.2500    0.2000    0.1667    0.1429

    由上面结果可知,table1是一将要废弃的命令。

    命令2  table2

    功能  二维查表

    格式  Z = table1(TAB,X0,Y0)   %返回用表格矩阵TAB中的行与列交叉线性线性插值元素,对X0(TAB的第一列查找X0)进行线性插值,对Y0(TAB的第一行查找Y0)进行线性插值,对上述两个数值进行交叉线性插值,得到的结果为Z。矩阵TAB是第一列与第一行列都包含关键值,而其他的元素包含数据的矩阵。TAB(1,1)的关键值将被忽略。[X0,Y0]中的每点将相应地返回一线性插值。矩阵TAB的第一行与第一列必须是单调的。

    例2-39

    >>tab = [NaN 1:4; (1:4)' magic(4)]

    >>y = table2(tab,[2 3 3.7],[1.3 2.3 4])

    查表的结果为:

    tab =

          NaN     1     2     3     4

            1    16     2     3    13

            2     5    11    10     8

            3     9     7     6    12

            4     4    14    15     1

     Warning: TABLE2 is obsolete and will be removed in future versions.  Use INTERP2 instead.

     > In D:\MATLABR12\toolbox\matlab\polyfun\table2.m at line 24

     Warning: TABLE1 is obsolete and will be removed in future versions.  Use INTERP1 or INTERP1Q instead.

     > In D:\MATLABR12\toolbox\matlab\polyfun\table1.m at line 31

     In D:\MATLABR12\toolbox\matlab\polyfun\table2.m at line 29

     Warning: TABLE1 is obsolete and will be removed in future versions.  Use INTERP1 or INTERP1Q instead.

     > In D:\MATLABR12\toolbox\matlab\polyfun\table1.m at line 31

     In D:\MATLABR12\toolbox\matlab\polyfun\table2.m at line 31

     y =

        6.8000   10.7000    8.0000

        8.4000    6.7000   12.0000

        7.4200   12.0200    4.3000

    由上面的结果可知,table2是将要废弃的命令。

    2.3  数值积分

    2.3.1  一元函数的数值积分

    函数1  quad、quadlquad8

    功能  数值定积分,自适应Simpleson积分法。

    格式  q = quad(fun,a,b)    %近似地从ab计算函数fun的数值积分,误差为10-6。若给fun输入向量x,应返回向量y,即fun是一单值函数。

    q = quad(fun,a,b,tol)   %用指定的绝对误差tol代替缺省误差。tol越大,函数计算的次数越少,速度越快,但结果精度变小。

    q = quad(fun,a,b,tol,trace,p1,p2,)    %将可选参数p1,p2,…等传递给函数fun(x,p1,p2,…),再作数值积分。若tol=[]trace=[],则用缺省值进行计算。

    [q,n] = quad(fun,a,b, %同时返回函数计算的次数n

    … = quadl(fun,a,b,  %用高精度进行计算,效率可能比quad更好。

    … = quad8(fun,a,b,)   %该命令是将废弃的命令,用quadl代替。

    例2-40

    >>fun = inline(‘’3*x.^2./(x.^3-2*x.^2+3)’);

    >>Q1 = quad(fun,0,2)

    >>Q2 = quadl(fun,0,2)

    计算结果为:

    Q1 =

        3.7224

    Q2 =

        3.7224

    函数2  trapz

    功能  梯形法数值积分

    格式  T = trapz(Y)       %用等距梯形法近似计算Y的积分。若Y是一向量,则trapz(Y)为Y的积分;若Y是一矩阵,则trapz(Y)为Y的每一列的积分;若Y是一多维阵列,则trapz(Y)沿着Y的第一个非单元集的方向进行计算。

    T = trapz(X,Y)     %用梯形法计算Y在X点上的积分。若X为一列向量,Y为矩阵,且size(Y,1) = length(X),则trapz(X,Y)通过Y的第一个非单元集方向进行计算。

    T = trapz(…,dim)   %沿着dim指定的方向对Y进行积分。若参量中包含X,则应有length(X)=size(Y,dim)。

    例2-41

    >>X = -1:.1:1;

    >>Y = 1./(1+25*X.^2);

    >>T = trapz(X,Y)

    计算结果为:

    T =

        0.5492

    函数3  rat,rats

    功能  有理分式近似。虽然所有的浮点数值都是有理数,有时用简单的有理数字(分子与分母都是较小的整数)近似地表示它们是有必要的。函数rat将试图做到这一点。对于有连续出现的小数的数值,将会用有理式近似表示它们。函数rats调用函数rat,且返回字符串。

    格式  [N,D] = rat(X)       %对于缺省的误差1.e-6*norm(X(:),1),返回阵列N与D,使N./D近似为X。

    [N,D] = rat(X,tol)    %在指定的误差tol范围内,返回阵列N与D,使N./D近似为X。

    rat(X)、rat(X…)      %在没有输出参量时,简单地显示x的连续分数。

    S = rats(X,strlen)     %返回一包含简单形式的、X中每一元素的有理近似字符串S,若对于分配的空间中不能显示某一元素,则用星号表示。该元素与X中其他元素进行比较而言较小,但并非是可以忽略。参量strlen为函数rats中返回的字符串元素的长度。缺省值为strlen=13,这允许在78个空格中有6个元素。

    S = rats(X)         %返回与用MATLAB命令format rat显示 X相同的结果给S

    例2-42

    >>s = 1-1/2+1/3-1/4+1/5-1/6+1/7

    >>format rat

    >>S1 = rats(s)

    >>S2 = rat(s)

    >>[n,d] = rat(s)

    >>PI1 = rats(pi)

    >>PI2 = rat(pi)

    计算结果为:

    s =

        0.7595

    S1 =

        319/420   

    S2 =

        1 + 1/(-4 + 1/(-6 + 1/(-3 + 1/(-5))))

    n =

        319      

    d =

        420      

    PI1 =

        355/113   

    PI2 =

    3 + 1/(7 + 1/(16))

    2.3.2  二元函数重积分的数值计算

    函数1  dblquad

    功能  矩形区域上的二重积分的数值计算

    格式  q = dblquad(fun,xmin,xmax,ymin,ymax)    %调用函数quad在区域[xmin,xmax, ymin,ymax]上计算二元函数z=f(x,y)的二重积分。输入向量x,标量y,则f(x,y)必须返回一用于积分的向量。

    q = dblquad(fun,xmin,xmax,ymin,ymax,tol)   %用指定的精度tol代替缺省精度10-6,再进行计算。

    q = dblquad(fun,xmin,xmax,ymin,ymax,tol,method)   %用指定的算法method代替缺省算法quadmethod的取值有@quadl或用户指定的、与命令quadquadl有相同调用次序的函数句柄。

    q = dblquad(fun,xmin,xmax,ymin,ymax,tol,method,p1,p2,)   %将可选参数p1,p2,..等传递给函数fun(x,y,p1,p2,…)。若tol=[]method=[],则使用缺省精度和算法quad

    2-43

    >>fun = inline(’y./sin(x)+x.*exp(y)’);

    >>Q = dblquad(fun,1,3,5,7)

    计算结果为:

    Q =

      3.8319e+003

    函数 quad2dggen

    功能  任意区域上二元函数的数值积分

    格式  q = quad2dggen(fun,xlower,xupper,ymin,ymax)  %在由[xlower,xupper, ymin,ymax]指定的区域上计算二元函数z=f(x,y)的二重积分。

    q = dblquad(fun,xlower,xupper,ymin,ymax,tol)  %用指定的精度tol代替缺省精度10-6,再进行计算。

    q = dblquad(fun,xmin,xmax,ymin,ymax,tol,method)   %用指定的算法method代替缺省算法。method的取值有缺省算法或用户指定的、与缺省命令有相同调用次序的函数句柄。

    q=dblquad(fun,xlower,xupper,ymin,ymax,tol,method,p1,p2,)  %将可选参数p1,p2,..等传递给函数fun(x,y,p1,p2,…)。若tol=[]method=[],则使用缺省精度和算法。

    2-44

    计算单位圆域上的积分:

    先把二重积分转化为二次积分的形式:

    f = inline(’exp(-x.^2/2).*sin(x.^2+y)’,’x’,’y’);

    xlower = inline(’-sqrt(1-y.^2)’,’y’); xupper = inline(’sqrt(1-y.^2)’,’y’);

    Q = quad2dggen(fun,xlower,xupper,-1,1,1e-4)

    计算结果为:

      Q = 

          0.5368603818

    2.4  常微分方程数值解

    函数  ode45ode23ode113ode15sode23sode23tode23tb

    功能  常微分方程(ODE)组初值问题的数值解

    参数说明:

    solver为命令ode45ode23,ode113,ode15s,ode23s,ode23t,ode23tb之一。

    Odefun 为显式常微分方程y’=f(t,y),或为包含一混合矩阵的方程M(t,y)*y’=f(t,y)。命令ode23只能求解常数混合矩阵的问题;命令ode23tode15s可以求解奇异矩阵的问题。

    Tspan 积分区间(即求解区间)的向量tspan=[t0,tf]。要获得问题在其他指定时间点t0,t1,t2,…上的解,则令tspan=[t0,t1,t2,…,tf](要求是单调的)。

    Y0 包含初始条件的向量。

    Options 用命令odeset设置的可选积分参数。

    P1,p2,… 传递给函数odefun的可选参数。

    格式  [T,Y] = solver(odefun,tspan,y0)   %在区间tspan=[t0,tf]上,从t0tf,用初始条件y0求解显式微分方程y’=f(t,y)。对于标量t与列向量y,函数f=odefun(t,y)必须返回一f(t,y)的列向量f。解矩阵Y中的每一行对应于返回的时间列向量T中的一个时间点。要获得问题在其他指定时间点t0,t1,t2,…上的解,则令tspan=[t0,t1,t2,…,tf](要求是单调的)。

    [T,Y] = solver(odefun,tspan,y0,options)   %用参数options(用命令odeset生成)设置的属性(代替了缺省的积分参数),再进行操作。常用的属性包括相对误差值RelTol(缺省值为1e-3)与绝对误差向量AbsTol(缺省值为每一元素为1e-6)。

    [T,Y] =solver(odefun,tspan,y0,options,p1,p2…) 将参数p1,p2,p3,..等传递给函数odefun,再进行计算。若没有参数设置,则令options=[]

    1.求解具体ODE的基本过程:

    1)根据问题所属学科中的规律、定律、公式,用微分方程与初始条件进行描述。

    F(y,y’,y’’,…,y(n),t) = 0

    y(0)=y0,y’(0)=y1,…,y(n-1)(0)=yn-1

    y=[y;y(1);y(2);…,y(m-1)]nm可以不等

    2)运用数学中的变量替换:yn=y(n-1),yn-1=y(n-2),…,y2=y1=y,把高阶(大于2阶)的方程(组)写成一阶微分方程组:

    3)根据(1)与(2)的结果,编写能计算导数的M-函数文件odefile

    4)将文件odefile与初始条件传递给求解器Solver中的一个,运行后就可得到ODE的、在指定时间区间上的解列向量y(其中包含y及不同阶的导数)。

    2.求解器Solver与方程组的关系表见表2-3

    2-3

    函数指令

    含  义

    函  数

    含    义

    求解器

    Solver

    ode23

    普通2-3阶法解ODE

    odefile

    包含ODE的文件

    ode23s

    低阶法解刚性ODE

    选项

    odeset

    创建、更改Solver选项

    ode23t

    解适度刚性ODE

    odeget

    读取Solver的设置值

    ode23tb

    低阶法解刚性ODE

    输出

    odeplot

    ODE的时间序列图

    ode45

    普通4-5阶法解ODE

    odephas2

    ODE的二维相平面图

    ode15s

    变阶法解刚性ODE

    odephas3

    ODE的三维相平面图

    ode113

    普通变阶法解ODE

    odeprint

    在命令窗口输出结果

    3.因为没有一种算法可以有效地解决所有的ODE问题,为此,MATLAB提供了多种求解器Solver,对于不同的ODE问题,采用不同的Solver。

    2-4  不同求解器Solver的特点

    求解器Solver

    ODE类型

    特点

    说明

    ode45

    非刚性

    一步算法;45Runge-Kutta方程;累计截断误差达(△x)3

    大部分场合的首选算法

    ode23

    非刚性

    一步算法;23Runge-Kutta方程;累计截断误差达(△x)3

    使用于精度较低的情形

    ode113

    非刚性

    多步法;Adams算法;高低精度均可到10-3~10-6

    计算时间比ode45

    ode23t

    适度刚性

    采用梯形算法

    适度刚性情形

    ode15s

    刚性

    多步法;Gear’s反向数值微分;精度中等

    ode45失效时,可尝试使用

    ode23s

    刚性

    一步法;2Rosebrock算法;低精度

    当精度较低时,计算时间比ode15s

    ode23tb

    刚性

    梯形算法;低精度

    当精度较低时,计算时间比ode15s

    4.在计算过程中,用户可以对求解指令solver中的具体执行参数进行设置(如绝对误差、相对误差、步长等)。

    2-5  Solver中options的属性

    属性名

    取值

    含义

    AbsTol

    有效值:正实数或向量

    缺省值:1e-6

    绝对误差对应于解向量中的所有元素;向量则分别对应于解向量中的每一分量

    RelTol

    有效值:正实数

    缺省值:1e-3

    相对误差对应于解向量中的所有元素。在每步(第k)计算过程中,误差估计为:

    e(k)<=max(RelTol*abs(y(k)),AbsTol(k))

    NormControl

    有效值:onoff

    缺省值:off

    为‘on’时,控制解向量范数的相对误差,使每步计算中,满足:norm(e)<=max(RelTol*norm(y),AbsTol)

    Events

    有效值:onoff

    为‘on’时,返回相应的事件记录

    OutputFcn

    有效值:odeplot、odephas2、odephas3odeprint

    缺省值:odeplot

    若无输出参量,则solver将执行下面操作之一:

    画出解向量中各元素随时间的变化;

    画出解向量中前两个分量构成的相平面图;

    画出解向量中前三个分量构成的三维相空间图;

    随计算过程,显示解向量

    OutputSel

    有效值:正整数向量

    缺省值:[]

    若不使用缺省设置,则OutputFcn所表现的是那些正整数指定的解向量中的分量的曲线或数据。若为缺省值时,则缺省地按上面情形进行操作

    Refine

    有效值:正整数k>1

    缺省值:k = 1

    k>1,则增加每个积分步中的数据点记录,使解曲线更加的光滑

    Jacobian

    有效值:onoff

    缺省值:off

    若为‘on’时,返回相应的ode函数的Jacobi矩阵

    Jpattern

    有效值:onoff

    缺省值:off

    为‘on’时,返回相应的ode函数的稀疏Jacobi矩阵

    Mass

    有效值:noneM、

    M(t)、M(t,y)

    缺省值:none

    M:不随时间变化的常数矩阵

    M(t):随时间变化的矩阵

    M(t,y):随时间、地点变化的矩阵

    MaxStep

    有效值:正实数

    缺省值:tspans/10

    最大积分步长

    2-45  求解描述振荡器的经典的Ver der Pol微分方程

    y(0)=1,y’(0)=0

    令x1=y,x2=dy/dx,则

    dx1/dt = x2

    dx2/dt = μ(1-x2)-x1

    编写函数文件verderpol.m:

    function xprime = verderpol(t,x)

    global MU

    xprime = [x(2);MU*(1-x(1)^2)*x(2)-x(1)];

    再在命令窗口中执行:

    >>global MU

    >>MU = 7;

    >>Y0=[1;0]

    >>[t,x] = ode45(‘verderpol’,0,40,Y0);

    >>x1=x(:,1);x2=x(:,2);

    >>plot(t,x1,t,x2)

    图形结果为图2-20

     

    2-20  Ver der Pol微分方程图

    2.5  偏微分方程的数值解

    MATLAB提供了一个专门用于求解偏微分方程的工具箱—PDE Toolbox (Paticial Difference Equation )。在本章,我们仅提供一些最简单、经典的偏微分方程,如:椭圆型、双曲型、抛物型等少数的偏微分方程,并给出求解方法。用户可以从中了解其解题基本方法,从而解决相类似的问题。

    Matlab能解决的偏微分类型

       其中u = u(x,y),

    c = c(x,y),,

    2.5.1  单的Poission方程

    Poission方程是特殊的椭圆型方程:,

    即 c = 1,a = 0,f = -1

    Poission的解析解为:。在下面计算中,用求得的数值解与精确解进行比较,看误差如何。

    方程求解

    1)问题输入:

      c = 1;a = 0;f = 1;%方程的输入。给caf赋值即可

      g = 'circleg'       %  区域G,内部已经定义为 circleg

       b = 'circleb1'      %  u在区域G的边界上的条件,内部已经定义好

    2)对单位圆进行网格化,对求解区域G作剖分,且作的是三角分划:

      [p,e,t] = initmesh(g,'hmax'1

    3)迭代求解:

      error = [];err = 1;

      while err > 0.001

      [p,e,t]=refinemesh('circleg',p,e,t);

      u=assempde('circleb1',p,e,t,1,0,1);

      exact=-(p(1,:)^2+p(2,:)^2-1)/4;

      err=normu-exact',inf);

      error=[error,err]

      end

    4)误差显示与区域G内的剖分点数:

      Error: 1.292265e-002. Number of nodes: 25

      Error: 4.079923e-003. Number of nodes: 81

      Error: 1.221020e-003. Number of nodes: 289

      Error: 3.547924e-004. Number of nodes: 1089

    5)结果显示:

      subplot(2,2,1),pdemesh(p,e,t)%结果显示

      title'数值解'

      subplot2,2,2),pdesurfp,t,u%精确解显示

      title('精确解'

      subplot(2,2,3),pdesurf(p,t,u-exact')%与精确解的误差

      title('计算误差'

     

    图2-21  Poission方程图

    2.5.2  双曲型偏微分方程

    1Matlab能求解的类型:

    其中,,,,,

    2.形传递问题:

    即:c =1; a = 0; f = 0; d = 1

    3.方程求解

    1)问题的输入:

      c = 1; a = 0; f = 0; d = 1;   % 输入方程的系数

      g = 'squareg'    % 输入方形区域G,内部已经定义好

      b = 'sqareb3'    % 输入边界条件,即初始条件

    2)对单位矩形G进行网格化:

      [p,e,t] = initmesh('squareg')

    3)定解条件和求解时间点:

      x = p(1,:)'; y = p(2,:)';

      u0 = atan(cos(pi/2*x));

      ut0 = 3*sin(pi*x).*exp(sin(pi/2*y));

      n = 31;

      tlist = linspace(0,5,n);

    4)求解:

      uu = hyperbolic(uo, ut0,tlist,b,p,e,t,c,a,f,d);

    结果显示:计算过程中的时间点和信息

    Time0.166667

    Time0.333333

    Time4.33333

    ……

    Time4.66667

    Time4.83333

    Time5

    428 successful steps

    62 failed attempts

    982 function evaluations

    1 partial derivatives

    142 LU decompositions

    981 solutions of linear systems

    5)动画显示:

    delta=-1:0.1:1;

    [uxy,tn,a2,a3]=tri2grid(p,t,uu(:,1),delta,delta);

    gp=[tn;a2;a3];

    umax=max(max(uu));

    umin=min(min(uu));

    newplot;M=moviein(n);

    for i=1:n,

        pdeplot(p,e,t,'xydata',uu(:,i),'zdata',uu(:,i),…

        'mesh','off','xygrid','on','gridparam',gp,…

        'colorbar','off','zstyle','continuous');

        axis([-1 1 -1 1 umin umax]);

        caxis([umin umax]);

        M(:,i)=getframe;

    end

    movie(M,5)

     

    2-22是动画过程中的一个状态。

     

     

     

    2-22  波动方程动画中的一个状态

     

    2.5.3  抛物型偏微分方程

    1Matlab能求解的类型:

    其中,,,,,

    2.热传导方程:

    即:c = 1; a = 0; f = 1; d = 1;

    3.问题计算

    1)问题的输入:

    c = 1; a = 0; f = 1; d = 1;  %  输入方程的系数

    g = 'squareg';  %  输入方形区域G

    b = 'squareb1';  %  输入边界条件

    2)对单位矩形的网格化:

    [p,e,t] = initmesh(g);

    3)定解条件和求解的时间点:

    u0 = zeros(size(p, 2), 1);

    ix = find(sqrt(p(1, :).^2+p(2, :).^2) < 0.4);

    u0(ix) = ones(size(ix));

    nframes = 20;

    tlist=linspace(0,0.1,nframes)  % 在时间[0, 0.1]20个点上计算,生成20

    4)求解方程:

    u1 = parabolic(u0, tlist, b, p, e, t, c, a, f, d)

    计算结果如下:

    Time: 0.00526316

    Time: 0.0105263

    ……

    Time: 0.0947368

    Time: 0.1

    75 successful steps

    1 failed attempts

    154 function evaluations

    1 partial derivatives

    17 LU decompositions

    153 solutions of linear systems

    5)动画显示:

    x = linspace(-1,1,31); y = x;

    newplot;

    Mv = moviein(nframes);

    umax=max(max(u1));

    umin=min(min(u1));

    for j=1:nframes

       u=tri2grid(p,t,u1(:,j),tn,a2,a3);i=find(isnan(u));u(i)=zeros(size(i));…

       surf(x,y,u);caxis([umin umax]);colormap(cool),…

       axis([-1 1 -1 1 0 1]);…

       Mv(:,j) = getframe;…

    end

    movie(Mv,10)

    2-23是动画过程中的瞬间状态。

     

    2-23  热传导方程动画瞬间状态图

  • 相关阅读:
    windows常用命令
    Qt 添加 QtNetwork 库文件
    LoadLibrary加载动态库失败
    C++11 Function 使用场景
    编程书籍集
    代码重构例集
    多重循环编码规范
    vim 命令学习(基础篇)
    QT构建窗体(父窗体传为野指针)异常案例
    JAVA_SE基础——26.[深入解析]局部变量与成员变量的差别
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2330558.html
Copyright © 2011-2022 走看看