MATLAB基本使用

向量

基础运算

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
x=0:0.1:50; %冒号法:0-50相信间隔值组成的向量x,间隔值为0.1
x=[2 4 6 8]%行向量
x=[1;2;3]%列向量
x=linspace(0,10,6)%linspace(first_value,last_value,number)平均取值
x=logspace(1,3,3)%logspace(first_value,last_value,number)从10^first_value-10^last_value,包含number个
%向量元素引用
x(n)%x中第x个元素
x(n1:n2)%x中n1-n2的元素
.* %点积运算
cross()%叉积运算cross(a,b)a,b必为长为3的向量
poly2sym(p)%多项式构造
conv(p1,p2)%卷积运算,乘法运算
[k,r]=deconv(p1,p2)%除法运算,k-商,r-余数
poly(root)%求以root为解的多项式系数
polyder(p)%求p的导数的系数

特殊变量

单元型变量

赋值语句定义

matlab
1
2
3
4
5
A=[1 2;3 4];	
B=3+2*i;
C='efg';
D=2;
E={A,B;C,D}

对单元语句逐个赋值——cell()

matlab
1
2
3
4
5
6
7
E=cell(1,3);	
E{1,1}=[1:4];
E{1,2}=3+2*i;
E{1,3}=2;
E
E{1}
E(1)

cell(size(A)):生成与A相同形式的单元型置空矩阵

引用

  • 大括号显示单元具体的值
  • 小括号显示单元压缩值

常用函数

1.celldisp()显示内容

2.cedllplot()用图形显示

结构型变量

matlab
1
2
3
4
mn=struct('color',{'red', 'black'},'number',{1,2})
mn(1)
mn(2)
mn(2).color

矩阵运算

矩阵生成

利用M文件创建

matlab
1
2
3
4
5
6
7
% sample.m
% 创建一个M文件,用以输入大规模矩阵
gmatrix=[378 89 90 83 382 92 29;
3829 32 9283 2938 378 839 29;
388 389 200 923 920 92 7478;
3829 892 66 89 90 56 8980;
7827 67 890 6557 45 123 35]

利用文本文件创建

matlab
1
2
load goods.txt
goods

创建特殊矩阵

matlab
1
2
3
4
5
6
7
8
9
zeros(3)
zeros(3,2)
ones(3,2)
ones(3)
rand(3)%3*3随机数矩阵,值在(0,1)之间
rand(3,2)
magic(3)%3阶魔方矩阵
hilb(3)%3阶Hilbert矩阵
invhilb(3)%3阶Hilbert矩阵的逆

矩阵元素的运算

元素的修改

  • D=[A,B C],A- 原矩阵,B C-包含要扩充的元素,D-扩充后的矩阵
  • A=(m,),A的m行

矩阵的变维

reshape(X,m,n)——将已知矩阵变成m行n列的矩阵

:法

matlab
1
2
3
4
A=1:12
B=reshape(A,2,6)
C=zeros(3,4);
C(:)=A(:)

矩阵的变向

  • rot90(A):A逆时针旋转90°
  • rot90(A,k):A逆时针旋转90°*k
  • fliplr(X):X左右翻转
  • flipud(X):X上下翻转
  • flipdim(X,dim):dim=1——行翻转;dim=2——列翻转

矩阵的提取

矩阵数学运算

加减法

乘法

  • 叉乘:一行乘一列
  • 点乘:相同位置的进行乘法运算

除法

  • 左除 B.\A:B的相应位置除A的相应位置
  • 右除 B/A:A的相应位置除B的相应位置

基本运算

  • 幂函数 A.^2
  • 逆 inv(X)
  • 逆条件数 rcond(A)
  • 逆的更新 updateinv(A)
  • 2-范数 norm(A)
  • 2-范数估计值 normest(A)
  • 行列式 det(A)

矩阵分解

楚列斯基分解(正定矩阵)

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A=[1 1 1 1;1 2 3 4;1 3 6 10;1 4 10 20];	%创建正定矩阵A
R=chol(A)%求正定矩阵A的楚列斯基分解因子

R =

1 1 1 1
0 1 2 3
0 0 1 3
0 0 0 1
ans =

1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20

LU分解(三角分解)

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
A=[1 2 3 4;5 6 7 8;2 3 4 1;7 8 5 6];
[L,U]=lu(A)%返回下三角矩阵L,上三角矩阵U

L =

0.1429 1.0000 0 0
0.7143 0.3333 1.0000 0
0.2857 0.8333 0.2500 1.0000
1.0000 0 0 0


U =

7.0000 8.0000 5.0000 6.0000
0 0.8571 2.2857 3.1429
0 0 2.6667 2.6667
0 0 0 -4.0000


L =

1.0000 0 0 0
0.1429 1.0000 0 0
0.7143 0.3333 1.0000 0
0.2857 0.8333 0.2500 1.0000

[L,U,P]=lu(A)%返回下三角矩阵L,上三角矩阵U,置换矩阵P,PA=LU
U =

7.0000 8.0000 5.0000 6.0000
0 0.8571 2.2857 3.1429
0 0 2.6667 2.6667
0 0 0 -4.0000


P =

0 0 0 1
1 0 0 0
0 1 0 0
0 0 1 0

LDMT{LDM}^TLDLT{LDL}^T分解

  • LDMT{LDM}^T分解
matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function [L,D,M]=ldm(A)
%此函数用来求解矩阵A的LDM'分解
%其中L,M均为单位下三角矩阵,D为对角矩阵
[m,n]=size(A);
if m~=n
error('输入矩阵不是方阵,请正确输入矩阵!');
return;
end
D(1,1)=A(1,1);
for i=1:n
L(i,i)=1;
M(i,i)=1;
end
L(2:n,1)=A(2:n,1)/D(1,1);
M(2:n,1)=A(1,2:n)'/D(1,1);

for j=2:n
v(1)=A(1,j);
for i=2:j
v(i)=A(i,j)-L(i,1:i-1)*v(1:i-1)';
end
for i=1:j-1
M(j,i)=v(i)/D(i,i);
end
D(j,j)=v(j);
L(j+1:n,j)=(A(j+1:n,j)-L(j+1:n,1:j-1)*v(1:j-1)')/v(j);
end
matlab
1
2
3
A=[1 2 3 4;4 6 10 2;1 1 0 1;0 0 2 3];
[L,D,M]=ldm(A)
L*D*M'
  • LDLT{LDL}^T分解
matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function [L,D]=ldlt(A)
%此函数用来求解实对称矩阵A的LDL'分解
%其中L为单位下三角矩阵,D为对角矩阵

[m,n]=size(A);
if m~=n | ~isequal(A,A')
error('请正确输入矩阵!');
return;
end
D(1,1)=A(1,1);
for i=1:n
L(i,i)=1;
end
L(2:n,1)=A(2:n,1)/D(1,1);
for j=2:n
v(1)=A(1,j);
for i=1:j-1
v(i)=L(j,i)*D(i,i);
end
v(j)=A(j,j)-L(j,1:j-1)*v(1:j-1)';
D(j,j)=v(j);
L(j+1:n,j)=(A(j+1:n,j)-L(j+1:n,1:j-1)*v(1:j-1)')/v(j);
end
matlab
1
2
3
A=[1 2 3 4;2 5 7 8;3 7 6 9;4 8 9 1];
[L,D]=ldlt(A)
L*D*L'

QR分解(正交三角形分解)

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
A=rand(4)
[Q,R] =qr(A)
A =
0.4218 0.6557 0.6787 0.6555
0.9157 0.0357 0.7577 0.1712
0.7922 0.8491 0.7431 0.7060
0.9595 0.9340 0.3922 0.0318


Q =
-0.2634 0.4305 0.6535 0.5641
-0.5718 -0.7879 0.2092 0.0919
-0.4947 0.3338 0.2413 -0.7653
-0.5991 0.2871 -0.6862 0.2962


R =
-1.6015 -1.1728 -1.2146 -0.6389
0 0.8058 0.0559 0.3921
0 0 0.5123 0.6127
0 0 0 -0.1454

qrdelete & qrinsert

SVD分解

[U,S,V]=svd(A)

m*m矩阵U,对角矩阵S,n*n矩阵V

舒尔分解

海森伯格分解

二维绘图

plot

  • plot(x,y)
  • subplot(m,n,p) m*n个视图区域,当前为第p个(按行排列)
  • tiledlayout(m,n)+nexttile
  • tiledlayout(2,2) 布局为2*2的区域
matlab
1
2
3
4
5
6
7
8
9
10
11
x=0:pi/10:2*pi;
y1=sin(x);
y2=cos(x);
y3=x;
y4=x.^2;%输入以x为自变量的4个函数表达式
hold on%在此画布上进行绘制
plot(x,y1,'r*')
plot(x,y2,'kp')
plot(x,y3,'bd')
plot(x,y4,'m--')
hold off
  • fplot 一元函数图像
matlab
1
2
3
4
5
x=linspace(0.01,0.02,50);
y=sin(1./x);
subplot(2,1,1),plot(x,y)
subplot(2,1,2),fplot(@(x)sin(1./x),[0.01,0.02])
%(x)sin(1./x)是定义的匿名函数。

不同坐标系下的绘图命令

极坐标系——polarplot

  • polarplot(thera,rho) thera——弧度,rho——半径
  • polarplot(thera,rho,LineSpace) LineSpace——样式
  • pol2cart(t,r) 极坐标下的数据点换到直角坐标系下

半对数坐标系——semilogx/semilogy

双对数坐标系——loglog

双y轴坐标——yyaxis

  • yyaxis left
  • yyaxis right

图形窗口

  • finger——创建图形窗口
  • set(n)——返回图像属性名称和所有属性值
  • get(n)——返回图像属性名称和当前属性值

图形标注

属性设置

坐标系与坐标轴

axis(xmin,xmax,ymin,ymax,zmin,zmax)——设置坐标系

matlab
1
2
3
4
5
6
7
8
9
10
t=0:2*pi/99:2*pi;	
x=1.15*cos(t);y=3.25*sin(t);
subplot(2,3,1),plot(x,y),axis normal,grid on,
title('Normal and Grid on')%grid on显示分割线
subplot(2,3,2),plot(x,y),axis equal,grid on,title('Equal')
subplot(2,3,3),plot(x,y),axis square,grid on,title('Square')
subplot(2,3,4),plot(x,y),axis image,box off,title('Image and Box off')
subplot(2,3,5),plot(x,y),axis image fill,box off
title('Image and Fill')
subplot(2,3,6),plot(x,y),axis tight,box off,title('Tight')

fill(X,Y,C) X,Y——创建的图形,C——颜色

title——标题

x/ylabel——轴注释

text(x,y,string)——在图中(x,y)位置显示string

gtext——鼠标在任意位置进行标注

legend——添加图例

特殊图形

统计图形

  • 条形图
    • 二维:bar——竖直条形图;barh——水平条形图
    • 三维:bar3——竖直条形图;bar3h——水平条形图
  • 面积图:area(Y)
  • 饼图:pie/pie3
  • 柱状图
    • 直角坐标系:histogram
    • 极坐标系:ploarhistogram

离散数据图形

  • 误差棒图:errorbar(y,err)
  • 火柴杆图:stem(Y)
  • 阶梯图:stairs(Y)

向量图形

  • 罗盘图:compass(U,V)

  • 羽毛图:feather(U,V)

  • 箭头图:quiver(U,V)/quiver3

    返回数值梯度:gradient(Z,2,2)

三维绘图

绘图命令

  • plot3/fplot3

  • 三维网格命令

    • mesh(X,Y,Z) 网线面
    • mesh(X,Y) x-y为底,y对应的值为z轴
    • meshc 加基本等高线
    • meshz 网格线与零平面连起来
    • fmesh(f)
  • 三维曲面命令

    • surf
      • surfc 加基本等高线
      • surfl 有亮度的曲面
    • fsurf
  • 柱面与球面

    • [X,Y,Z]=cylinder 返回对应函数的x,y,z坐标值

      cylinder(2,6) 正六边形,半径为2的棱柱

    • sphere 生成球面

      [X,Y,Z]=cylinder(n) 绘制n*n个面的球面,返回球面坐标

  • 三维图形等值线

    • contour3(x,y,z)

    • contourf 填充颜色的二维等值图

      colormap gray 应用灰度颜色图

    • C=contourc(Z) 计算等值线矩阵C

    • clabel 在二维等值图中添加高度标签

    • fcontour 符号函数等值线图

三维图形修饰处理

视角处理

view(az,el) az——方位角,el——仰角

颜色处理

  • brighten(beat) 明暗处理0<beat<1

  • caxi([cmin,cmax]) 色轴刻度

    colorbar 显示垂直色轴

  • shading 颜色渲染设置

  • colormap(M) 将M作为当前窗口颜色映像

光照处理

  • surfl 带光照模式
  • light/lightangle 确定光源位置

图像处理

  • imread 图像读入
  • imwrite 图像写入
  • image/imageesc/imshow 图像显示
  • imfinfo 图像信息查询

程序设计

M文件

  • 命令文件

  • 函数文件

    function开始

程序设计

  • 程序结构
    • 顺序结构
    • 循环结构
    • 分支结构
  • 流程控制
    • break
    • pause(10) 暂停10秒
    • continue
    • return
    • echo on 显示执行过程中每一行语句的执行过程
    • waring(massage) 不影响正常运行
    • error(massage) 终止运行
  • 交互式输入
    • input(massage)
    • keyboard 暂停程序,使用键盘调用命令
    • menu
  • 程序调试
    • 系统提示
    • 断点

函数句柄

1.创建

matlab
1
2
3
4
5
fun_handle=@save %创建函数save()的句柄

fun_handle =
包含以下值的 function_handle:
@save

2.调用——feval()

矩阵分析

特征值与特征向量

  • [V,D]=eig(A,balanceOption) 求矩阵A的特征值和特征向量

    balanceOption:默认平衡处理

  • [T,B]=balance(A) 求相似变换矩阵T,平衡矩阵B

    [S,P,B]=balance(A) 缩放向量S,置换向量P

  • c=ploy(A) 求特征多项式

  • r=roots© 求特征多项式的根

  • eigs 部分特征值

  • eig(A,B) 求广义特征值

矩阵对角化

判断矩阵能否对角化

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function y=isdiag1(A)
%该函数用来判断矩阵A是否可以对角化
%若返回值为1,则说明A可以对角化;若返回值为0,则说明A不可以对角化

[m,n]=size(A); %求矩阵A的阶数
if m~=n%若A不是方阵,则肯定不能对角化
y=0;
return;
else
[V,D]=eig(A);
if rank(V)==n %判断A的特征向量是否线性无关
y=1;
return;
else
y=0;
end
end

矩阵对角化

matlab
1
2
3
4
5
6
7
function[P,D]=reduce_diag(A)
if ~isdiag(A)
error('该矩阵不能对角化');
else
disp('将下面的矩阵P乘以任意非零整数所得矩阵仍满足inv(P)*P*A=D');
[P,D]=eig(A);
end

若尔当标准型

[P,J]=jordam(A) 若尔当标准形矩阵J,相似变换矩阵P

矩阵的反射与旋转变换

豪斯霍尔德反射波变换

避免上溢求豪斯霍尔德向量函数

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function [v,beta]=house(x)
%此函数用来计算满足v(1)=1的v和beta使得P=I-beta*v*v'
%是正交矩阵且P*x=norm(x)*e1

n=length(x);
if n==1
error('请正确输入向量!');
else
sigma=x(2:n)'*x(2:n);
v=[1;x(2:n)];
if sigma==0
beta=0;
else
mu=sqrt(x(1)^2+sigma);
if x(1)<=0
v(1)=x(1)-mu;
else
v(1)=-sigma/(x(1)+mu);
end
beta=2*v(1)^2/(sigma+v(1)^2);
v=v/v(1);
end
end

豪斯霍尔德矩阵求法

matlab
1
2
3
4
5
x=[2 3 4]';
[v,beta]=house(x)
P=eye(3)-beta*v*v'
a=norm(x)
P*x

吉文斯旋转变换

[G,y]=planerot(x) y=Gx且y(2)=0,x——二维列向量

符号运算

符号与数值

  • eval(expression) 符号->数值
  • subs(s) 数值->符号
  • digits(D) 有效数字个数为D
  • vpa(x) 算数精度
  • B=sparse(A) 将A转换为稀疏格式
  • B=sparse(A) 创建A的伴随矩阵

符号矩阵

创建

  • 直接输入

  • sym(‘x’) sym(‘a’,n)

    matlab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    x = sym('x'); 
    y = sym('y');
    a=[x+y,x;y,y+5]

    a = sym('a', [1 4])%用自动生成的元素创建符号向量
    a = sym('x_%d', [1 4])

    a(1)
    a(2:3)

    a =
    [a1, a2, a3, a4]
    a =
    [x_1, x_2, x_3, x_4]
    ans =
    x_1
    ans =
    [x_2, x_3]
  • 数值矩阵->符号矩阵

    B=sym(A)

计算不同精度的pi值

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pi%默认精度
vpa(pi)%使用可变精度,32位数字

digits(10)%将vpa精度设成10
vpa(pi)%10位有效数字

r = sym(pi)
f = sym(pi,'f')%返回精确的有理数
d = sym(pi,'d')%使用十进制模式将浮点数转换为符号数字
e = sym(pi,'e') %使用误差估值模式将浮点数转换为符号数字

ans =3.1416
ans =3.141592654
ans =3.141592654
r =pi
f =884279719003555/281474976710656
d =3.141592654
e =pi - (198*eps)/359

其他运算

  • 转置
    • B=A.’
    • B=transpose(A)
  • 行列式运算 d=det(A)
  • 逆 inv(A)
  • 求秩 rank(A)
  • 特征值,特征向量 eig()
  • 奇异值 svd()
  • 若尔当标准型 jordan()

符号多项式简化

  • 因式分解 factor(x) 返回x的所有不可约因子

  • 符号矩阵的展开 expand(S)

    matlab
    1
    2
    3
    4
    5
    6
    syms x y	
    expand((x+3)^4)
    expand(cos(x+y))

    ans = x^4 + 12*x^3 + 54*x^2 + 108*x + 81
    ans = cos(x)*cos(y) - sin(x)*sin(y)
  • 符号简化 simplify

  • 分式通分 [n,d]=numden(A) 表达式分子n,分母d

    matlab
    1
    2
    3
    4
    5
    syms x y	
    [n,d]=numden(x/y-y/x+x.^2)

    n = x^3*y + x^2 - y^2
    d = x*y
  • “秦九韶型”重写 horner(p)

    matlab
    1
    2
    3
    4
    syms x
    horner(x^4-3*x^2+1)

    ans =x^2*(x^2 - 3) + 1

数列与极限

数列

数列求和

  • sum(A,dim)
    • 向量——所有元素和 dim=1:不求和;dim=2:求和
    • 矩阵——每一列元素和 dim=1:列求和,行显示;dim=2:行求和,列显示
    • sum(·,nanflag) nanflag=includenan——计算NaN,nanflag=omitnan——计算NaN,
  • nansum(A) 忽略NaN累计求和函数
  • cumsum(A) 求此元素之前的元素和函数
  • cumtrapz(Y) 求梯形累计和函数(积分)

数列求积

  • 元素连续相乘函数 B=prod(A)

    矩阵:按列向量的所有元素的积

  • 求累计积函数 B=cumprod(A)

  • 阶乘函数 f=factorial(n)

  • 伽马函数(非整数的阶乘) gamma()

    matlab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >> factorial(6)

    ans =
    720

    >> gamma(6)

    ans =
    120

    >> 6*gamma(6)

    ans =
    720

极限和导数

极限

  • x->0

    limit(f)

  • x->∞

    limit(f,inf,’right’) right:右极限

导数

  • diff(f,n) 求函数f的n阶导数
  • diff(f,x) 求函数f对x的导数

级数求和

  • 有限项级数求和 symsum(f,k,a,b) 计算级数f关于指数k从a到b的有限项和
  • 无穷级数求和 将b改为inf

积分

积分

  • 定积分和广义积分 int(f,x,a,b)
  • 不定积分 int(f,x)

多重积分

  • 二重积分 intergral2(fun,xmin,xmax,ymin,ymax)

    fzero(‘2*x-0.5*x’,0) 求f1-f2=0,即f1,f2的交点

泰勒展开

taylor(f,m,a)

taylor(f,’order’,5) 五阶麦克劳林型近似展开

傅里叶展开

matlab
1
2
3
4
5
function [a0,an,bn]=Fourierzpi(f)
syms x n
a0=int(f,0,2*pi)/pi;
an=int(f*cos(n*x),0,2*pi)/pi;
bn=int(f*sin(n*x),0,2*pi)/pi;

积分变换

  • 傅里叶积分变换 fourier(f,u,v)
  • 傅里叶逆变换 ifourier(F,v,u)
  • 快速傅里叶变换
  • 拉普拉斯变换 laplace(F,w,z)
  • 拉普拉斯逆变换 ilaplace(L,x,y)

方程求解

线性方程组求解

判断线性方程组的解

Z=null(A) 求矩阵A的核空间矩阵Z,Z的列向量是Ax=0的基础解系,满足ZTZ=IZ^TZ=I

Z=null(A,’r’) Z的列向量是Ax=0的有理基,Z不满足ZTZ=IZ^TZ=I

判断线性方程组Ax=b的解的存在性

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function y=isexist(A,b)
%该函数用来判断线性方程组Ax=b的解的存在性
%若方程组无解则返回0,若有唯一解则返回1,若有无穷多解则返回Inf
[m,n]=size(A);
[mb,nb]=size(b);
if m~=mb
error('输入有误!');
return;
end
r=rank(A);
s=rank([A,b]);
if r==s&r==n
y=1;
elseif r==s&r<n
y=Inf;
else
y=0;
end

利用矩阵的逆(伪逆)与除法求解

Ax=b

  • 为恰定方程组且A是非奇异的,x=A1bx=A^{-1}b
  • 不为为恰定方程组或A奇异,x=A\b
matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
format rat
A=[1 2 2 0;0 1 -2 -2;1 3 0 -2];
b=[1 2 3]';
x0=pinv(A)*b %利用伪逆求一个特解
Z=null(A,'r')%求基础解系
format

x0 =
13/77
46/77
-2/11
-40/77


Z =
-6 -4
2 2
1 0
0 1

利用行阶梯型求解

只适用于恰定方程组,且系数矩阵非奇异

矩阵->行阶梯型 [R,jb]=rref(A) jb:非零主元列

利用矩阵分解法求解

  • LU分解法

    matlab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    function x=solvebyLU(A,b)
    %该函数利用LU分解法求线性方程组Ax=b的解
    flag=isexist(A,b);%调用函数isexist()判断方程组解的情况
    if flag==0
    disp('该方程组无解!');
    x=[];
    return;
    else
    r=rank(A);
    [m,n]=size(A);
    [L,U,P]=lu(A);
    b=P*b;

    %解Ly=b
    y(1)=b(1);
    if m>1
    for i=2:m
    y(i)=b(i)-L(i,1:i-1)*y(1:i-1)';
    end
    end
    y=y';

    %解Ux=y得原方程组的一个特解
    x0(r)=y(r)/U(r,r);
    if r>1
    for i=r-1:-1:1
    x0(i)=(y(i)-U(i,i+1:r)*x0(i+1:r)')/U(i,i);
    end
    end
    x0=x0';

    if flag==1%若方程组有唯一解
    x=x0;
    return;
    else%若方程组有无穷多解
    format rat;
    Z=null(A,'r');%求出对应齐次方程组的基础解系
    [mZ,nZ]=size(Z);
    x0(r+1:n)=0;
    for i=1:nZ
    t=sym(char([107 48+i]));
    k(i)=t; %取k=[k1,k2,…];
    end
    x=x0;
    for i=1:nZ
    x=x+k(i)*Z(:,i); %将方程组的通解表示为特解加对应齐次通解形式
    end
    end
    end
    format%恢复数据显示格式
  • QR分解法

    matlab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    function x=solvebyQR(A,b)
    %该函数利用QR分解法求线性方程组Ax=b的解
    flag=isexist(A,b);%调用函数isexist()判断方程组解的情况
    if flag==0
    disp('该方程组无解!');
    x=[];
    return;
    else
    r=rank(A);
    [m,n]=size(A);
    [Q,R]=qr(A);
    b=Q'*b;

    %解Rx=b得原方程组的一个特解
    x0(r)=b(r)/R(r,r);
    if r>1
    for i=r-1:-1:1
    x0(i)=(b(i)-R(i,i+1:r)*x0(i+1:r)')/R(i,i);
    end
    end
    x0=x0';

    if flag==1 %若方程组有唯一解
    x=x0;
    return;
    else%若方程组有无穷多解
    format rat;
    Z=null(A,'r');%求出对应齐次方程组的基础解系
    [mZ,nZ]=size(Z);
    x0(r+1:n)=0;
    for i=1:nZ
    t=sym(char([107 48+i]));
    k(i)=t;%取k=[k1,…,kr];
    end
    x=x0;
    for i=1:nZ
    x=x+k(i)*Z(:,i);%将方程组的通解表示为特解加对应齐次通解形式
    end
    end
    end
    format%恢复数据显示格式
  • 楚列斯基分解法

    matlab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    function x=solvebyCHOL(A,b)
    %该函数利用楚列斯基分解法求线性方程组Ax=b的解
    lambda=eig(A);
    if lambda>eps&isequal(A,A')
    [n,n]=size(A);
    R=chol(A);
    %解R'y=b
    y(1)=b(1)/R(1,1);
    if n>1
    for i=2:n
    y(i)=(b(i)-R(1:i-1,i)'*y(1:i-1)')/R(i,i);
    end
    end

    %解Rx=y
    x(n)=y(n)/R(n,n);
    if n>1
    for i=n-1:-1:1
    x(i)=(y(i)-R(i,i+1:n)*x(i+1:n)')/R(i,i);
    end
    end
    x=x';
    else
    x=[];
    disp('该方法只适用于对称正定的系数矩阵!');
    end

非负最小二乘解

lsqnonneg(A,b)

方程与方程组的优化解

  • 非线性方程基本函数
    • x=fzero(fun,x0)
    • x=fzero(fun,x0,options)
    • x=fzero(problem)
    • [x,fval,exitflag,output]=fzero(···)
  • 非线性方程组基本函数
    • x=fslove(fun,x0)
    • x=fslove(fun,x0,options)
    • x=fslove(problem)
    • [x,fval,exitflag,output,jacobian]=fslove(···)

微分方程

微分方程

S=desolve(eqn,cond,Name,Value)

matlab
1
2
3
4
5
6
syms x(t) y(t)
eqns=[diff(x,t)==y,diff(y,t)==-x];
S=dsolve(eqns)
disp(' ')
disp(['微分方程的解',blanks(2),'x',blanks(22),'y'])
disp([S.x,S.y]) %显示方程的解

常微分方程的数值解法

欧拉方法

根据欧拉公式yn+1=yn+hf(xn,yn)y_{n+1}=y_n+hf(x_n,y_n)

matlab
1
2
3
4
5
6
7
8
function [x,y]=euler(f,x0,y0,xf,h)
n=fix((xf-x0)/h);
y(1)=y0;
x(1)=x0;
for i=1:n
x(i+1)=x0+i*h;
y(i+1)=y(i)+h*feval(f,x(i),y(i));
end

改进的欧拉公式:

yp=yn+hf(xn,yn)yc=yn+hf(xn+1,yn)yn+1=12(yp+yc)\begin{aligned} &y_p=y_n+hf(x_n,y_n) \\ &y_c=y_n+hf(x_{n+1},y_n) \\ &y_{n+1}=\frac{1}{2}(y_{p}+y_{c}) \end{aligned}

matlab
1
2
3
4
5
6
7
8
9
10
function [x,y]=adeuler(f,x0,y0,xf,h)
n=fix((xf-x0)/h);
x(1)=x0;
y(1)=y0;
for i=1:n
x(i+1)=x0+h*i;
yp=y(i)+h*feval(f,x(i),y(i));
yc=y(i)+h*feval(f,x(i+1),yp);
y(i+1)=(yp+yc)/2;
end

龙格-库塔方法

  • 非刚性

    • ode23 二、三阶R-K函数
    • ode45 四、五阶R-K函数
    • ode113
  • 刚性

    • ode15s 多步法
    • ode23s 单步法
    • ode23t 难度适中
    • ode23tb 较难
  • 完全隐式 ode15i

偏微分方程 PDE

[PDE工具箱使用](matlab的PDE工具箱的简单使用_matlab pde-CSDN博客)

区域设置及网格化

  • 创建偏微分方程定义的区域 文件名:pdegeom

    • ne=pdegeom

      ne——几何区域边界的线段数

    • d=pdegeom(bs)

      d——一个区域边界数据的矩阵

    • [x,y]=pdegeom(bs,s)

      bs——指定的边界线段

      s——相应线段弧长的近似值

  • 网格化

    matlab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    model = createpde;
    geometryFromEdges(model,@cardg);%根据自定义函数的几何形状创建模型对象的几何图形
    mesh=generateMesh(model);
    subplot(2,2,1),pdemesh(model)
    title('初始网格图')
    mesh=generateMesh(model,'Hmax',2);
    subplot(2,2,2),pdemesh(model)
    title('修改网格边界最大值')
    mesh=generateMesh(model,'Hmin',2);
    subplot(2,2,3),pdemesh(model),title('修改网格边界最小值')
    mesh=generateMesh(model,'GeometricOrder','linear','Hgrad',1);
    subplot(2,2,4),pdemesh(model)
    title('修改网格几何秩序和增长率')

边界条件设置

M文件名:pdebound

调用格式:[q,g,h,r]=pdebound(p,e,u,time)

e——边界

工具箱自带文件squareb3,m 区域为单位正方形

PDE函数求解

result=solvepde(model) 稳态

result=solvepde(model,tlist) 时间相关

lplsfc.m

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
model = createpde(); 
geometryFromEdges(model,@cirsg);%cirsg自带的
specifyCoefficients(model,'m',0,'d',0,'c',0,'a',1,'f',0);
%方程系数
rfun=@(location,state)
%初始条件
cos(2/3*atan2(location.y,location.x));
applyBoundaryCondition(model,'dirichlet','Edge',...
1:model.Geometry.NumEdges,'r',rfun,'h',1);%在所有边缘设置狄利克雷条件
generateMesh(model,'Hmax',0.25); %设置最大边界尺寸,生成模型网络
results=solvepde(model);
u=results.NodalSolution;
pdeplot(model,'XYData',u,'ZData',u(:,1))
hold on
pdemesh(model,u)
title('解的网格表面图')

rcd.m

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
model = createpde();  
geometryFromEdges(model,@squareg);
%自带的正方形区域
applyBoundaryCondition(model,'dirichlet',...
'Face',1:model.Geometry.NumFaces,'u',1);
%在所有面应用dirichlet边界条件
specifyCoefficients(model,'m',0,'d',1,'c',1,'a',0,'f',0);
%边界条件
u0=@(location) location.x.^2+location.y.^2<0.4;
%定义初始条件
setInitialConditions(model,u0);%设置初始条件
generateMesh(model,'Hmax',0.25);
tlist = linspace(0,0.1,20); %时间列表
results = solvepde(model,tlist);
u=results.NodalSolution;
pdeplot(model,'XYData',u,'ZData',u(:,1))%表面图
hold on
pdemesh(model,u)%网格图
title('解的网格表面图')

解特征值方程

result=slovepdeeig(model,evr) evr——特征值范围

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
model = createpde();
geometryFromEdges(model,@lshapeg);
%lshapeg为自带的L形区域文件
Mesh=generateMesh(model); %生成模型网络
pdegplot(model,'FaceLabels','on','FaceAlpha',0.5)
applyBoundaryCondition(model,'dirichlet','Edge',...
1:model.Geometry.NumEdges,'u',0);
specifyCoefficients(model,'m',0,'d',1,'c',1,'a',1,'f',0);
evr = [-Inf,100]; %指定区间
generateMesh(model,'Hmax',0.25);
results = solvepdeeig(model,evr); %求解特征值

Basis= 10, Time= 0.00, New conv eig= 0
Basis= 30, Time= 0.00, New conv eig= 6
Basis= 50, Time= 0.00, New conv eig= 17
Basis= 70, Time= 0.02, New conv eig= 35
End of sweep: Basis= 70, Time= 0.02, New conv eig= 33
Basis= 43, Time= 0.02, New conv eig= 0
Basis= 63, Time= 0.02, New conv eig= 1
End of sweep: Basis= 63, Time= 0.02, New conv eig= 1

V = results.Eigenvectors; %特征值向量
pdeplot(model,'XYData',V,'ZData',V(:,1));
title('第一特征模态图')
figure
pdeplot(model,'XYData',V,'ZData',V(:,16));
title('第十六特征模态图')

数据可视化分析

样本空间

概率:p(A)

数据可视化

离散情况

matlab
1
2
3
4
5
x=[25  28  26  26  29  22  21  22  26  27  30  28  29];	
y=[28 23 35 21 24 32 35 34 31 30 28 29 27];
plot(x,y,'r^')
title('尼古丁含量测试情况')
grid on

连续情况

matlab
1
2
3
4
5
x=[25  28  26  26  29  22  21  22  26  27  30  28  29];	
y=[28 23 35 21 24 32 35 34 31 30 28 29 27];
plot(x,y,'r^')
title('尼古丁含量测试情况')
grid on

正交试验分析

极差分析(直观分析法)

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function [result,sum0]=zjjc(s,opt)
%对正交试验进行极差分析,s是输入矩阵,opt是最优参数,其中
%若opt=1,表示最优取最大,若opt=2,表示最优取最小
%s=[1 1 1 1 857;
% 1 2 2 2 951;
% 1 3 3 3 909;
% 2 1 2 3 878;
% 2 2 3 1 973;
% 2 3 1 2 899;
% 3 1 3 2 803;
% 3 2 1 3 1030;
% 3 3 2 1 927];
%s的最后一列是各个正交组合的试验测量值,前几列是正交表
[m,n]=size(s);
p=max(s(:,1)); %取水平数
q=n-1; %取列数
sum0=zeros(p,q);
for i=1:q
for k=1:m
for j=1:p
if(s(k,i)==j)
sum0(j,i)=sum0(j,i)+s(k,n); %求和
end
end
end
end
maxdiff=max(sum0)-min(sum0);%求极差
result(1,:)=maxdiff;
if(opt==1)
maxsum0=max(sum0);
for kk=1:q
modmax=mod(find(sum0==maxsum0(kk)),p); %求最大水平
if modmax==0
modmax=p;
end
result(2,kk)=(modmax);
end
else
minsum0=min(sum0);
for kk=1:q
modmin=mod(find(sum0==minsum0(kk)),p); %求最小水平
if modmin==0
modmin=p;
end
result(2,kk)=(modmin);
end
end

例子:

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
s=[  1     1  1    1  857;
1 2 2 2 951;
1 3 3 3 909;
2 1 2 3 878;
2 2 3 1 973;
2 3 1 2 899;
3 1 3 2 803;
3 2 1 3 1030;
3 3 2 1 927];

[result,sum0]=zjjc(s,1)

result =
43 416 101 164%每个因素的极差
3 2 1 3%相应因素的最优生产条件
sum0 =%相应因素每个水平的数据和
2717 2538 2786 2757
2750 2954 2756 2653
2760 2735 2685 2817

方差分析

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function [result,error,errorDim]=zjfc(s,opt)
%对正交试验进行方差分析,s是输入矩阵,opt是空列参数向量,给出s中是空白列的列序号
%s=[1 1 1 1 1 1 1 83.4;
% 1 1 1 2 2 2 2 84;
% 1 2 2 1 1 2 2 87.3;
% 1 2 2 2 2 1 1 84.8;
% 2 1 2 1 2 1 2 87.3;
% 2 1 2 2 1 2 1 88;
% 2 2 1 1 2 2 1 92.3;
% 2 2 1 2 1 1 2 90.4;
%];
%opt=[3,7];
%s的最后一列是各个正交组合的试验测量值,前几列是正交表
[m,n]=size(s);
p=max(s(:,1)); %取水平数
q=n-1;%取列数
sum0=zeros(p,q);
for i=1:q
for k=1:m
for j=1:p
if(s(k,i)==j)
sum0(j,i)=sum0(j,i)+s(k,n); %求和
end
end
end
end
totalsum=sum(s(:,n));
ss=sum0.*sum0;
levelsum=m/p; %水平重复数
ss=sum(ss./levelsum)-totalsum^2/m; %每一列的S
ssError=sum(ss(opt));
for i=1:q
f(i)=p-1; %自由度
end
fError=sum(f(opt)); %误差自由度
ssbar=ss./f;
Errorbar=ssError/fError;
index=find(ssbar<Errorbar);
index1=find(index==opt);
index(index==index(index1))=[]; %剔除重复
ssErrorNew=ssError+sum(ss(index)); %并入误差
fErrorNew=fError+sum(f(index)); %新误差自由度
F=(ss./f)/(ssErrorNew./fErrorNew); %F值
errorDim=[opt,index];
errorDim=sort(errorDim); %误差列的序号
result=[ss',f',ssbar',F'];
error=[ssError,fError;ssErrorNew,fErrorNew];

例子:

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
s=[ 51 25 18 32;
40 23 13 35;
43 24 12 34;
48 26 16 30;
35 30 11 35;
32 31 10 37];

[result,sum0]=zjfc(s,1)%第1列为空白列以考查试验误差进行方差分析

result =%方差分析结果
1.0e+04 *
5.1773 0.0050 0.1035 0.0001
5.1773 0.0050 0.1035 0.0001
5.1773 0.0050 0.1035 0.0001


sum0 =%误差
1.0e+04 *
5.1773 0.0050
5.1773 0.0050

回归分析和方差分析

回归分析

一元线性回归

ployfit()

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x=[82 93 105 130 144 150 160 180 270 300 400]; 
y=[75 85 92 105 120 130 145 156 200 200 240];
[p,s]=polyfit(x,y,1)
plot(x,y,'o')
x0=[min(x):1:max(x)];%重新定义取值点,间隔为1
y0=p(1)*x0+p(2);
hold on
plot(x0,y0)

p =%多项式的系数向量
0.5269 44.2547
s = %用于获取误差估计值的结构体
包含以下字段的 struct:
R: [2×2 double]
df: 9
normr: 36.8058

多元线性回归

[b,bint,r,rint,stats]=regress(y,X,alpha) 因变量y,自变量X

b——对回归系数的最小二乘估计

bint——回归系数b的95%置信度的置信区间

r——残差

rint——r的置信区间

stats——检验统计量

假设回归方程有常数项,计算stats时,X应该包含一个全1的列

alpha——指定的置信水平

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
y=[11.9 22.8 18.7 20.1 12.9 21.7 27.1 25.4	 21.3 19.3 25.4 27.2 11.7	17.8 12.8 23.9 22.6 25.4 14.8 21.1];
%测量数据
x=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1; 19.5 24.7 30.7 29.8 19.1 25.6 31.4 27.9 22.1 25.5 31.1 30.4 18.7 19.7 14.6 29.5 27.7 30.2 22.7 25.2; 43.1 49.8 51.9 54.3 42.2 53.9 58.6 52.1 49.9 53.5 56.6 56.7 46.5 44.2 42.7 54.4 55.3 58.6 48.2 51; 29.1 28.2 37 31.1 30.9 23.7 27.6 30.6 23.2 24.8 30 28.3 23 28.6 21.3 30.1 25.6 24.6 27.1 27.5 ]; %构建分析数据矩阵
[b,bint,r,rint,stats]=regress(y',x')

b =%系数估计值
107.8763
4.0599
-2.6200
-2.0402
bint =%系数估计值的置信边界的上界和下界
-100.7196 316.4721
-2.2526 10.3723
-8.0200 2.7801
-5.3790 1.2986
r =%残差
-2.8541
2.6523
-2.3515
-3.0467
1.0842
-0.5405
1.5828
3.1830
1.7691
-1.3383
0.7572
2.1928
-3.3433
4.0958
0.9780
0.1931
-0.6220
-1.3659
-3.6641
0.6382
rint =%用于诊断离群值的区间
-7.0569 1.3488
-2.1810 7.4856
-6.2623 1.5593
-7.9378 1.8444
-3.2626 5.4310
-5.6469 4.5659
-3.1194 6.2849
-1.5201 7.8862
-3.0732 6.6113
-6.0888 3.4121
-4.3244 5.8388
-2.8440 7.2297
-7.8489 1.1623
-0.3044 8.4960
-3.4144 5.3703
-4.9673 5.3534
-5.7883 4.5444
-6.1250 3.3932
-8.3703 1.0420
-4.6541 5.9305
stats =%模型统计量
0.7993 21.2383 0.0000 6.2145

部分最小二乘回归

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
function [beta,VIP]= pls(X,Y)
[n,p]=size(X);
[n,q]=size(Y);
meanX=mean(X);%均值
varX=var(X);%方差
meanY=mean(Y);%均值
varY=var(Y);%方差

%%%%数据标准化过程
for i=1:p
for j=1:n
X0(j,i)=(X(j,i)-meanX(i))/((varX(i))^0.5);
end
end
for i=1:q
for j=1:n
Y0(j,i)=(Y(j,i)-meanY(i))/((varY(i))^0.5);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[omega(:,1),t(:,1),pp(:,1),XX(:,:,1),rr(:,1),YY(:,:,1)]=plsfactor(X0,Y0);
[omega(:,2),t(:,2),pp(:,2),XX(:,:,2),rr(:,2),YY(:,:,2)]=plsfactor(XX(:,:,1), YY(:,:,1));

PRESShj=0;
tt0=ones(n-1,2);

for i=1:n
YY0(1:(i-1),:)=Y0(1:(i-1),:);
YY0(i:(n-1),:)=Y0((i+1):n,:);
tt0(1:(i-1),:)=t(1:(i-1),:);
tt0(i:(n-1),:)=t((i+1):n,:);
expPRESS(i,:)=(Y0(i,:)-t(i,:)*inv((tt0'*tt0))*tt0'*YY0);
for m=1:q
PRESShj=PRESShj+expPRESS(i,m)^2;
end
end
sum1=sum(PRESShj);
PRESSh=sum(sum1);

for m=1:q
for i=1:n
SShj(i,m)=YY(i,m,1)^2;
end
end
sum2=sum(SShj);
SSh=sum(sum2);

Q=1-(PRESSh/SSh);

k=3;
%%%%%%%%%%%%%%%%循环,提取主元
while Q>0.0975
[omega(:,k),t(:,k),pp(:,k),XX(:,:,k),rr(:,k),YY(:,:,k)]=plsfactor (XX(:,:,k-1),YY(:,:,k-1));
PRESShj=0;
tt00=ones(n-1,k);
for i=1:n
YY0(1:(i-1),:)=Y0(1:(i-1),:);
YY0(i:(n-1),:)=Y0((i+1):n,:);
tt00(1:(i-1),:)=t(1:(i-1),:);
tt00(i:(n-1),:)=t((i+1):n,:);
expPRESS(i,:)=(Y0(i,:)-t(i,:)*((tt00'*tt00)^(-1))*tt00'*YY0);
for m=1:q
PRESShj=PRESShj+expPRESS(i,m)^2;
end
end

for m=1:q
for i=1:n
SShj(i,m)=YY(i,m,k-1)^2;
end
end

sum2=sum(SShj);
SSh=sum(sum2);
Q=1-(PRESSh/SSh);

if Q>0.0975
k=k+1;
end

end
%%%%%%%%%%%%%%%%%%%%%
h=k-1;%%%%%%%%%提取主元的个数

%%%%%%%%%%%%%%还原回归系数
omegaxing=ones(p,h,q);
for m=1:q
omegaxing(:,1,m)=rr(m,1)*omega(:,1);
for i=2:(h)
for j=1:(i-1)
omegaxingi =(eye(p)-omega(:,j)*pp(:,j)');
omegaxingii=eye(p);
omegaxingii=omegaxingii*omegaxingi;
end
omegaxing(:,i,m)=rr(m,i)*omegaxingii*omega(:,i);
end
beta(:,m)=sum(omegaxing(:,:,m),2);
end
%%%%%%%计算相关系数
for i=1:h
for j=1:q
relation(i,j)=sum(prod(corrcoef(t(:,i),Y(:,j))))/2;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%
Rd=relation.*relation;
RdYt=sum(Rd,2)/q;
Rdtttt=sum(RdYt);
omega22=omega.*omega;
VIP=((p/Rdtttt)*(omega22*RdYt)).^0.5; %%%计算VIP系数

提取主元

matlab
1
2
3
4
5
6
7
8
9
10
11
12
function [omega,t,pp,XXX,r,YYY]=plsfactor(X0,Y0) 
XX=X0'*Y0*Y0'*X0;
[V,D]=eig(XX);
Lamda=max(D);
[MAXLamda,I]=max(Lamda);
omega=V(:,I); %最大特征值对应的特征向量
%%%第一主元
t=X0*omega;
pp=X0'*t/(t'*t);
XXX=X0-t*pp';
r=Y0'*t/(t'*t);
YYY=Y0-t*r';

例子:

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
X=[191 36 50;%自变量
189 37 52;
193 38 58;
162 35 62;
189 35 46;
182 36 56;
211 38 56;
167 34 60;
176 31 74;
154 33 56;
169 34 50;
166 33 52;
154 34 64;
247 46 50;
193 36 46;
202 37 62;
176 37 54;
157 32 52;
156 33 54;
138 33 68
];

Y=[5 162 60;%因变量
2 110 60;
12 101 101;
12 105 37;
13 155 58;
4 101 42;
8 101 38;
6 125 40;
15 200 40;
17 251 250;
17 120 38;
13 210 115;
14 215 105;
1 50 50 ;
6 70 31;
12 210 120;
4 60 25;
11 230 80;
15 225 73;
2 110 43];
[beta,VIP]=pls(X,Y) %进行部分最小二乘回归

beta =
-0.0778 -0.1385 -0.0604
-0.4989 -0.5244 -0.1559
-0.1322 -0.0854 -0.0073
VIP =
0.9982
1.2977
0.5652

数理统计基础

样本均值

M=mean(A)

  • 算术平均 nanmean
  • 几何平均 geomean
  • 调和平均 harmmean
  • 调整平均 trimmean

样本方差与标准差

  • 方差 var(A,w) w——权重向量

  • 标准差 std(A,w)

    w=0(默认),按N-1进行归一化

    w=1,按观测数值量N进行归一化

协方差和相关系数

  • 协方差 cov(A)
  • 相关系数 corrcoef(A)

多元数据相关分析

主成分分析

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function [F,rate,maxlamda]=mainfactor(X)
[n,p]=size(X);
meanX=mean(X);
varX=var(X);
for i=1:p
for j=1:n
X0(j,i)=(X(j,i)-meanX(i))/((varX(i))^0.5);
end
end
V=corrcoef(X0);
[VV0,lamda0]=eig(V);
lamda1=sum(lamda0);
lamda=lamda1(find(lamda1>0));
VV=VV0(:,find(lamda1>0));
k=1;
while(k<=length(lamda))
[maxlamda(k),I]=max(lamda);
maxVV(:,k)=VV(:,I);
lamda(I)=[];
VV(:,I)=[];
k=k+1;
end
lamdarate=maxlamda/sum(maxlamda);
rate=(zeros(1,length(maxlamda)));
for l=1:length(maxlamda)
F(:,l)=maxVV(:,1)'*X';
for m=1:l
rate(l)=rate(l)+lamdarate(m);
end
end

例子:

matlab
1
2
3
4
5
6
7
8
9
10
11
X=[19.5 24.7 30.7 29.8 19.1 25.6 31.4 27.9 22.1 25.5  31.1 30.4 18.7 19.7 	14.6	29.5	27.7	30.2	22.7	25.2;43.1	49.8	51.9	54.3	42.2	53.9	58.6	52.1	49.9	53.5 56.6	56.7	46.5	44.2	42.7	54.4	55.3	58.6	48.2	51;	  29.1 	28.2	37		31.1	30.9	23.7	27.6	30.6	23.2	24.8	  30		28.3	23		28.6	21.3	30.1	25.6	24.6	27.1	27.5];
[F,rate,maxlamda]=mainfactor(X)

F =%对应的主成分
113.2766 113.2766 113.2766 113.2766 113.2766 113.2766
229.0117 229.0117 229.0117 229.0117 229.0117 229.0117
123.3809 123.3809 123.3809 123.3809 123.3809 123.3809
rate =%每个主成分的贡献率
0.9681 1.0000 1.0000 1.0000 1.0000 1.0000
maxlamda =%从大到小排列的协方差阵特征值
19.3620 0.6380 0.0000 0.0000 0.0000 0.0000

典型相关分析

看是否存在相关关系

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function [maxVV1,maxVV2,F,G]=dxxg(X,Y)
[n,p]=size(X);
[n,q]=size(Y);
meanX=mean(X);
varX=var(X);
meanY=mean(Y);
varY=var(Y);
for i=1:p
for j=1:n
X0(j,i)=(X(j,i)-meanX(i))/((varX(i))^0.5);
end
end
for i=1:q
for j=1:n
Y0(j,i)=(Y(j,i)-meanY(i))/((varY(i))^0.5);
end
end
V1=inv(X0'*X0)*X0'*Y0*inv(Y0'*Y0)*Y0'*X0;
V2=inv(Y0'*Y0)*Y0'*X0*inv(X0'*X0)*X0'*Y0;
[VV1,lamda1]=eig(V1);
[VV2,lamda2]=eig(V2);
lamda11=sum(lamda1);
lamda21=sum(lamda2);
k=1;
while(k<=(length(lamda1))^0.5)
[maxlamda1(k),I]=max(lamda11);
maxVV1(:,k)=VV1(:,I);
lamda11(I)=[];
VV1(:,I)=[];
[maxlamda2(k),I]=max(lamda21);
maxVV2(:,k)=VV2(:,I);
lamda21(I)=[];
VV2(:,I)=[];
k=k+1;
end
F=X0*maxVV1;
G=Y0*maxVV2;

例子:

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
X=[191 36 50; 189 37 52; 193 38 58; 162 35 62; 189 35 46; 182 36 56; 211 38 56; 167 34 60; 176 31 74; 154 33 56; 169 34 50; 166 33 52; 154 34 64; 247 46 50; 193 36 46; 202 37 62; 176 37 54; 157 32 52; 156 33 54; 138 33 68];
Y=[5 162 60; 2 110 60; 12 101 101; 12 105 37; 13 155 58; 4 101 42; 8 101 38; 6 125 40; 15 200 40; 17 251 250; 17 120 38; 13 210 115; 14 215 105; 1 50 50 ; 6 70 31; 12 210 120; 4 60 25; 11 230 80; 15 225 73; 2 110 43];
[maxVV1,maxVV2,F,G]=dxxg(X,Y)

maxVV1 =%X的典型主轴
0.4405
-0.8971
0.0336
maxVV2 =%Y的典型主轴
-0.2645
-0.7976
0.5421
F =%X的典型成分
0.0247
-0.2819
-0.4627
-0.1566
0.2506
-0.1079
-0.1510
0.2035
1.2698
0.2331
0.1926
0.4286
-0.0098
-1.7782
0.0417
-0.0034
-0.5045
0.5482
0.2595
0.0036
G =%Y的典型成分
-0.0960
0.7170
0.7649
0.0373
-0.4281
0.5414
0.2990
0.1142
-1.2921
0.1779
-0.3935
-0.5266
-0.7461
1.4262
0.7202
-0.4237
0.8843
-1.0515
-1.2619
0.5373

方差分析

单因素方差分析

anoval(X,group) group——标识箱线图中的坐标

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
X=[4.3  6.1  6.5  9.3  9.5; 7.8  7.3  8.3	8.7	 8.8; 3.2  4.2  8.6	7.2	11.4; 6.5  4.1  8.2  10.1  7.8];
mean(X)
[p,table,stats]=anova1(X)

ans =%样本均值
5.4500 5.4250 7.9000 8.8250 9.3750
p =%各列均值相等的概率值
0.0042
table =%方差分析表
4×6 cell 数组
{'来源'} {'SS' } {'df'} {'MS' } {'F' } {'p 值(F)' }
{'列' } {[55.5370]} {[ 4]} {[ 13.8843]} {[ 6.0590]} {[ 0.0042]}
{'误差'} {[34.3725]} {[15]} {[ 2.2915]} {0×0 double} {0×0 double}
{'合计'} {[89.9095]} {[19]} {0×0 double} {0×0 double} {0×0 double}
stats = %结果结构体
包含以下字段的 struct:
gnames: [5×1 char]
n: [4 4 4 4 4]
source: 'anova1'
means: [5.4500 5.4250 7.9000 8.8250 9.3750]
df: 15
s: 1.5138

双因素方差分析

anova2(X,reps) reps——试验重复次数

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
X=[58.2    52.6 56.2 41.2    65.3 60.8;49.1 42.8 54.1 50.5 51.6 48.4;60.1 58.3    70.9 73.2    39.2 40.7;75.8 71.5    58.2 51    48.7 41.4];	
[p,table,stats]=anova2(X',2)

p =
0.0260 0.0035 0.0001
table =
6×6 cell 数组
{'来源' } {'SS' } {'df'} {'MS' } {'F' } {'p 值(F)' }
{'列' } {[ 261.6750]} {[ 3]} {[ 87.2250]} {[ 4.4174]} {[ 0.0260]}
{'行' } {[ 370.9808]} {[ 2]} {[185.4904]} {[ 9.3939]} {[ 0.0035]}
{'交互效应'} {[1.7687e+03]} {[ 6]} {[294.7821]} {[ 14.9288]} {[6.1511e-05]}
{'误差' } {[ 236.9500]} {[12]} {[ 19.7458]} {0×0 double} {0×0 double }
{'合计' } {[2.6383e+03]} {[23]} {0×0 double} {0×0 double} {0×0 double }
stats =
包含以下字段的 struct:
source: 'anova2'
sigmasq: 19.7458
colmeans: [55.7167 49.4167 57.0667 57.7667]
coln: 6
rowmeans: [58.5500 56.9125 49.5125]
rown: 8
inter: 1
pval: 6.1511e-05
df: 12

数据拟合与插值

数据插值

拉格朗日插值