matlab学习记录

%矩阵
a=[1,2,3;
     4,5,6;
     7,8,9]     %在Matlab在存储矩阵时,是一列一列存储的
a(3)             %位置3的元素(竖着数)
a(2,1)          %a第2行第1列个元素
b=[1,1,1;2,2,2]
a1=a'            %转置
a2=inv(a)      %求逆
a3=repmat(a,5,2)    %5*2个a
a4=1:1:9                  %1开始,9结束(含9),步长为1的1*n矩阵
a5=ones(4,3)          %4*3的单位矩阵
b*b'         %矩阵乘法的基本运算
b.*b         %对应项相乘  
a.^ 2       %a的每个元素取乘方
a^ 2        %矩阵a*矩阵a,即矩阵a的乘方
b1=a(2,3)    %取a的(2,3)元素
b2=a(3,:)     %取a第3行所有元素  
b3=a(:,3)     %取a第3列所有元素
b4=a(:)        %取a第所有元素
[m,n]=find(a>5)    %找大于5的元素的索引值,(m,n)位置的元素大于5

%函数

%log(x)   e为底数
log(exp(1))    %e为底数,x为e
log10(10)      %10为底数
log(36)/log(6)   %利用loga(b)=ln(b)/ln(a)计算36为底数,6为x的对数
%disp()
disp('需要输出的字符串')
%input()
a= input('请输入a:')

%prod()     求向量or矩阵的乘积
B=prod(A)        % A是向量时,返回A向量所有元素的乘积
                         %A是矩阵时,返回每一列元素的乘积,组成一个行向量B
A =[8 1 6
       3 5 7
       4 9 2]
prod(A)       %返回每一列元素的乘积,组成一个行向量B
prod(A,1)    %返回每一列元素的乘积,组成一个行向量B,和prod(A)一样
prod(A,2)    %返回每一行元素的乘积,组成一个行向量B

A=[1 2 3]
prod(A)

%sum函数      向量、矩阵求和
a=[1,2,3]
sum(a)            %向量求和
b=[1,5;2,6;3,7]
sum(b)            %矩阵求和,对列
sum(b,1)         %矩阵行求和
sum(b,2)         %矩阵列求和
sum(sum(b))   %矩阵所有元素求和
sum(b(:))         %矩阵所有元素求和
b(:)                  %由第一列开始,列出所有元素

%inv函数    求逆
a=[1,2,3;4,5,6;7,8,9] 
inv(a)  %求逆

%eig函数(作用对象必须是方阵)求解特征值、特征根
a=[1,2,3;4,5,6;7,8,9] 
eig(a)                 %求特征值(求解时,a必须是方阵)
[V A]=eig(a)      %a的特征向量构成V的列向量,A为a的特征值构成的对角矩阵

%size函数    求矩阵的行数列数
size(a)          %返回a行数、列数
size(a,1)       %返回矩阵a的行数
size(a,2)       %返回矩阵a的列数

%find函数    找符合要求的元素的索引值(位置)
A=[1 0 
      4 2
      7 0 ]
[m,n]=find(A>5)      %找大于5的元素的索引值,(m,n)位置的元素大于5
find(A==7)              %返回7的位置(竖着数第几个)
find(A)                     %返回非0元素的位置
find(A,4)                  %返回前4个非0元素的位置
find(A,1,'last')          %返回最后一个非0元素的位置
[a,b,v] = find(A)       %a:非0元素所在的行,b:非0元素所在的行,v:非0元素

%randi()函数  随机生成整数,i代表int
randi([1,9],3,5)        %随机生成范围[1,9]的3*5矩阵
randi(10,2,5)           %随机生成范围[1,10]的2*5矩阵

%rand函数  随机生成范围[0,1]的,均匀分布的随机数
rand(4,5)           %随机生成4*5的矩阵,范围[0,1]
rand(3)             %随机生成3*3方阵
rand(5,1)*10     %随机产生范围[0,1]*10(即[0,10])的5*1矩阵

%normrnd()     产生正态分布的随机数
normrnd(0,2,3,4)        %随机生成均值为0,标准差为2的正态分布的随机矩阵,大小为3x4

%roundn()   四舍五入(0个位 1十位  2百位 -a小数点后a位)
a = 3.1415
roundn(a,-2) 

%pchip()函数  三次hermite插值函数
x=-pi:pi
y=sin(x)
new_x=-pi:0.1:pi
new_y=pchip(x,y,new_x)   %利用hermite插值法对插点new_x求插值new_y

%spline()函数  三次样条插值函数
x = -pi:pi 
y = sin(x)
new_x = -pi:0.1:pi
new_y = spline(x,y,new_x);  %三次样条插值

%corrcoef()函数  相关系数函数
%person相关系数
R=corrcoef(A)       
%返回A的相关系数矩阵,列表示随机变量(指标),行表示观测值(样本)
[R,P]=corrcofe(data)    %R为相关系数表,P为p值
%spearman相关系数
r=corrcoef(rx,ry)          %rx为第一个样本的等级向量,ry为第二个样本的等级向量

%corr()    计算相关系数
corr(X , Y , 'type' , 'Spearman')     %计算X、Y这两个列向量的spearman相关系数
corr(A, 'type' , 'Spearman')           %计算矩阵A列向量的相关系数



%pdf(‘所要用的分布函数名称’,x,参数)             概率密度函数
%cdf(‘所要用的分布函数名称’,x,参数)函数      分布函数
% 'exp' 指数分布      'norm' 正态分布     'unif' 均匀分布     'poiss' 泊松分布
% 'chi2' 卡方分布     'f' F分布     't' t分布

%tpdf(x,参数)       t分布概率密度函数   
%tcdf(x,参数)       t分布分布函数 
x=-4:0.1:4;
px=tpdf(x,28);
Fx=tcdf(x,28);
plot(x,px,'b-',x,Fx,'r--');grid on;
legend('t分布概率密度函数(自由度=28)','t分布分布函数(自由度=28)');

%fpdf(x,参数)       f分布概率密度函数
%fcdf(x,参数)        f分布分布函数
x=-4:0.1:4;
px=fpdf(x,2,8);
Fx=fcdf(x,2,8);
plot(x,px,'b-',x,Fx,'r--');grid on;
legend('f(2,8)分布概率密度函数','f(2,8)分布分布函数');

%tinv(x,参数)   t分布分布函数的反函数 F^-1  
%求解的值为tx(x为下标,如t0.975,0.975为下标)
tinv(0.975,28) 

%normrnd(μ,σ,a,b)   
%前两个为均值、标准差,a、b为矩阵大小,生成a*b大小的数据,数据服从正态分布
normrnd(0,1,3,4)   

%skewness()  求偏度,作用于矩阵时求列向量的偏度,作用与向量时求向量的偏度
a=normrnd(0,1,3,4);   
b=normrnd(0,1,1,5); 
skewness(a)
skewness(b)

%kurtosis()     求峰度,作用于矩阵时求列向量的峰度,作用与向量时求向量的峰度
a=normrnd(0,1,3,4);   
b=normrnd(0,1,1,5);
kurtosis(a)
kurtosis(b)

%jbtest()   Jb检验 只能用于向量,用于矩阵时需采用for循环
[h,p]=jbtest(x,alpha)   
%x为输入数据,alpha为显著性水平,一般为0.05
%h=1代表拒绝原假设,h=0代表接受原假设,p为p值
%h=1时,p<alpha ,h=0时,p>alpha

%graph()                               图论画图
%无向图,无权重
s=[1,2,3,4,4];                      %s中的元素与t中元素一一对应
t=[2,3,1,3,1];
g1=graph(s,t);
figure(1);plot(g1);
figure(2);
plot(g1,'linewidth',2);           %设置线宽为2
set(gca,'xtick',[],'ytick',[]);     %gca为设置坐标轴,tick代表刻度,此代码表示设置x、y坐标轴为空
%无向图,有权重
w=[1,2,3,4,5];                        %w代表权重参数
g2=graph(s,t,w);
figure(3);
plot(g2,'edgelabel',g2.Edges.Weight);
%有向图    digraph()
figure(4);
m=[1,2,3,4];              %m为起始点,n为终点
n=[2,3,4,3];
g3=digraph(m,n);
plot(g3);

%[p,d]=shortestpath(g,start,end,[,'Method',algorithm])        求解最短路径
%p为最短路径经过节点,d为最短路径的总距离
s=[1,2,4,4]; 
t=[2,3,3,1];
w=[1,9,4,5];  
g=graph(s,t,w);
plot(g,'edgelabel',g.Edges.Weight);
[p,d]=shortestpath(g,1,3);
myplot=plot(g,'EdgeLabel',g.Edges.Weight,'linewidth',2);
highlight(myplot,p,'EdgeColor','r');                %高亮
set(gca,'xtick',[],'ytick',[]);   

%distance()    求解图论中各点之间的最短距离矩阵
s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
g = graph(s,t,w);
D = distances(g) 

%neareat()
%[nodeIDs,dist]=nearest(g,s,r)    查找给定半径范围内的节点
%g为图,s为中心节点,r为半径
%nodeIDs为符合条件的节点名称,dist为符合要求的节点距离节点s的距离
s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
g = graph(s,t,w);
[nodeIDs,dist]=nearest(g,2,10)        %2为圆心,10为半径
%nodeIDs为符合条件的节点名称,dist为符合要求的节点距离节点2的距离


%syms  符号创建
syms x y
y=3*x^2+2              %符号方程
syms a                      %符号矩阵
m=[cos(a) sin(a)
        a        -a];
    
%subs()  替换
%(1).subs(s,a,b)      将函数s中的a元素换成b  
%注意:仅仅是展示,如果是为了改变s,需将此赋值给s
syms x t
y=2*x+4
subs(y,x,t)
y
y=subs(y,x,t)
%(2).在前面输入好需要改变的元素,直接输入subs(s)即可
syms x t m n
y=2*x+4*m
x=t
m=n
subs(y)



%simplify()    符号化简
syms a
y=(cot(a/2)-tan(a/2))*(1+tan(a)*tan(a/2))
simplify(y)

%factor()      因式分解
factor(12)
syms x
y=x^3-1
factor(y)

%expand()    多项式展开+化简
syms x
y=(x-1)^2+2*(x-1)+2*x+2
expand(y)   


%collect()      多项式合并
syms x y
z=(x+y)^2*y+5*y*x-2*x^3
collect(z,x)     %对x进行合并
collect(z,y)     %对y进行合并

%expand() symplify()
%collect()  
%factor()

%[z1,z2]=numden()   计算分子分母,z1为分子,z2为分母
%只可作用于符号,想要作用于数字时需使用sym
%作用于数字
sym(2.5);numden(2.5)            %不可行
[z1,z2]=numden(sym(2.5))     %可行
%作用于符号
syms x y
z = 1/x*y+x/(x^2-2*y)
expand(z)
[z1,z2] = numden(z) 

%mupad工具箱 
 y^2/x^2 + x^4/(y^4 + 12*y^3 + 54*y^2 + 108*y + 81) + (2*x^3)/(- x^2*y^2 - 6*x^2*y - 9*x^2 + 2*y^3 + 12*y^2 + 18*y) - (2*y)/(- x^2 + 2*y) + x^2/(x^4 - 4*x^2*y + 4*y^2) - (2*x*y)/(y^2 + 6*y + 9)
%为使结果便于观看,调用mapad工具箱


%diff()    作用于符号时求导,作用于矩阵or向量时求差分
%
%一元函数求导
syms x
y=4*x^3-10*x
diff(y)               %求解一阶导数
diff(y,2)            %求解二阶导数
y1=tan(x)*cos(x)
dy=diff(y1,10)     %10阶求导
simplify(dy)         %化简
%多元函数求偏导
syms x1 x2 x3
y = x1^5*x2+x2*x3-x1^2*x3
dy1 = diff(y,x1,1)       %对x1求一阶偏导
dy2=diff(y,x1,x2)       %先对x1求偏导,再x2求偏导
dy3=diff(y,x2,x1)       %先对x2求偏导,再x1求偏导
dy3-dy2                    %=0
%
%求差分
%作用于向量
a=[4,5,6,3,2,1]
diff(a)          %一阶差分,后一个变量减前一个变量
diff(a,2)       %二阶差分,在一阶的基础上再次差分
%作用于矩阵
a=[1,2,3
     4,3,6
     7,8,9]
 diff(a)          %一阶差分,在行上差分,下一行减上一行
 diff(a,1,1)    %一阶差分,第二个1表示在行上差分,下一行减上一行
 diff(a,1,2)    %一阶差分,在列上差分,后一列减前一列
 


%int()    不定积分与定积分
%
%不定积分
syms x
y=x^2
int(y,x)      %被积函数为y,x为自变量
int(x^2/(1+x^2),x)
%
%定积分
syms x
y=sin(x)
int(y,x,0,2*pi)    %0为下限,2pi为上限
syms x a b
y=exp(x)
int(y,x,a,b)         %a为下限,b为上限
syms x
y=sin(x)^2/x^2
int(y,x,0,+inf)   %下限为0,上限为正无穷
sin(pi/2)^2
%
% 不是所有的函数都可以利用int函数计算出最后的结果,例如:
syms x
y = 1 / exp(x) * log(x+2*x^2+sin(x))
int(y,x,0,4)
此时利用数值计算函数integral()函数
syms x
y =@(x) 1 ./ exp(x) .* log(x+2.*x.^2+sin(x))     
%创建函数句柄,y=@(x)fx,此时所有*or/or^需修改为.*or./or.^
integral(y,0,4)      %0为下限,4为上限


%solve()    方程or方程组求解
%
%单变量方程
%solve(方程,未知数)  未知数只有一个时可以省略
syms x
eqn=2*x==1   %将方程赋值给eqn
solve(eqn,x)
% 因为三角函数是周期函数,如果要得到所有的解,则需要加上条件
syms x
[answ, params, condions] = solve(sin(x), x, 'ReturnConditions', true)
%填true为需要需要周期循环
%answ为解,params为k,conditions为k的含义
%
%多变量方程
syms a b c x
eqn = (a*x^2 + b*x + c == 0);     %ax^2+bx+c=0
ans = solve(eqn, x)    %视x为未知数
ans=solve(x^2==1,x)                 %x^2=1,解为+-1,只需要赋值给一个变量ans即可
[ans1,ans2]=solve(x^2==1,x)    %复制给两个变量时报错(作用于方程组时才可赋值给多个变量)
%
%方程组求解
syms  u v a
eqn = [2*u + v == a
                 u - v == 1];         %将方程组放入向量中
ans=solve(eqn, [u, v])     %将u,v放入向量中,用此向量代表u,v为未知数
ans.u     %调用ans里的u变量的解
ans.v     %调用ans里的v变量的解
[answ_u, answ_v] = solve(eqn, [u, v])
%
%solve()函数可能会警告(求解能力不够,返回近似值)


%vpasolve()     方程组求解,可指定求解区间,求解能力强于solve()
%
%求解指定区间的解(多解时可利用画图看区间找想要的解)
syms x
eqn=sin(x)==x^2-1
vpasolve(eqn,x,[-1,0])      %求解eqn在[-1,0]上的解
%
%对于多项式方程,有求解方法获得所有解,但对于非多项式方程,无固定方法获得所有解
%因此,函数作用于非多项式方程时,若方程有多个解,函数只会返回一个解
%为获得其他解,需设置‘random’,true,通过多次调用以获得不同解
%例.单变量方程
syms x
eqn = sin(x) == x^2 - 1;
vpasolve(eqn, x, 'random', true) 
%例.方程组
syms x y
eqn = [x^2 - 2*x - 3*x*y == 10
                                 y^4 == exp(-2*x/3*y)]      %方程可看为隐函数
[answ_x, answ_y] = vpasolve(eqn, [x, y], 'random', true)
ezplot(x^2 - 2*x - 3*x*y == 10, [-10 10])
hold on
ezplot(y^4 == exp(-2*x/3*y), [-10 10])
[answ_1, answ_2] = vpasolve(eqn, [x, y],[-4 -1;1 5])  % 指定搜索的范围:x位于[-4 -1], y位于[1 5]
double(answ_1);double(answ_2)
plot(answ_1,answ_2,'ko','markersize',10)             %在[answ_1,answ_2]处标记
%answ_1,answ_2为向量,需转化为数值变量才可plot,
%markersize代表设置标记的大小
text(double(answ_1), double(answ_2),'交点')     %在[answ_1,answ_2]标记点进行文本说明


%dsolve()       微分方程的解析解求解,两种书写模式
%第1种   y-y'=2x
%dsolve('方程1','方程2',...,'方程n','初值条件','自变量')     
%初值条件可以不填
%自变量可以指定,不指定时默认为t,同时,默认方程中的原自变量为一个常数dsolve('y-Dy=2*x','x')
dsolve('y-Dy=2*x','y(0)=3','x')    %Dy表示一阶微分,D2、D3表示二阶、三阶微分,y(0)=3为初值条件
%第2种  y-y'=2x
syms y(x)
eqn=( y-diff(y,x)==2*x  )
cond=( y(0)==3  )             %初值条件,条件变量   
dsolve(eqn,cond)

%solver   求解器  微分方程数值解求解
%
%一阶
%以y'-y=-2x,[0,3],y(0)=3为例
%[x,y]=solver('f',ts,x0,options)
%x为自变量,x代表因变量
%solver为求解器,常见有7种,以下为最常用两种,求解时将solver替换成相应的函数
%求解器  (1).ode45  非刚性   (2).ode15s  刚性
%f表示待解的微分方程编写的m函数文件名,且要将微分方程写成  标准形式(很重要)
%需放入已f命名的m文件中,且和运行程序在同一个文件夹
function dy=f(x,y)     %dy为返回值,f为函数名,()内为自变量
    dy=y-2*x               
end
%标准形式:y1'=f1(y1,y2,...,yn,x),y2'=f1(y1,y2,...,yn,x),...,yn'=f1(y1,y2,...,yn,x)
%ts代表x的范围,如[3,4],也可以指定一个向量
%x0代表函数的初始值,如y(0)=3时,x0=3,与ts中范围的第一个值对应
%options为设置选线,设置求解值的精度,可以不填
[x,y]=ode45('f',[0,3],3)
%
%微分方程组
%以y1'=y2*y3,y2'=-y1*y3,y3'=-0.51*y1*y2
%x范围[0,4pi],y1(0)=0,y2(0)=y3(0)=1为例
function dy=f(x,y)        %需放入已f命名的m文件中,且和运行程序在同一个文件夹
    dy=zeros(3,1)                    %初始化dy,将所有的y‘放入一个3*1的矩阵中
    dy(1)=y(2)*y(3)                 %变量y也都在了3*1一个矩阵中,取用时采用矩阵调用的方法调用
    dy(2)=-y(1)*y(3)                %
    dy(3)=-0.51*y(1)*y(2)
end
[x,y]=ode45( 'f',[0,4*pi],[0,1,1]  )     %有三个初始值,因此采用向量的形式存储
%输出结果中,y有三列,分别表示y1、y2、y3
%
%高阶
%以y''=2*x*y'/( 1+x^2 )为例
function dy=f(x,y)                         %f括号内,第一个为自变量,第二个为因变量
    dy=zeros(2,1)                            %将最高阶的视为一阶,低阶的均使用替代法替换放入y向量中
    dy(1)=y(2)                                 %将y'视为一个y,放入y向量中(第一个),为y(1)    
    dy(2)=2*x*y(2)/( 1+x^2 )          %将y(1)代入原式,并进行化简
end
[x,y]=ode45('f',[-2,2],[3,4])
plot(x,y)





%strcat()   合并字符串
strcat('a','b')     %合并字符串

%num2str()  将数字转换为字符串
c=100
num2str(c)      %将数字转换为字符串
c+1


程序结构
%if...else...end
if 表达式
    执行语句;
else 表达式
    执行语句;
end

%for...end
for i=a:b:c    %起点:步长:终点,步长为1可省略为 起点:终点
    执行语句;  %带分号显示所有循环,不带只显示最终结果
end

%while...end
while 表达式
    执行语句;
end

%switch...case...end
switch 表达式
    case 1
        执行语句;
    case 2
        执行语句;
    ....
    otherwise    %可以省略
        执行语句;
end

绘图
%plot()
x=0:0.01:2*pi;
y=1./x;                 %x为向量,所以此时需使用./而非/
figure                   %新建幕布
plot(x,y)
grid on                %添加格线
hold on               %保留原图
plot(x,y,'o')          %用圆圈代替点,散点图
% 线方式: - 实线   :点线   -. 虚点线   - - 波折线 
% 点方式: . 圆点  +加号  * 星号  x x形  o 小圆
% 颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青
title('y=sinx')        %title为标题,单引号为引用字符串
xlabel('x')              %x轴标注
ylabel('y=sinx')     %y轴标注
xlim([0 2*pi])        %x轴范围
ylim([-1 1])           %y轴范围
legend('字符串1','字符串2','字符串3')
% 分别将字符串1、字符串2、字符串3标注到图中,每个字符串对应的图标为画图时的图标


%fplot()   绘制表达式的图形
syms x
fplot(sin(x), [-2 2])        %范围[-2,2]的y=sin(x)图形
hold on
fplot(x^2 - 1, [-2 2])    %范围[-2,2]的y=x^2-1图形
%
syms x
y=x^2+2*x
fplot(y,[-10,10])
ylim([-5,120])
grid on
%
fplot(@(x)x.^2+2.*x,[-10,10])       %不syms x,且直接在fplot()中填运行函数时可这样写,不推荐
%需使用.*or./or.^
ylim([-5,120])
grid on
y=@(x)x^2+2*x
fplot(y,[-10,10])
%画两个,用[]封装
y1=2*x+1
y2=4*x+5
fplot([y1,y2])    %不填范围时,默认x范围为[-5,5]

%ezplot()    隐函数画图
syms x y
eqn = [x^2 - 2*x - 3*x*y == 10
                                 y^4 == exp(-2*x/3*y)]
[answ_x, answ_y] = vpasolve(eqn, [x, y], 'random', true)
% 画图
ezplot(x^2 - 2*x - 3*x*y == 10, [-10 10])
hold on
ezplot(y^4 == exp(-2*x/3*y), [-10 10])


%画线段方法
r=0.5;n=30;
t=r*((n-2)/(1-r^2))^0.5;
x=-4:0.1:4;
px=tpdf(x,n-2);
fx=tcdf(x,n-2);
figure(1);
plot(x,px,'r-',x,fx,'b-');hold on;
legend('p(x)','F(x)');
t0975=tinv(0.975,28);
plot([t0975,t0975],[0,tpdf(t0975,28)],'k-');    %画线段(竖线)
%竖线的起点(下方)为(a,b),终点(上方)为(a,c),对应至plot()中为plot([a,a],[b,c])



你可能感兴趣的:(matlab)