MATLAB常用代码(完结)

1.退出MATLAB
    关闭MATLAB桌面
    在命令窗口执行quit或exit命令

2.开平方-sqrt(x)

3.指数函数exp(x)

4.clc清除窗口显示内容的命令

5.who、whos命令用来清除工作空间的变量

6.clear命令用来清除工作空间的变量

7.dir显示当前工作目录的文件和子目录清单

8.cd显示或设置当前工作目录

9.type显示指定m文件的内容

10.help或doc获取在线帮助

11.求方程2x^5-3x^3+71x^2-9x+13=0的全部跟
    >> p=[2,0,-3,71,-9,13];
    >> x=roots(p);

12.求解线性方程组2x+3y-z=2
         8x+2y+3z=4
         45x+3y+9z=23
    >> a=[2,3,-1;8,2,3;45,3,9];%建立系数矩阵a
    >> b=[2,4,23]%建立列向量b
    >> x=inv(a)*b

13.求解积分0->1xln(1+x)
    >> quad('x.*log(1+x)',0,1)

14.多项式曲线拟合
    >> x=[1,2,3,4,5,6,7,8,9,10];
    >> y=[1,2,3,4,5,4.7,5,5.2,6,7.2];
    >> p1=polyfit(x,y,1)%一次多项式拟合
    >> p3=polyfit(x,y,3)%三次多项式拟合
    >> x2=1:0.1:10;
    >> y1=polyval(p1,x2);
    >> y3=polyval(p3,x2);
    >> plot(x,y,'*',x2,y1,':',x2,y3)

15.函数linspace(x1,x2,n)
    >> x=linspace(1,2,5)

    x =

            1.0000    1.2500    1.5000    1.7500    2.0000

16.ones(生成全1的矩阵)、zeros(生成全0的矩阵)
    >> ones(3)
    >> ones(3,4)

17.函数reshape()
    >> a=-4:4
    >> reshape(a,3,3)

18.画出y=1/(x+1)的函数曲线,x∈[0,100]
    >> x=0:100;
    >> y=1./(x+1);
    >> plot(x,y);
    >> legend('y=1/(x+1)');
    
19.生成一个信号x=sin(2*pi*t)+sin(4*pi*t)
    >> t=[0:199]./100;%采样时间点
    >> x=sin(2*pi*t)+sin(4*pi*t);%生成信号
    >> plot(t,x);
    >> legend('sin(2*pi*t)+sin(4*pi*t)');

20.判断方阵中的元素能否被3整除
    >> A=[24,35,13;23,39,47;90,41,80];
    >> P=rem(A,3)==0%被3整除,求余

21.在[0,3π]区间,求y=sinx的值。要求消去负半波,即[π,2π]区间内的函数值置零。
    >> x=0:pi/100:3*pi;
    >> y=sin(x);
    >> y1=(y>=0).*y;%消去负半波
    >> plot(y1);

22.求向量的最大值
    >> x=[-43,72,9,16,23,47];
    >> y=max(x)%求向量x中的最大值
    >> [y,I]=max(x)%求向量x中的最大值及其该元素的位置

23.求矩阵的最大值
    >> A=[24,35,13;23,39,47;90,41,80];
    >> y=max(A)%求矩阵A中每列的最大值
    >> [y,I]=max(A)%求矩阵A中每列的最大值及其该元素的位置
    >> r2=max(A,[],2)%求矩阵A中每行的最大值

24.数据分析与统计
    sum(x):返回向量x各元素的和;
    prod(x):返回向量x各元素的乘积;
    sum(x):返回一个行向量,其第i个元素是A的第i列的元素和;
    prod(A):返回一个行向量,其第i个元素是A的第i列的元素乘积;
    sum(A,dim):当dim为1时,该函数等同于sum(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的各元素之和;
    prod(A,dim):当dim为1时,该函数等同于prod(A);当dim等于2时,返回一个列向量,其第i个元素是A的第i行的各元素乘积;
    mean(x):返回向量x的算术平均值;
    median(x):返回向量x的中值;
    mean(A):返回一个行向量,其第i个元素是A的第i列的算术平均值;
    median(A):返回一个行向量,其第i个元素是A的第i列的中值;
    mean(A,dim):当dim为1时,该函数等同于mean(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的算术平均值;
    median(A,dim):当dim为1时,该函数等同于median(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的中值;

25.数组元素的标识与寻访
    size函数返回变量的大小,即变量数组的行列数;
    length函数返回变量数组的最大维数;
    sub2ind函数-双下标转换为单下标;>> sub2ind(size(A),2,2)
    ind2sub函数-单下标转换为双下标;>> IND=sub2ind(size(A),2,2);>> [I,J]=ind2sub(size(A),IND)
  

26.单下标的使用
    >> a=zeros(2,5);
    >> a(:)=-4:5

    a =

            -4    -2     0     2     4
           -3    -1     1     3     5

27.一维数组元素与子数组的寻访与赋值
    >> a=linspace(1,10,5)

    a =

          1.0000    3.2500    5.5000    7.7500   10.0000

    >> a(3)%寻访a的第3个元素

    ans =

            5.5000

    >> a([1 2 5])%寻访a的第1、2、5个元素组成的子数组

    ans =

            1.0000    3.2500   10.0000
    >> a(1:3)%寻访前3个元素组成的子数组

    ans =

            1.0000    3.2500    5.5000

    >> a(3:-1:1)%由前3个元素倒序构成的子数组

    ans =

            5.5000    3.2500    1.0000

    >> a(3:end)%第3个元素及其后的所有元素构成的子数组

    ans =

            5.5000    7.7500   10.0000

    >> a(3:end)%第3个元素及其后的所有元素构成的子数组,end作为参数使用,返回最后一个元素的下标

    ans =

            5.5000    7.7500   10.0000
    >> a([1 2 3 5 5 3 2 1])%数组元素可以被任意重复访问,构成长度大于原数组的新数组。

    ans =

            1.0000    3.2500    5.5000   10.0000   10.0000    5.5000    3.2500    1.0000
    >> a(3)=0%修改数组a的第3个元素值为0

    a =

          1.0000    3.2500         0    7.7500   10.0000

    >> a([2 5])=[1 1]%可以修改指定数组元素的值,一次可以修改多个数组元素的值,要修改的数组元素的个数应与送入数组的元素个数相同

    a =

          1.0000    1.0000         0    7.7500    1.0000
28.二维数组元素与子数组的寻访与赋值
    >> a_2=zeros(2,4)%创建2*4的全0数组

    a_2 =

             0     0     0     0
             0     0     0     0

    >> a_2(:)=1:8

    a_2 =

             1     3     5     7
             2     4     6     8

    >> a_2([2 5 8])%单下标方式寻访多个元素

    ans =

             2     5     8

    >> a_2([2 5 8])=[10 20 30]

    a_2 =

             1     3    20     7
            10     4     6    30

    >> a_2(:,[2 3])=ones(2)%双下标方式寻访并修改

    a_2 =

             1     1     1     7
            10     1     1    30
29.字符串
    >> str1='I like MATLAB,';%建立字符串str1
    >> str2='Java,and Python!';%建立字符串str2
    >> str3=[str1 str2]%直接连接str1及str2,进而建立str3

    str3 =

    I like MATLAB,Java,and Python!
    >> sentence='I ''ve got a date!';%如果输入的字符串中有单引号,则由两个连续的单引号来表示
    >> length(sentence)%计算字符串sentence的长度

    ans =

            17

    >> sentenceAscii=double(sentence)%查看字符串sentence的ASCII码

    sentenceAscii =

            73    32    39   118   101    32   103   111   116    32    97    32   100    97   116   101    33

    >> sentence2=char(sentenceAscii)%将ASCII码恢复成字符串形式

    sentence2 =

        I 've got a date!
    >> Chinese='今日事,今日毕';
    >> out1=class(Chinese)%out1的值是“char”

    out1 =

    char

    >> out2=ischar(Chinese)%out2的值是1,代表Chinese是字符串变量

    out2 =

             1

    >> x=Chinese+1;
    >> out3=ischar(x)%out3的值是0,代表x不是字符串变量

    out3 =

             0
30.字符串的比较
    >> str1='today';
    >> str2='tomorrow';
    >> str3='today';
    >> out1=strcmp(str1,str2)%比较字符串str1和str2

    out1 =

             0

    >> out2=strcmp(str1,str3)%比较字符串str1和str3

    out2 =

             1
31.数组维数的减小
    >> a=magic(4),a(:,2)=[]

    a =

        16     2     3    13
         5    11    10     8
         9     7     6    12
         4    14    15     1


    a =

        16     3    13
         5    10     8
         9     6    12
         4    15     1

    >> a(1,2)=[]
    带有下标的赋值维度不匹配。
 
    >> a(2:4)=[]%数组a将变为向量
    a =

        16     3    10     6    15    13     8    12     1
32.元胞数组的创建
    Cell indexing方式创建元胞数组
    >> c(1,1)={[1 4 3;0 5 8;7 2 9]}

    c = 

        [3x3 double]

    >> c(1,2)={'Anne Smith'}

    c = 

        [3x3 double]    'Anne Smith'

    >> c(2,1)={3+7i}

    c = 

          [3x3 double]    'Anne Smith'
        [3.0000 + 7.0000i]              []

    >> c(2,2)={-pi:pi/10:pi}

    c = 

          [3x3 double]    'Anne Smith' 
        [3.0000 + 7.0000i]    [1x21 double]

    >> class(c)

    ans =

    cell
    
    Content indexing方式创建元胞数组
    >> b{1,1}='James'

    b = 

        'James'

    >> class(b)

    ans =

    cell

    >> b{1,2}=[1 2;3 4;5 6]

    b = 

        'James'    [3x2 double]

    >> b{2,1}=pi

    b = 

        'James'     [3x2 double]
        [3.1416]              []

    >> b{2,2}=zeros(5)

    b = 

        'James'     [3x2 double]
        [3.1416]    [5x5 double]
33.元胞数组的连接
    >> a=[b c]

    a = 

        'James'     [3x2 double]          [3x3 double]    'Anne Smith' 
        [3.1416]    [5x5 double]    [3.0000 + 7.0000i]    [1x21 double]

    >> a=[b;c]

    a = 

        'James'               [3x2  double]
        [          3.1416]    [5x5  double]
          [3x3 double]    'Anne Smith' 
        [3.0000 + 7.0000i]    [1x21 double]

34.显示元胞数组的内容
    >> a(2,2)={-pi:pi/10:pi}

    a = 

          [3x3 double]    'Anne Smith' 
    [3.0000 + 7.0000i]    [1x21 double]

    >> celldisp(a)%显示全部内容
 
    a{1,1} =
 
             1     2     3
             4     5     6
             7     8     9

 
 
    a{2,1} =
 
           3.0000 + 7.0000i

 
 
    a{1,2} =
 
        Anne Smith
 
 
    a{2,2} =
 
          Columns 1 through 11

           -3.1416   -2.8274   -2.5133   -2.1991   -1.8850   -1.5708   -1.2566   -0.9425   -0.6283   -0.3142         0

          Columns 12 through 21

            0.3142    0.6283    0.9425    1.2566    1.5708    1.8850    2.1991    2.5133    2.8274    3.1416

 
    >> cellplot(a)%图形方式显示元胞数组的结构
    >> a{1,2}%使用内容下标索引显示指定元胞的数据

    ans =

    Anne Smith

    >> a{:}%一次显示a的全部数据

    b = 

    'James'     [3x2 double]
    [3.1416]    [5x5 double]

    >> b,d=b{1,2}%读取b元胞数组的第1行、第2列元胞的内容

    b = 

        'James'     [3x2 double]
        [3.1416]    [5x5 double]


    d =

         1     2
         3     4
         5     6

    >> e=b{1,2}(3,1)%读取b{1,2}的第3行、第1列的数据

    e =

             5

    >> f=a(1,:)%读取元胞数组a第一行的所有元胞

    f = 

            [3x3 double]    'Anne Smith'

    >> a(1,:)=[]%删除元胞数组a第一行的所有元胞

    a = 

            [3.0000 + 7.0000i]    [1x21 double]

35.结构数组变量的创建
    方法一:直接键入
    Exam:创建一个关于学生信息的结构数组,每个结构包含学生姓名(name)、学号(id)、成绩(scores)。
    >> clear student%清除student变量
    >> student.name='张三';%加入name字段
    >> student.id='mr871912';%加入id字段
    >> student.scores=[58,75,62];%加入scores字段
    >> student%显示结构变量的数据

    student = 

              name: '张三'
            id: 'mr871912'
            scores: [58 75 62]
    >> student(2).name='张宁';
    >> student(2).id='mr871913';
    >> student(2).scores=[68,85,92];
    >> student

    student = 

    1x2 struct array with fields:

            name
            id
            scores

    >> student(1)

    ans = 

              name: '张三'
            id: 'mr871912'
            scores: [58 75 62]
    
    方法二:struct函数
    格式:Structure Array_var_name=struct(field1,value1,field2,value2,...),field1、field2、...是结构的字段名,value1、value2、...
则是相应字段所包含的数据。
    Exam:使用struct创建结构数组变量
    >> clear student
    >> student=struct('name','张听说','scores',[50 60]);
    >> student(2)=struct('name','张延安','scores',[60 70]);
    >> student(1),student(2)
    Exam:使用struct创建结构数组变量(一次建立多个元素)
    >> clear student
    >> student=struct('name',{'张婷说','张延安'},'scores',{[50 60],[60 70]});
    >> student(1),student(2)

    ans = 

              name: '张婷说'
            scores: [50 60]


    ans = 

              name: '张延安'
            scores: [60 70]

36.结构数组嵌套:结构数组中结构的字段还可以是结构
    >> student(2).course(1).title='Web Programming';
    >> student(2).course(1).credits=2;
    >> student(2).course(2).title='Numerical Method';
    >> student(2).course(2).credits=3;
    >> student(2).course

    ans = 

    1x2 struct array with fields:

        title
        credits
    >> student(1).name='Newton';%修改结构数组变量的字段值
    >> student(1).name

    ans =

        Newton

37.cat函数:排列结构数组某字段的值
    格式:cat(dim,structurefield),dim=1,竖排;dim=2,横排。
    >> cat(1,student.scores)

    ans =

            50    60
            60    70

    >> cat(2,student.scores)

    ans =

            50    60    60    70

38.计算平均值(使用mean函数)
    计算每次考试的平均值
    >> average1=mean(cat(1,student.scores))

    average1 =

            55    65
    计算每个学生成绩的平均值
    >> average2=mean(student(2).scores)

    average2 =

            65

39.二维曲线绘图的基本操作
(1)plot(x),x为向量时,以该元素的下标为横坐标、元素值为纵坐标绘出曲线。
(2)plot(x,y),x、y为同维数组时,绘制以x、y元素为横纵坐标的曲线。
(3)plot(x1,y1,x2,y2,...),绘制以x1为横坐标、y1为纵坐标的曲线1,以x2为横坐标、y2为纵坐标的曲线2,等等。其中x为横坐标,y为纵坐标,绘
制y=f(x)函数曲线。
    Exam:在[0,2π]区间内,绘制曲线2e^-0.5xsin(2πx)。
    >> x=0:pi/100:2*pi;
    >> y=2*exp(-0.5*x).*sin(2*pi*x);
    >> plot(x,y)
    Exam:绘制曲线x=tcos(3t)、y=t(sint)^2,-π≤t≤π。
    >> t=-pi:pi/100:pi;
    >> x=t.*cos(3*t);
    >> y=t.*sin(t).^2;
    >> plot(x,y)

40.绘制复杂曲线
    Exam:用图形表示连续调制波形及其包络线。
    >> t=(0:pi/100:pi)';%长度为101的时间采样列向量
    >> y1=sin(t)*[1,-1];%包络线函数值,是(101*2)的矩阵
    >> y2=sin(t).*sin(9*t);%长度为101的调制波列向量
    >> t3=pi*(0:9)/9;
    >> y3=sin(t3).*sin(9*t3);
    >> plot(t,y1,'r',t,y2,'b',t3,y3,'bo')
    >> axis([0,pi,-1,1])

41.重绘曲线
    Exam:重绘波形y=sin(t)sin(9t)及其包络线。
    >> plot(t,y1,'r:')
    >> hold on
    >> plot(t,y2,'b')
    >> plot(t3,y3,'bo')
    >> axis([0,pi,-1,1])
    >> hold off

42.利用hold绘制离散信号的波形
    >> t=2*pi*(0:20)/20;
    >> y=cos(t).*exp(-0.4*t);
    >> stem(t,y,'g');
    >> hold on
    >> stairs(t,y,'r');
    >> hold off

43.双纵坐标:plotyy指令
    调用格式:plotyy(x1,y1,x2,y2),x1-y1曲线y轴在左,x2-y2曲线y轴在右
    >> x=0:0.01:20;
    >> y1=200*exp(-0.05*x).*sin(x);
    >> y2=0.8*exp(-0.5*x).*sin(10*x);
    >> plotyy(x,y1,x,y2);

44.多子图
    subplot(m,n,k):使(m*n)幅子图中第k个子图成为当前图;其编号原则:左上方为第1子图,然后向右向下一次排序。
    subplot('position',[left,bottom,width,height]):在指定的位置上开辟子图,并成为当前图;用于手工指定子图位置,指定位置的四元组采
用归一化的标称单位,即认为整个图形窗口绘图区域的高、宽的取值范围都是[0,1],而左下角为(0,0)坐标。
    >> t=(pi*(0:1000)/1000)';
    >> y1=sin(t);
    >> y2=sin(10*t);
    >> y12=sin(t).*sin(10*t);
    >> subplot(2,2,1);
    >> subplot(2,2,1),plot(t,y1);
    >> axis([0,pi,-1,1])
    >> subplot(2,2,2),plot(t,y2);
    >> axis([0,pi,-1,1])
    >> subplot('position',[0.2,0.2,0.2,0.2]),plot(t,y12);

45.绘制图形的辅助操作
    >> t=(0:15)*2*pi/15;
    >> y=sin(t);
    >> subplot(3,2,1),plot(t,y);title('Lins style is default')%默认
    >> subplot(3,2,2),plot(t,y,'o');title('Lins style is o')%圆圈
    >> subplot(3,2,3),plot(t,y,'k:');title('Lins style is k:')%黑虚线
    >> subplot(3,2,4),plot(t,y,'k:*');title('Lins style is k:*')%黑虚线八线符
    >> subplot(3,2,5),plot(t,y,'m-d');title('Lins style is m-d')%品红实线菱形符
    >> subplot(3,2,6),plot(t,y,'r-p');title('Lins style is r-p')%红实线五角星符

46.绘制椭圆,长轴为3.25,短轴为1.15
    >> x=1.15*cos(t);y=3.25*sin(t);%y为长轴,x为短轴
    >> subplot(2,2,1);plot(x,y);
    >> axis off%不显示坐标轴
    >> title('axis off')
    >> subplot(2,2,2);plot(x,y);
    >> axis image;%纵、横坐标等长刻度,坐标框紧贴数据范围
    >> title('axis image')
    >> subplot(2,2,3);plot(x,y);
    >> axis equal;%纵、横坐标等长刻度
    >> subplot(2,2,4);plot(x,y);
    >> axis square;%产生方形坐标系
    >> title('axis square');

47.分格线与grid指令
    grid on(画出分格线);
    grid off(不画分格线),缺省设置;
    >> t=6*pi*(0:100)/100;
    >> y=1-exp(-0.3*t).*cos(0.7*t);
    >> tt=t(find(abs(y-1)>0.05));
    >> ts=max(tt);
    >> plot(t,y,'r-');
    >> grid on;
    >> axis([0,6*pi,0.6,max(y)]);
    >> title('y=1-exp(-\alpha*t)*cos(\omega*t)');
    >> hold on;
    >> plot(ts,0.95,'bo');
    >> hold off;
    >> set(gca,'xtick',[2*pi,4*pi,6*pi],'ytick',[0.95,1,1.05,max(y)]);
    >> grid on;

48.在正弦曲线上标注特殊值
    >> t=(0:100)/100*2*pi;
    >> y=sin(t);
    >> plot(t,y);
    >> text(3*pi/4,sin(3*pi/4),'\fontsize{16}\leftarrowsin(t)=.707');
    >> text(pi,sin(pi),'\fontsize{16}\leftarrowsin(t)=0');
    >> text(5*pi/4,sin(5*pi/4),'\fontsize{16}sin(t)=-.707\rightarrow','HorizontalAlignment','right')
%'HorizontalAlignment','right'设置图形标识为水平右对齐

    >> t=0:900;
    >> plot(t,0.25*exp(-0.005*t));
    >> title('\fontsize{16}\itAe^{\alphat}');
    >> text(300,.25*exp(-0.005*300),'\fontsize{14}\leftarrow0.25\ite^-0.005\itt_at\itt=300');

49.特殊图形(直方图(柱形图)bar)
    >> x=-2.9:0.2:2.9;
    >> bar(x,exp(-x.*x),'r');

例如:北京市从业人员统计

    (累计式直方图一(竖着))
    >> year=[1990 1995 2000];
    >> people=[90.7 281.6 254.8;70.6 271 323.7;73.9 214.6 326.5];
    >> bar(year,people,'stack');
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

    (累计式直方图二(横着))
    >> barh(year,people,'stack');
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

    (分组式直方图一(竖着))
    >> bar(year,people,'group');%分组式直方图
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

    (分组式直方图二(横着))
    >> barh(year,people,'group');
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

50.饼图指令pie

饼图指令pie用来表示各元素占总和的百分数。该指令第二输入变量是与第一变量同长的0-1向量,1使对应扇块突出。
    >> a=[1,1.6,1.2,0.8,2.1];
    >> subplot(1,2,1),pie(a,[1 0 1 0 0]),legend({'1','2','3','4','5'});
    >> subplot(1,2,2),b=int8(a==min(a));
    >> pie3(a,b);
    >> colormap(cool);

51.离散杆图stem

例如,余弦波的采样信号图
    >> t=linspace(-2*pi,2*pi,20);
    >> h=stem(t,cos(t));

例如,分别以条形图、填充图、阶梯图和杆图形式绘图
    >> subplot(221);
    >> bar(x,y,'g');
    >> title('bar(x,y,''g'')');
    >> subplot(222);
    >> fill(x,y,'r');
    >> title('fill(x,y,''r'')');
    >> subplot(223);
    >> stairs(x,y,'b');
    >> title('stairs(x,y,''b'')');
    >> subplot(224);
    >> stem(x,y,'k');
    >> title('stem(x,y,''k'')');

52.极坐标图polar

polar函数用来绘制极坐标图,其调用格式为:polar(theta,rho,选项)

例如,绘制ρ=sin(2θ)
    >> theta=0:0.01:2*pi;
    >> rho=sin(2*theta);
    >> polar(theta,rho,'k');

53.三维绘图的基本操作
三维线图指令plot3:三维绘图指令中,plot3最易于理解,它的使用格式与plot十分相似,只是对应第三位空间的参量。
    >> t=(0:0.02:2)*pi;
    >> x=sin(t);
    >> y=cos(t);
    >> z=cos(2*t);
    >> plot3(x,y,z,'b-',x,y,z,'bd');
    >> view([-82,58]);
    >> box on
    >> legend('链','宝石')    

54.三维网线图(mesh)和曲面图(surf)
画函数z=f(x,y)所代表的三维空间曲面,需要做一下的数据准备工作:
    确定自变量的取值范围和取值间隔。
        x=x1:dx:x2;
        y=y1:dy:y2;
    构成x-y平面上的自变量采样“格点”矩阵。
        利用MATLAB指令meshgrid产生“格点”矩阵;
        [xa,ya]=meshgrid(x,y);
    计算函数在自变量采样“格点”上的函数值,即z=f(x,y)。
网线图、曲面图绘制。

例如,绘制函数z=x^2+y^2的曲面
    
    >> x=-4:4;
    >> y=x;
    >> [x,y]=meshgrid(x,y);%生成x-y坐标“格点”矩阵
    >> z=x.^2+y.^2;%计算格点上的函数值
    >> subplot(1,2,1),mesh(x,y,z);%三维网格图
    >> subplot(1,2,2),surf(x,y,z);%三维曲面图
    >> colormap(hot);

55.图像文件的读写与图像显示
    imread指令-读取图像文件(BMP,GIF,PNG,JPEG,andTIFF)
    imshow指令-显示图像
    imwrite指令-保存图像
例如,读取图像文件
    
    >> img1=imread('shenxianyeye.jpg');
    >> img2=imread('cat.tif');
    >> whos img1 img2
      Name        Size                  Bytes  Class    Attributes

      img1      768x1024x3            2359296  uint8              
      img2      598x1005x3            1802970  uint8              

    >> imshow(img1);%显示图片

    简单图像处理
    >> lighter=2*img1;%改变图片的亮度
    >> subplot(1,2,1);
    >> imshow(img1);
    >> title('Original');
    >> subplot(1,2,2);
    >> imshow(lighter);
    >> title('Lighter');
    >> imwrite(lighter,'mysaved.jpg');%保存图像
    >> dir mysaved.*;%查看保存结果

    mysaved.jpg  
    >> black=rgb2gray(img1);%彩色图像转换为灰度图像
    >> imshow(black);
    >> zoom on%图像的缩放

56.图像特征提取
    >> black=rgb2gray(img2);
    >> imag_edge1=edge(black,'sobel');%sobel边缘提取算法
    >> subplot(121),imshow(imag_edge1);
    >> imag_edge2=edge(black,'canny');%canny边缘提取算法
    >> subplot(122),imshow(imag_edge2);
    >> subplot(123),imshow(imag2);


57.MATLAB命令的执行方式
    交互式命令执行方式(命令窗口):逐条输入,逐条执行,操作简单、直观,但速度慢,执行过程不能保留。
    M文件的程序执行方式:将命令编成程序存储在一个文件中(M文件),依次运行文件中的命令,可以重复进行。
    MATLAB程序设计有传统高级语言的特征,又有自己独特的特点,可以利用数据结构的特点,使程序结构简单,编程效率高。

58.M文件的分类
    用MATLAB语言编写的程序,称为M文件。是由若干MATLAB命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法。
    M文件根据调用方式的不同分为两类:命令文件(Script File)、函数文件(Function File)。它们的扩展名都是.m

59.命令文件和函数文件的区别
    命令文件没有输入参数,也不返回输出参数;函数文件可以带输入参数,也可以返回输出参数。
    命令文件对工作空间中的变量进行操作,文件中所有命令的执行结果也返回工作空间中;函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量也被清除。
    命令文件可以直接运行;函数文件不能直接运行,要以函数调用的方式来调用它。


60.顺序结构
    顺序结构是指按照程序中语句的排列顺序依次执行,知道程序的最后一个语句。(最简单的一种程序)
    数据的输入:从键盘输入数据,则可以使用input函数来进行,调用格式为:A=input(提示信息,选项);其中提示信息为一个字符串,用于提示用户输入数据。例如:从键盘输入A矩阵,可以采用下面的命令来完成:A=input('输入A矩阵');
    数据的输出:命令窗口输出函数主要由disp函数,其调用格式为:disp(输出项)其中输出项既可以为字符串,也可以为矩阵。例如:A='Hello,Tom';disp(A)输出为:Hello,Tom。又如:A=[1,2,3;4,5,6;7,8,9];disp(A)
    程序的暂停:程序执行过程中暂停,可用pause函数,其调用格式为:pause(延迟描述);如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。若要强行终止程序的运行可按Ctrl+C键。

61.选择结构
    选择结构是根据给定的条件成立或不成立,分别执行不同的语句。MATLAB用于实现选择结构的语句有if语句,switch语句和try语句。
    if语句:在MATLAB中,if语句有3种格式。
    (1)单分支if语句
    语句格式:
    if条件
        语句组
    end    
    (2)双分支if语句
    语句格式:
    if 条件
        语句组1
    else
        语句组2
    end
    (3)多分支if语句
    语句格式:
    if 条件1
        语句组1
    elseif 条件2
        语句组2
    ...
    elseif 条件m
        语句组m
    else
        语句组n
    end

    switch语句:switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式:
    switch 表达式
    case 表达式1
        语句组1
    case 表达式2
        语句组2
    ...
    case 表达式m
        语句组m
    otherwise
        语句组n
    switch自居后面的表达式应为一个标量或一个字符串;case子句后面的表达式不仅可以为一个标量或一个字符串,还可以为一个元胞矩阵。

    try语句:try语句是一种试探性执行语句,其语句格式为:
    try
        语句组1
    catch
        语句组2
    end
    try语句先试探性执行语句组1,如果在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。
    例如,矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错则自动转去求两矩阵的点乘。
    clc;
    clear all;
    A=[1,2,3;4,5,6];
    B=[7,8,9;10,11,12];
    try
            C=A*B;
    catch
            C=A.*B;
    end
    C
    lasterr%显示出错原因

62.循环结构
    循环是指按照给定的条件,重复执行指定的语句,MATLAB提供了两种实现循环结构的语句:for语句和while语句。
    
    for语句的格式为:
    for循环变量=表达式1:表达式2:表达式3
        循环体语句
    end
    其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。    

    例如,已知y=1/1^2+1/2^2+...+1/n^2,当n=100时,求y的值。
    clear all;
    clc;
    y=0;
    n=100;
    for i=1:100
            y=y+1/(i*i);
    end
    y

    while语句的一般格式为:
    while条件
        循环体语句
    end
    其执行过程为:
    若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。
    例如,从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和。

    clear all;
    clc;
    sum=0;
    n=0;
    x=input('请输入一个数(end in 0):');
    while(x~=0)
            sum=sum+x;
            n=n+1;
            x=input('请输入一个数(end in 0):');
    end
    if(n>0)
            sum
            mean=sum/n
    end
    
    break语句和continue语句:一般与if语句配合使用。break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
    例如,求[100,200]之间第一个能被21整除的整数。
    clear all;
    clc;
    for n=100:200
            if rem(n,21)~=0;%判断n是否能被21整除
                continue
            end
            break
    end
    n

63.函数文件
    函数文件是另一种形式的M文件,每一个函数文件都定义一个函数。MATLAB提供的标准函数大部分是由函数文件定义的。
    函数文件的基本结构:函数文件由function语句引导,其基本结构为:
    function 输出形参表=函数名(输入形参表)
      注释说明部分
      函数体语句
    其中,以function开头的一行为引导行,表示该M文件是一个函数文件。当输出形参多余一个时,应该用方括号括起来。

64.说明
    (1)关于函数文件名
    函数文件名通常有函数名再加上扩展名.m组成。
    当函数文件名与函数名不同时,MATLAB将忽略函数名而确认文件名,因此调用时使用函数文件名。
    (2)关于注释说明部分
    注释说明包括3部分:
    ①紧随引导行之后以%开头的第一注释行。
    这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor关键词查询和help在线帮助时使用。
    ②第一注释行及之后连续的注释行。
    通常包括函数输入/输出参数的含义及调用格式说明等信息。    
    ③与在线帮助文本相隔一空行的注释行。
    包括函数文件编写和修改的信息,如作者和版本等。
    (3)关于return语句
    如果在函数文件中插入了return语句,则执行到该语句就结束函数的执行,流程转至调用该函数的位置。通常也不使用return语句。
    例如,编写函数文件,求半径为r的圆的面积和周长。
    function [s,p] = circle(r)
    %CIRCLE calculate the area and perimeter of a circle of radius
    % r     圆半径
    % s     圆面积
    % p    圆周长

    %2020年12月10日编
    s=pi*r*r;
    p=2*pi*r;
    end

65.函数调用
函数调用的一般格式是:[输出实参表]=函数名(输入实参表)
注意:函数调用时,各实参出现的顺序、个数,应与函数定义时相同。
    例如,利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
    函数文件:tran.m
    function [rho,theta] = tran(x,y)
    rho=sqrt(x*x+y*y);
    theta=atan(y/x);
    end
    调用函数文件的命令文件:
    clear all;
    clc;
    x=input('please input x=');
    y=input('please input y=');
    [rho,the]=tran(x,y);
    rho
    the

66.函数的嵌套调用
在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数。一个函数调用自身称为函数的递归调用。
    例如,利用函数的递归调用,求n!。
    函数文件factor.m:
    function f = factor(n)
    %FACTOR 此处显示有关此函数的摘要
    %   此处显示详细说明
    if n<=1
            f=1;
    else
        f=factor(n-1)*n;%递归调用求(n-1)!
    end
    在命令文件中调用该函数文件,求s=1!+2!+3!+4!+5!。main2.m
    clear all;
    clc;
    s=0;
    for i=1:5
            s=s+factor(i);
    end
    s

67.函数参数的可调性
MATLAB在函数调用上有一个与一般高级语言不同之处:函数所传递参数数目的可调性,即参数的数量可以改变。在调用函数时,MATLAB用两个预定义变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。
    例如,nargin用法示例
    函数文件(examp.m):
    function fout = charray(a,b,c)
    if nargin==1
            fout=a;
    end
    if nargin==2
            fout=a+b;
    end
    if nargin==3
            fout=(a*b*c)/2;
    end
    end

    命令文件(main_examp.m):
    clear all;
    clc;
    x=[1:3];
    y=[1;2;3];
    examp(x)
    examp(x,y')
    examp(x,y,3)
    
68.全局变量与局部变量
MATLAB中,函数文件中的变量是局部变量。
如在若干函数中,都把某一变量定义为全局变量,那么这些函数将共用这个变量。
全局变量的作用域是整个MATLAB的工作空间,所有函数都可以对它进行存取和修改。
全局变量用global命令定义,格式为:
global 变量名
    例如,全局变量应用示例。先建立函数文件wadd.m,该函数将输入的参数加权相加:
    函数文件(wadd.m)
    function f = wadd(x,y)
    global ALPHA BETA
    f=ALPHA*x+BETA*y;
    end
    命令窗口输入:
    >> global ALPHA BETA
    >> ALPHA=1;
    >> BETA=2;
    >> s=wadd(1,2)

69.程序调试
程序调试时程序设计的重要环节,也是程序设计人员必须掌握的重要技能。
MATLAB提供了相应的程序调试功能,即可以通过文本编辑器对程序进行调试,又可以在命令窗口结合具体的命令进行。
(1)程序调试概述
一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。
语法错误,给出相应的错误信息,并标出错误在程序中的行号。
MATLAB对程序逻辑错误时无能为力的,不会给出任何提示信息。可以通过调试手段来发现。
采用的方法如下:
①控制单步运行
step:单步运行,不进入函数;
step in:单步运行,进入函数;
step out:停止单步运行;
save and run:存储文件并开始运行。
②断点操作
stop if error/warnings:在程序执行出现错误或警告是,停止程序运行,进入调试状态。

70.Matlab矩阵分析预处理
(1)常见的特殊矩阵有零矩阵、幺矩阵、单位矩阵等,这类特殊矩阵在应用中具有通用性。
①通用的特殊矩阵
常用的产生通用特殊矩阵的函数有:
zeros:产生全0矩阵(零矩阵)。
ones:产生全1矩阵(幺矩阵)。
eye:产生单位矩阵。
rand:产生0~1间均匀分布的随机矩阵。
randn:产生均值为0,方差为1的标准正态分布随机矩阵。
(2)建立随机矩阵
①在区间[20,50]内均匀分布的5阶随机矩阵。
②均值为0.6,方差为0.1的5阶正态分布随机矩阵。
命令如下:
x=20+(50-20)*rand(5)

71.矩阵结构变换
(1)对角阵与三角阵
    只有对角线上的非零元素的矩阵称为对角矩阵,在研究矩阵时,有时候需要将矩阵的对角线上的元素提取出来形成一个列向量,有时也需要用一个向量构造一个对角阵。
①提取矩阵的对角线元素函数:diag
例如:
A=[1,2,3;4,5,6];
D=diag(A)
D=
    1
    5
diag函数还有一种形式:diag(A,k)提取第k条对角线的元素。
例如:
D1=diag(A,1)
D1=
    2
    6
(2)构造对角矩阵
如果V是一个m个元素的向量,diag(V)将产生一个m*m对角矩阵,其主对角线元素即为向量V的元素。
例如:
>> diag([1,2,-1,4])

ans =

     1     0     0     0
     0     2     0     0
     0     0    -1     0
     0     0     0     4

>> diag(1:3,-1)

ans =

     0     0     0     0
     1     0     0     0
     0     2     0     0
     0     0     3     0
例如:
建立一个5*5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,...第五行乘以5。
解:
   用一个对角矩阵左乘一个矩阵时,相当于用对角阵的第一个元素乘以该矩阵的第一行,依次类推。
命令如下:
>> A=ones(5);
>> D=diag(1:5);
>> D*A

ans =

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3
     4     4     4     4     4
     5     5     5     5     5

72.矩阵求逆与线性方程组求解
(1)矩阵的逆
对于一个方阵A,如果存在一个与其同阶的方阵B,使得:A*B=B*A=I(I为单位矩阵)则称B为A的逆矩阵,当然,A也是B的逆矩阵。求方阵A的逆矩阵可调用函数inv(A)。
例如:求方阵A的逆矩阵,且验证。
>> A=[1,-1,1;5,-4,3;2,1,1];
>> B=inv(A);
>> A*B

ans =

    1.0000    0.0000    0.0000
   -0.0000    1.0000    0.0000
   -0.0000    0.0000    1.0000

(2)用矩阵求逆方法求解线性方程组
例如,用求逆矩阵A的方法解线性方程组
x+2y+3z=5
x+4y+9z=-2
x+8y+27z=6

>> A=[1,2,3;1,4,9;1,8,27];
>> b=[5,-2,6]';
>> x=inv(A)*b   %x=A\b

x =

   23.0000
  -14.5000
    3.6667
也可用左除运算符求解。

73.矩阵行列式值
把一个方程看做一个行列式,并按行列式的规则求值,称为行列式的值。在MATLAB中,使用函数det(A)得到。
例如:
>> A=rand(5)

A =

    0.2760    0.4984    0.7513    0.9593    0.8407
    0.6797    0.9597    0.2551    0.5472    0.2543
    0.6551    0.3404    0.5060    0.1386    0.8143
    0.1626    0.5853    0.6991    0.1493    0.2435
    0.1190    0.2238    0.8909    0.2575    0.9293

>> B=det(A)

B =

    0.0538

74.多项式的MATLAB表达
(1)多项式有一个行向量表示,该向量元素是该多项式的系数,且按降幂次序排列。
例如,多项式x^4-12x^3+25x+116由行向量:p=[1 -12 0 25 116]表示。
注意,必须包括具有零函数的项。求解多项式的根:roots指令。

例如,求解多项式x^4-12x^3+25x+116的根
>> p=[1 -12 0 25 116]

p =

     1   -12     0    25   116

>> r=roots(p)

r =

  11.7473 + 0.0000i
   2.7028 + 0.0000i
  -1.2251 + 1.4672i
  -1.2251 - 1.4672i
MATLAB按惯例规定,多项式是行向量,根是列向量。

(2)已知多项式的根,求解多项式,用poly指令。
>> r=roots(p)

r =

  11.7473 + 0.0000i
   2.7028 + 0.0000i
  -1.2251 + 1.4672i
  -1.2251 - 1.4672i

>> pp=poly(r)

pp =

    1.0000  -12.0000   -0.0000   25.0000  116.0000

(3)多项式的乘法(conv指令)
例如,多项式a(x)=x^3+2x^2+3x+4和b(x)=x^3+4x^2+9x+16的乘积。

>> a=[1 2 3 4];b=[1 4 9 16];
>> c=conv(a,b)

c =

     1     6    20    50    75    84    64

两个以上的多项式的乘法需要重复使用conv。

(4)多项式加法
MATLAB没有提供进行假发运算的函数,如果两个多项式向量大小相同,标准的数组加法有效。把多项式a(x)与上面给出的b(x)相加。
>> a=[1 2 3 4];b=[1 4 9 16];
>> d=a+b

d =

     2     6    12    20
当两个多项式阶次不同,低阶的多项式必须用首零填补,使其与高阶多项式有同样的阶次。
考虑上面多项式c和d相加:
>> c=conv(a,b)

c =

     1     6    20    50    75    84    64

>> e=c+[0 0 0 d]

e =

     1     6    20    52    81    96    84

例如,编写一个多项式加法运算的函数文件

明确需求:定义一个函数,需要有两个输入参数(比如:p1、p2),一个输出参数p_out。
p1、p2表示两个待计算的多项式;
p_out表示两个多项式的求和结果。

函数的内部处理
如p1、p2两个参数大小相等,则直接相加:p_out=p1+p2
如p1、p2两个参数大小不等:
    if length(p1)>length (p2)
        p2前面要补0元素,使p1、p2两参数大小相等
    否则
        p1前面要补0元素,使p1、p2两参数大小相等

function p_out = poly_sum(p1,p2)
%计算两个多项式的和
if length(p1)==length(p2)
    p_out=p1+p2;
elseif length(p1)>length(p2)
    p2=[zeros(1,length(p1)-length(p2)),p2];
    p_out=p1+p2;
else
    p1=[zeros(1,length(p2)-length(p1)),p1];
    p_out=p1+p2;
end

>> poly(c,d)

ans =

     1     6    20    52    81    96    84


(5)多项式的除法(deconv)

举例说明:
c(x)=x^6+6x^5+20x^4+50x^3+75x^2+84x+64除以b(x)=x^3+4x^2+9x+16

>> c=[1 6 20 50 75 84 64];
>> b=[1 4 9 16];
>> [q,r]=deconv(c,b)

q =

     1     2     3     4


r =

     0     0     0     0     0     0     0


(6)多项式的导数(polyder)

举例:求b(x)=x^3+4x^2+9x=16的导数。

>> b=[1 4 9 16];
>> d=polyder(b)

d =

     3     8     9

另外两种形式为:
p=polyder(P,Q):求P*Q的导函数
[p,q]=polyder(P,Q):求P/Q的导函数,导数分子存入p,导数分母存入q。

(7)多项式的估值(polyval)

举例:绘制p(x)=x^3+4x^2-7x-10在[-1,3]段上的曲线。
>> x=linspace(-1,3);
>> p=[1 4 -7 -10];
>> v=polyval(p,x);
>> plot(x,v);
>> title('x^{3}+4x^{2}-7x-10');
>> xlabel('x')

75.函数的数值导数
MATLAB中没有直接提供数值导数的函数,只有计算向前差分的函数diff,其调用格式为:
DX=diff(X)计算向量X的向前差分
DX=diff(X,n)计算向量X的n阶向前差分

例如,设x由[0,2n]间均匀分布的10个点组成,求sinx的1-3阶差分。命令如下:
>> X=linspace(0,2*pi,10);
>> Y=sin(X);
>> DY=diff(Y)

DY =

  Columns 1 through 5

    0.6428    0.3420   -0.1188   -0.5240   -0.6840

  Columns 6 through 9

   -0.5240   -0.1188    0.3420    0.6428

>> D2Y=diff(Y,2)

D2Y =

  Columns 1 through 5

   -0.3008   -0.4608   -0.4052   -0.1600    0.1600

  Columns 6 through 8

    0.4052    0.4608    0.3008

>> D3Y=diff(Y,3)

D3Y =

  Columns 1 through 5

   -0.1600    0.0556    0.2452    0.3201    0.2452

  Columns 6 through 7

    0.0556   -0.1600

例如,设f(x)=根号(x^3+2x^2-x+12)+根号^6(x+5)+5x+2,在[-3,3]区间内以0.01为步长求数值导数。并画出导函数图像。程序如下:
>> f=inline('sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2');
>> x=-3:0.01:3;
>> dx=diff(f([x,3.01]))/0.01;
>> plot(x,dx)

76.数值积分
一元函数的数值积分
常用积分指令:quad和quadl。一般说来,quadl比quad更有效。
具体调用格式如下:
q=quadl(fun,a,b)
q=quadl(fun,a,b,tol)
q=quadl(fun,a,b,tol,trace)
[q,fcnt]=quadl(fun,a,b,...)
输入量fun为被积函数的句柄。
输入量a,b分别是积分的下限和上限,都必须是确定的 数值;
前3个输入参数是调用积分指令所必须的,其他可以缺省;
输入量tol是一个标量,控制绝对误差;
输入量trace为非0值时,将随积分的进程逐点画出被积分函数;
输出参数fcnt返回函数的执行次数。
Note:quad的调用格式与quadl相同。

举例:求定积分I=∫(0->1)e^(-x^2)dx
MATLAB指令quad和quadl求积分

>> fun=inline('exp(-x.*x)','x');%数组乘符号.*的采用是必须的
>> Isim=quad(fun,0,1),I8=quadl(fun,0,1)

Isim =

    0.7468


I8 =

    0.7468

举例:求解定积分I=∫(0->1)根号ln(1/x)dx
用quad指令求积分
>> ff=inline('sqrt(log(1./x))','x');
>> Isim=quad(ff,0,1)

Isim =

    0.8862

77.元素排序
MATLAB中对向量X排序的函数是sort(X),函数返回一个对X中的元素按升序排列的新向量。sort函数也可以对矩阵A的各列(或行)重新排序,其调用格式为:
[Y,I]=sort(A,dim)
dim=1,按列排序;dim=2,按行排序,Y是排序后的矩阵,I记录Y中的元素在A中的位置。

例如,对下列矩阵做各种排序。
A=[1,-8,5;4,12,6;13,7,-13]
>> A=[1,-8,5;4,12,6;13,7,-13];
>> sort(A)

ans =

     1    -8   -13
     4     7     5
    13    12     6

>> sort(-A,2)%对A的每行按降序排列

ans =

    -5    -1     8
   -12    -6    -4
   -13    -7    13

78.数据插值
在工程测量和科学实验中,所得到的的数据通常是离散的,要得到这些离散点以外的其他店的数值,就需要根据已知的数据进行插值。插值函数一般由线性函数、多项式、样条函数或这些函数的分段函数充当。
一维数据插值:被插值函数有一个单变量。
才用的方法有:线性方法、最近方法、三次样条和三次插值。在MATLAB中实现这些插值的函数是interp1,其调用格式如下:
Y1=interp1(X,Y,X1,method)
(1)'linear':线性插值。默认的插值方式。它是把插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。
(2)'nearest':最近点插值。根据已知插值点与已知数据点的远近程度进行插值。插值点优先选择较近的数据点进行插值。
(3)'pchip':3次多项式插值。根据已知数据求出一个3次多项式,然后根据该多项式进行插值。
(4)'spline':3次样条插值。指在每个分段内构造一个3次多项式,使其满足插值条件外,在个节点处具有光滑的条件。

例:给出概率积分数据表如下,用不同的插值方法计算f(0.472)。
x      0.46        0.47       0.48       0.49
f(x)   0.4846555   0.4937542  0.5027498  0.5116683


>> x=0.46:0.01:0.49;
>> f=[0.4846555,0.4937542,0.5027498,0.5116683];
>> format long
>> interp1(x,f,0.472)

ans =

   0.495553320000000

>> interp1(x,f,0.472,'nearest')

ans =

   0.493754200000000

>> interp1(x,f,0.472,'spline')

ans =

   0.495560736000000
>> interp1(x,f,0.472,'pchip')

ans =

   0.495561119712056

79.曲线拟合
数值插值要求逼近函数在采样点与被逼近函数相等,但由于测量误差,所获得的数据不一定准确,如果强求逼近显然不够合理。曲线拟合不要求逼近函数通过各采样点,但要尽量的接近这些点,是误差在某种意义上达到最小。

曲线拟合的实现:
在MATLAB中,用ployfit函数来求得最小二乘拟合多项式的系数,再用polyval函数按所得的多项式计算所给出点上的函数近似值。
polyfit函数的调用格式为:
[P,S]=polyfit(X,Y,m)

例:用一个三次多项式在区间[0,2n]内逼近函数sinx。
在给定的区间内,均匀的选择20个采样点,并计算采样点的函数值,然后利用3次多项式逼近。

命令如下:
>> x=linspace(0,2*pi,20);
>> y=sin(x);
>> p=polyfit(x,y,3)

p =

  Columns 1 through 2

   0.088357278851222  -0.832747734390553

  Columns 3 through 4

   1.780900319878795  -0.115602892148138

>> y1=polyval(p,x)

y1 =

  Columns 1 through 2

  -0.115602892148138   0.385457422110637

  Columns 3 through 4

   0.723553873446247   0.917858681026122

  Columns 5 through 6

   0.987544064017693   0.951782241588392

  Columns 7 through 8

   0.829745432905651   0.640605857136901

  Columns 9 through 10

   0.403535733449572   0.137707281011097

  Columns 11 through 12

  -0.137707281011096  -0.403535733449570

  Columns 13 through 14

  -0.640605857136898  -0.829745432905648

  Columns 15 through 16

  -0.951782241588388  -0.987544064017687

  Columns 17 through 18

  -0.917858681026114  -0.723553873446236

  Columns 19 through 20

  -0.385457422110625   0.115602892148153

>> plot(x,y,':o',x,y1,'-*')
>> legend('sin(x)','fit')
 


 

你可能感兴趣的:(matlab,数学建模)