%矩阵
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])