MATLAB符号运算

向量与矩阵基本操作

向量多项式互换

  • 向量转成多项式:使用poly2sym()函数

    %向量变成多项式
    x = [3 2 1 5 7];
    y = poly2sym(x)
    
  • 多项式转成向量:使用sym2poly()函数

    %向量变成多项式
    syms x;                             %syms是定义变量,作者当时没有定义变量一直报一些很奇怪的错
    z = 3*x^4 + 2*x^3 + x^2 + 5*x + 7;
    q = sym2poly(z)
    
  • 求多项式导数的向量:采用polyder()函数

    %求多项式导数的系数向量
    q = polyder(p)                      %注意这个地方的变量是系数向量,而不直接是多项式
    
  • 求多项式的乘积:采用conv()函数

    %求矩阵乘积
    z2 = conv(x, x2)   %变量为系数向量
    
  • 求多项式的商:采用deconv()函数

    %k返回的是多项式p除以q的商,r是余式
    [k,r] = deconv(x, x2)
    

创建特殊矩阵、矩阵变换、特殊矩阵抽取方法、矩阵特征

见https://blog.csdn.net/qq_43575267/article/details/86619885

数据插值

一维插值

x、y为已知的数据点,xi为想要插值数据点的横坐标,返回对应的纵坐标yi。method为插值方法,总共有四种。

最近邻点插值,即若最近,则

x = linspace(0,2*pi,13);
y = sin(x);
xi = linspace(0,2*pi,50);

plot(x,y,'*')
hold on
yi1 = interp1(x,y,xi,'nearest');
plot(xi,yi1)
title('nearest')

线性插值,即插值的结果是一条条线段。

x = linspace(0,2*pi,13);
y = sin(x);
xi = linspace(0,2*pi,50);

plot(x,y,'*')
hold on
yi1 = interp1(x,y,xi,'linear');
plot(xi,yi1)
title('linear')

进行三次样条插值,所得图形为光滑曲线,并且是二阶光滑的

x = linspace(0,2*pi,13);
y = sin(x);
xi = linspace(0,2*pi,50);

plot(x,y,'*')
hold on
yi1 = interp1(x,y,xi,'spline');
plot(xi,yi1)
title('spline')

进行保形分段三次插值。插值是分段进行的,所以不会出现‘spline’曲线上下震动的情况。

x = linspace(0,2*pi,13);
y = sin(x);
xi = linspace(0,2*pi,50);

plot(x,y,'*')
hold on
yi1 = interp1(x,y,xi,'pchip');
plot(xi,yi1)
title('pchip')

二位线性插值

x、y、z是空间中点的坐标,xi、yi是插值点x、y轴坐标,返回对应z轴坐标。在interp2中,没有‘pchip’,对应方法改为‘cubic’

X = linspace(-2*pi,2*pi,10);
[X,Y] = meshgrid(X);
Z = Y*sin(X) - X*cos(Y);
Xi = linspace(-2*pi,2*pi,50);
[Xi,Yi] = meshgrid(Xi);

figure
subplot(2,2,1)
Zi1 = interp2(X,Y,Z,Xi,Yi,'nearest');
plot3(X,Y,Z,'*')
hold on
surf(Xi,Yi,Zi1)
title('nearest')

subplot(2,2,2)
Zi2 = interp2(X,Y,Z,Xi,Yi,'linear');
plot3(X,Y,Z,'*')
hold on
surf(Xi,Yi,Zi2)
title('linear')

subplot(2,2,3)
Zi3 = interp2(X,Y,Z,Xi,Yi,'spline');
plot3(X,Y,Z,'*')
hold on
surf(Xi,Yi,Zi3)
title('spline')

subplot(2,2,4)
Zi4 = interp2(X,Y,Z,Xi,Yi,'cubic');
plot3(X,Y,Z,'*')
hold on
surf(Xi,Yi,Zi4)
title('cubic')

解微分方程

解单一微分方程

  • S=dsolve(eqn,cond)

eqn是微分方程等式,其中微分用diff函数表示,cond是确定微分方程不定系数的条件。注意函数要用带括号的形式定义。即:

确定初始条件时要设置一个新变量:

如果没有cond则为解中含有不定系数C

syms y(t)
eqn = diff(y,t,3)-3*diff(y,t,2)+3*diff(y,t,1)-y == -1;
Dy = diff(y,t,1);
D2y = diff(y,t,2);
cond = [Dy(0) == -1,D2y(0) == 1,y(0) ==2];
ySol = dsolve(eqn,cond)

解微分方程组

syms x(t)  y(t)
eqn1 = diff(x,t)-2*diff(y,t,2)-2*y == 0;
eqn2 = diff(x,t,2)-2*diff(y,t) == 2*sin(t);
Dy = diff(y,t,1);
Dx = diff(x,t,1);
cond1 = [Dx(0) == 0,x(0) == 0];
cond2 = [Dy(0) == 1,y(0) == 1];
eqns = [eqn1, eqn2];
cond = [cond2, cond1];
[xSol, ySol] = dsolve(eqns,cond)

解方程

解单一方程

  • 采用函数

    var是所求的变量

syms a b c x
eqn = a*x^2+b*x+c
sol = solve(eqn)
sol2 = solve(eqn, a)

  • 采用函数

    计算在[a,b]内的解,但是只能是数,不能是符号

    syms x
    eqn = sin(x) == cos(x)
    sol = vpasolve(eqn, [0,pi/2])
    

解方程组

eqns是方程组的符号向量,即[ eqn1 ,eqn2 , . . . ]。var是未知数向量,Y是所求结果。如果只写一个Y,则返回的Y是结构体,如果将Y写成[sol1, sol2, . . . ] 的形式,则每个元素为var中的解。

syms x y
eqns = [2*x+y == 9, 5*x+9*y ==20]
vars = [x, y]
[solvx, solvy] = solve(eqns,vars)
Y = solve(eqns,vars)
Y.x
Y.y

方程组的解带入函数

当方程组的解是结构体Y时,要计算函数f的值,可以使用语句: ,即可将方程得到的解带入

syms x y
eqns = [2*x+y == 9, 5*x+9*y ==20]
vars = [x, y]
[solvx, solvy] = solve(eqns,vars)
Y = solve(eqns,vars)
Y.x
Y.y
f = x^2+y^2
A = subs(f, Y)

线性方程组求解

有唯一解的线性方程组求解

转换成矩阵的形式:

则可以用矩阵运算求解x,即

有无穷解的线性方程组求解

齐次线性方程组求解

求解齐次线性方程组基础解系的函数是null Z=null(A)表示返回矩阵A的基础解系组成的矩阵。Z还满足 Z=null(A,‘r’)得出的Z不满足,但得出的矩阵元素多为整数,故一般都带参数r

非齐次线性方程求解

非齐次线性方程组在求出基础解析后还要求一个特解。对于矩阵形式的非齐次线性方程组特解的求法为;其中函数pinv的意思是伪逆矩阵。

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')

利用Gauss消元法求解线性方程组

在线性代数中,我们主要的方法就是Gauss消元法。MATLAB中将矩阵化为行阶梯型的函数是: 我们可以用线性代数知识,编写一个函数,给入矩阵A和b,给出方程的解,函数自动判断是有唯一解还是无穷解。

Ar=rank(A); Br=rank(B);
B=rref(B);
if (Ar<Br)
    flag=0; S=0;
elseif (Ar==Br && Ar==Alie)
    flag=1; S=B(:,Alie+1);
else
    %将能构成单位矩阵的列号存储在行向量I中,即存储了极大线性无关向量的编号
    %将剩余列号存入行向量C中
    for i=1:Ar
        for j=1:Alie
            if(B(i,j)==1)
                I(i)=j;
                break
            end
        end
    end
    C=setdiff(1:Alie,I);
    %由线性代数知识可得基础解系
    ILim=length(I); CLim=length(C);
    S(Alie,CLim)=0;%初始化S,S行数为A列数,S列数为C的维度
    for i=1:CLim
        S(C(i),i)=-1;
        for j=1:ILim
            S(I(j),i)=B(j,C(i));
        end
    end
    if(nargin==1)
        flag=2;
    else
        flag=3;
        S(Alie,CLim+1)=0;
        for i=1:Ar
            S(I(i),CLim+1)=B(i,Alie+1);
        end
    end
end

数列与极限

数列求和

  • 采用函数

    • sum是求数组A指定方向的和。

      当dim=1时,求每一列的和,返回行向量。

      当dim=2时,求每一行的和,返回一个列向量。

      sum(A)默认dim=1。

      a = [1 2 3;4 5 6; 7 8 9];
      b = sum(a, 1)
      c = sum(a, 2)
      e = sum(a)
      

    • 前三者规定了矩阵的数据类型,includenan表示求和包含NaN,omitnan表示不包含NaN。注意每次只能加一个参数。

    PS:NaN是Not a Number的缩写,即不是一个有效数据

其它数列求和

  • 采用函数

    不包含NaN的求和。与S=sum(A,‘omitnan’)相同。

  • 采用函数

    dim表示求和是按行求还是按列求,与sum相同,但求和方式不同。

    以按行求和为例,对每一行的数组[ ],则所求的B的对应行 []满足 简而言之,就是求每个位置加上前面所有元素的和。

  • 采用函数

    ‘forward’、'reverse’表示求和方向,forward方向为默认方向,reverse表示相反方向

A=[1 2 3 4;5 6 7 8;9 10 11 12]
B3=cumsum(A)
B4=cumsum(A,2)
B5=cumsum(A,'reverse')
C=[1 2 3;4 NaN 5;NaN 6 7]
D1=sum(C)
D2=sum(C,'omitnan')
D3=nansum(C)

数列求积、求极限、求导、求级数和

见https://blog.csdn.net/qq_43575267/article/details/86558828

均值与方差

见https://blog.csdn.net/qq_43575267/article/details/86602325

积分计算与积分变换

积分计算

命令

说明

int(f)

计算函数 f 的不定积分

int(f,x)

计算函数 f 关于自变量x的不定积分

int(f,a,b)

计算函数 f 在区间 [a,b] 上的定积分

int(f,x,a,b)

计算函数 f 关于自变量x在区间 [a,b] 上定积分

MATLAB中的函数只能计算一次积分,但是上限和下限可以含未知变量。要 计算二重积分和三重积分就要引用两次、三次 int。而计算在一定区域内的二重积分和三重积分要先手动化成带积分限的形式

%给出定义域并解出定义域
f1 = @(x) 2*x
f2 = @(x) 0.5*x
f3 = @(x) 3-x
fplot(f1)
hold on
fplot(f2)
fplot(f3)
axis([-1 3 -2 4])
%求出交点坐标
A = fzero('2*x-0.5*x',0)
B = fzero('2*x-3+x',0)
C = fzero('0.5*x-3+x',0)
%求积分
syms x y
f = x 
I = int(int(f,y,f2,f1),A,B)+int(int(f,y,f2,f3),B,C)

积分变换

傅里叶变换

命令

说明

F=fourier(f)

求 f 关于 x 的傅里叶积分变换,返回自变量为 w

F=fourier(f,v)

返回的函数以 v 为自变量

F=fourier(f,u,v)

返回的函数以 v 为自变量,函数 f 自变量为 u

f=ifourier(F)

求 F 关于 w 的傅里叶积分逆变换,返回自变量为 x

f=ifourier(F,v)

返回的函数以 v 为自变量

f=ifourier(F,u,v)

返回的函数以 v 为自变量,函数 F 自变量为 u

拉普拉斯变换

命令

说明

F=laplace(f)

求 f 关于 t 的拉普拉斯变换,返回自变量为 s

F=laplace(f,v)

返回的函数以 v 为自变量

F=laplace(f,u,v)

返回的函数以 v 为自变量,函数 f 自变量为 u

f=ilaplace(F)

求 F 关于 s 的拉普拉斯积分逆变换,返回自变量为 t

f=ilaplace(F,v)

返回的函数以 v 为自变量

f=ilaplace(F,u,v)

返回的函数以 v 为自变量,函数 F 自变量为 u


本文章使用limfx的vscode插件快速发布