本文主要记录一些学习Matlab过程中的一些琐碎的易忘的知识点,以待日后翻阅查看。
快捷键指令
cmd+k 清除指令界面
quit 退出matlab
whos 可以查询迄今为止所有定义的变量的类型、内存空间、是否复数,who 只查看变量名称
clear 清除全部变量,clear x y z 清除制定变量
... 用来续行
format short/long 结果精确到4位小数或者16位小数,format short e 用科学计数法计数,format rat 查找最近结果的比例式
% 注释标记
数学运算符
pi 相当于派
abs 求绝对值
exp(a) 求解e的a次方
sqrt(a) 对a开根号
log(a) 求a的自然对数ln(a),log10(a) 求10为底的a的对数
sin cos tan atan 三角函数随便用
a/b 是右除,意思是a➗b
a\b 是左除,意思是b➗a
- 运算顺序:幂运算优于乘除,右除优于左除
- 在赋值语句后面加
; 可以只起到赋值的效果,不输出 x=20 的赋值结果(不显示在命令窗口)
2 +3i 表示复数就可以用i
.^ 幂次方运算需要在^ 之前加.
pretty(f) 用书面方式显示方程f
易错点
- 看清是直径还是半径
- 当重新定义了自变量x,需要重新运行
y=f(x) ,从而获取新的y值,否则会有矢量大小不匹配的错误
axis([-4,4,-2,2]) 别忘了最外面的括号
- 得到一个大矩阵:
[x, y] = meshgrid(-3:0.1:2, -5:0.1:5) [x, y] = meshgrid(-5:0.2:5)
|
- 矩阵求模:
sqrt(dot(A,A))
- 当出现
error 的时候,先看看有没有定义变量,syms x
.* 和dot 是不同的运算,dot 得出来的结果是两个矩阵对应元素相乘后加起来,因此得到一个数字,.* 没有加起来,因此得出来的是一个矩阵
syms 定义多个变量的时候不需要加,
- 如果极限不存在,为NAN,那么再计算一下左右极限来进一步确定一下
- 渐近线需要先求解出来,再用
plot([3,3],[-10 10],'r--') 画出来,注意中间的定义域和值域的首尾之间没有,
- dsolve里面不能传入连等的条件,
Dx=x(0)=0 这种结果是错误的。
- 积分的时候
int(f) 中的f不需要加引号
线性代数基础补充一点线性代数的基础知识:
向量:u=(u1,u2,u3) v=(v1,v2,v3)
单纯行乘列的矩阵乘法公式: u * v'={u1v1+u2v2+u3v3}
叉积公式:cross(u,v)=u x v = {u2v3-v2u3, u3v1-v3u1, u1v2-u2v1}
点积公式:sum(dot(u,v))=sum(u .* v) = u1v1+u2v2+u3v33=|u|*|v|*COS(U,V)
叉乘(向量积)的意义就是通过两个向量来确定一个新的向量,该向量与前两个向量都垂直
点乘(数量积)的结果就是两个向量的模相乘,然后再与这两个向量的夹角的余弦值相乘。或者说是两个向量的各个分量分别相乘的结果的和。很明显,点乘的结果就是一个数,这个数对我们分析这两个向量的特点很有帮助。如果点乘的结果为0,那么这两个向量互相垂直;如果结果大于0,那么这两个向量的夹角小于90度;如果结果小于0,那么这两个向量的夹角大于90度。
- 行向量
a=[1,2,3] a=[1 2 3] , 列向量 b=[1;2;3]
- 引用向量的个别“单行单列”元素
a(1),a(4:6),a(:) 第三个是显示a向量所有的元素
- 引用向量的个别“多行多列”元素
a(2,3) a(:,2) a(:,2:3) a(1:2,2:3) 第二行第三列,第二列,第二列和第三列,一二行二三列,a(1,:)=[] ,删除第一行
- 复制行创建新矩阵
a([1,2,1],:) ,复制一行放在一行,复制二行放在二行,复制一行放在三行
- 转置运算用
' ,加减乘除直接算
- 向量合并,行向量用
, 合并,列向量用; 合并
a=[0:2:10] 创建从0到10间隔2的等差行向量
a=logspace(0,1,5) 创建从10^0到10^1之间含有5个等差元素的点,注意是圆括号()
length(a),max(a),min(a) 分别求解出- 矩阵的个数,最大值,最小值
- 求模(繁琐版)对于实数
sqrt(sum(a.*a)) 对于复数sqrt(sum(a.*conj(a))) ,conj(a) 是求复数的共轭复数
dot(a,b) cross(a,b) 点乘(对应元素相乘并求和)和叉乘
- 当a是带有复数的矩阵,
' 是转置加共轭,而.' 是单纯的转置
.* 是对应位置元素相乘(行乘行),* 是矩阵相乘(行乘列)
./``.\``.^ 分别是右除,左除和幂次方,换句话说只要是加. 基本都是对应位置元素互相运算
zeros(m),zeros(m,n) eye(m),eye(m,n) 分别是零矩阵和单位矩阵
det(a) 求矩阵a的行列式,助力求解多元一次方程的解
rank(a) 求矩阵a的秩
inv(a) 求矩阵a的逆矩阵,det(a) != 0 的矩阵a才有逆矩阵
rref(A) 求A降行后的梯形矩阵
magic(n) 魔方矩阵(幻方)是一个 n×n 矩阵。矩阵的元素从 1 到 n^2 之间,并且行元素的和等于列元素的和。
[L, U] = lu(A) 对矩阵 A 进行 LU 分解,x = U\(L\b) 用来求方程组的解
求方程的解普通方法:
增广矩阵:
逆矩阵:
线伪逆矩阵求无限解det(a)=0:
LU分解:
绘制图像x=[0:0.1:10]; y=cos(x); plot(x,y),xlabel('x'),ylabel('cos(x)'),gird on,axis equal,legend('cos(x)');
|
绘制图像+加坐标轴标签+网格+坐标轴间隔相同+图例,当更新x的区间或者间隔的时候,需要重新调用y=cosx 来更新y值,否则会报错
fplot('exp(-2*t)*sin(t)',[0, 4]), xlabel('t'), ylabel('f(t)'), title('阻尼弹力')
|
fplot自动计算间隔,画出平滑的曲线
axis ( [xmin xmax ymin ymax] )
|
确定绘图的x轴和y轴的绘图范围,axis auto 让matlab自动确定x轴和y轴的间距
- 输入图例或者坐标轴名称的时候务必注意输入
'' ,不要输入变量作为参数
t = [0:0.02:4]; f = exp(-2*t)*sin(t);??? Error using ==> mtimesInner matrix dimensions must agree.
|
当一个函数是由二个或更多个函数相乘构成,别忘记在相乘时加上“.”以便告诉 MATLAB 我们是对两个矩阵进行相乘。应改为
t = [0:0.02:4];f = exp(-2*t).*sin(t);
|
同时画两条曲线,plot(t,f,'-',t,g,'--')
- 实线’-‘虚线’—‘虚点线’-.’点线 ‘:’
- 同时画两条实线,并且确定两条实现的颜色和虚实
plot(x,y,'r',x,z,'b--')
- 画平行于坐标轴的直线
plot([0,0],[-1,2],'--') 不可以用plot(0,[-1,2],'--')
对方程画图%ezplot里面的参数需要加'' ezplot('x^2 - 6*x - 12') d = 'x^2 - 6*x - 12';ezplot(d); %限定图像定义域 ezplot(d,[x1,x2]); %限定图像的定义域和值域 ezplot('x+3', [-4, 4, -2, 2]) %错误,ezplot里面没有等号 ezplot('x+3=0') %正确 ezplot('x+3')
|
MATLAB 颜色说明符
颜色 |
key |
黑色 |
k |
白色 |
w |
红色 |
r |
黄色 |
y |
绿色 |
g |
蓝色 |
b |
青色 |
c |
洋红 |
m |
- 绘制子图使用命令
subplot(m, n, p) ,这里 m 和 n 告诉 MATLAB 产生的产生的子图有 m 行和 n 列,p 用来告诉 MATLAB 我们所要贴上去的 某个已经绘制的图形窗口在第几个块中,记住,要先subplot开辟空白表,再在plot画上图像
- 产生x数集的命令:
x = linspace(a,b) :MATLAB 会在 a 到 b 间取出均匀分布的 100 个点(或行向量),如果写成x = linspace(a,b,n) :那么 MATLAB 会在 a、b 之间取出均匀分布的 n 个点。
- 在两条
plot 命令之间加hold on 可以使得两个图像重叠,而不必清除原有重新绘制
- 将图像上特定的点用红色圆圈圈起来
plot(double(s(1)),double(subs(f,s(1))),'ro')
绘制极坐标曲线:theta = [0:pi/90:2*pi]; r = a*theta; polar(theta,r), title('阿基米德螺线');
|
绘制双log曲线:
loglog(x,y) ,它产生的图像x,y轴均使用对数值
semilogx(x, y) ,它产生的图象 x 轴使用对数值, y 轴仍然用直接值;
- 相应地,
semilogy(x, y) 产生的图象 y 轴使用对数值,x 使用直接值。
绘制离散图(折线图)months=['J';'F';'M';'A';'M';'J';'J';'A';'S';'O';'N';'D']; N=20; x=(1:N); y=ceil(12*rand(N,1)); plot(x,y); set(gca,'YLim',[0 13],'YTick',1:12,'YTickLabel',months)
|
YLim 限制纵坐标的总范围0~13
YTick 月份对应点在总范围中的部分1~12
YTickLabel 纵轴的文字标定值
绘制离散图(柱状图)x = [1:5];y = [50,98,75,80,98]; bar(x,y), xlabel('学生'),ylabel('分数'), title('期末测试') %水平的柱状图 barh(a,b),xlabel('学生人数'),ylabel('考试分数') %三维柱状图 bar3(a,b),xlabel('考试分数'),ylabel('学生人数')
|
%默认是非分组的柱状图 bar(x, y, grouped); %设置分组柱状图 bar(x, y, stacked); x = [54.5,64.5,74.5,84.5,94.5]; garcia= [0; 3; 18; 13; 10]; simpson= [3; 5; 20; 10; 5]; smith= [1; 2; 15; 17; 8]; y = [garcia simpson smith]; bar(x,y),xlabel('考试分数'),ylabel('学生人数'),legend('加西亚','辛普森','史密斯')
|
绘制离散图(针头图)plot(t,f),xlabel('时间(秒)'),ylabel('弹簧响应') %替换为: stem(t,f),xlabel('时间(秒)'),ylabel('弹簧响应') %填充绿色菱形标记: stem(t,f,'--dg','fill'),xlabel('时间(秒)'),ylabel('弹簧响应')
|
等高线图(二维+三维)[x,y] = meshgrid(-5:0.1:5, -3:0.1:3); %[x,y] = meshgrid(-2:0.1:2);如果两个变量的取值范围相同,可以只写一次z = x.^2 + y.^2;[C,h] = contour(x,y,z);%c是等高线矩阵,h是等高线句柄 %给等高线加上图例set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2) %变成三维图像,30指的是等高线的密度 contour3(x, y, z, 30); %装扮图像 surface(x,y,z,'EdgeColor',[.8 .8 .8],'FaceColor','none') grid off;view(-15,20);%摄像机沿着x,y轴移动
|
解释set指令的参数:contour(x,y.z) :(x,y)是平面z=0上点的坐标矩阵,z为相应点的高度值矩阵。
[C,h]=contour(x,y,z) :C 为返回等值线矩阵,h为图形对象的句柄向量,也就是代表所绘制图形;
set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2) h:图形对象;
ShowText :显示等高值标签命令,后面设置’on’,就是打开显示标签;
TextStep :标签的步长;
LevelStep :等高线步长;
get(h,'LevelStep') :得到等高线步长的值。
这个命令就是从第一个等高线开始,每隔一个给等高线贴上标签。
三维图像%绘制圆柱体 t = 0:pi/10:2*pi;[X,Y,Z] = cylinder(1+sin(t));surf(X,Y,Z); axis square; %普通三维图像 mesh(x,y,z),xlabel('x'),ylabel('y'),zlabel('z') %表面颜色过渡的图像 surf(x,y,z),xlabel('x'),ylabel('y'),zlabel('z') %底部有等高线映射的图像 surc(x,y,z),xlabel('x'),ylabel('y'),zlabel('z') %图象中的阴影可以设置为flat、interp和faceted。 %flat 是用同一颜色为每个网格进行着色并隐藏网格线 %而 facted 则显示网格 %使用 interp 是 告诉 MATLAB 使用颜色插值的办法进行着色,因此显得非常平滑 surfl(x,y,z),xlabel('x'),ylabel('y'),zlabel('z');shading interp;%将图像着色为灰色colormap(gray);
|
mean(a) 行向量可以求得每一个行元素的平均值,mean(A) 矩阵可以求得每一列的平均值
median(raw) 中位数
std(raw) 标准差
size(A) 判断矩阵的大小
~= 是不等于
disp('错误:数据必须具有相同的维数。') 自定义错误出现时,屏幕上显示的语句
逻辑控制if_else判断myaverage.m 文件的内容(文件名与函数名务必相同,否则无法调用)
function ave = myaverage(x,N) sizex = size(x); sizeN = size(N); if sizex(2) ~= sizeN(2) disp('错误:数据必须具有相同的维数。') else total = sum(N); s = x.*N; ave = sum(s)/total; end end
|
for循环for index = start : increment : finish statements
end
|
input输入
while循环while condition statements
end
|
switch_case语句switch expression case 1 do these statements case 2 do these statements case n do these statements end
|
解方程一元一次方程%'a'的意义是标定未知量,这样剩下的一个字母被认为是常量 %solve('a*x + 5=0','a')和solve('a*x + 5','a')是一样的,=0是默认值 solve('a*x + 5','a') MATLAB 响应输出为: ans = -5/x
|
一元二次方程s = solve('x^2 - 6*x - 12 = 0') s= 3 + 21^(1/2) 3 - 21^(1/2) %这两个值可以用s(1),s(2)取到 d = 'x^2 + 9*x -7 = 0'; solve(d); %强制转换格式,可以将多项式转化为小数 x = double(s(1))
|
二元一次方程组s = solve('5*x + 4*y = 3','x - 6*y = 2'); %使用点句号“.” 我们就可以取得相应的 x 和 y 值 s.x s.y
|
方程的展开(多个多项式相乘)%定义变量x syms x
expand((x - 1)*(x + 4))
|
方程的合并和化简(分配多项式)collect(x*(x^2 - 2)) %经测试,可以被expand代替
|
因式分解factor(112)%分解数字 factor(x^2 - y^2) factor([x^2-y^2, x^3+y^3])%多个因式同时分解
|
多项式相除%多项式相除 syms x; simplify((x^4-81)/(x^2-9)) ans = x^2+9 %log函数化简 syms x; simplify(exp(2*log(3*x))) ans = 9*x^2 %三角恒等式 syms x; simplify(cos(x)^2-sin(x)^2) ans = 2*cos(x)^2-1 simplify(cos(x)^2+sin(x)^2) ans = 1
|
使用指数和对数函数求解方程eq = 'log10(x) - log10(x - 3) = 1'; s = solve(eq);
|
泰勒级数展开式taylor(sin(x),'order',20)//20为展开的项数
|
极限计算独立变量趋近于0%limit(f) limit((x^3 + 1)/(x^4 + 2))
|
独立变量趋近于非0%limit(f, a) limit(x + 5,3)
|
独立变量趋近于无穷大(小)%limit(f,inf) %limit(f,-inf) limit(sqrt(x^2+x)-x,inf)
|
左极限和右极限a = limit(f,x,3,'left') b = limit(f,x,3,'right')
|
求导数%一阶导数 diff(f) %n阶导数 diff(f,n)
|
检查等式两边的式子是否相等
将常数代入方程得到结果subs(h,2) %将多个常数代入求得方程的结果 subs(F,{b,x},{2,4})
|
求解符号微分方程
%dsolve('eqn', 'cond1', 'cond2', ...),cond1等是初始条件 dsolve('Dy = y*t/(t-5)','y(0) = 2') dsolve('D2y - y = 0','y(0) = -1','Dy(0) = 2')
|
常微分方程(ODE)求解s = dsolve('Dy=a*y') s = C1*exp(a*t) C1 = 2; a = 4; %将常数代入字母为系数的方程 f = subs(s) f= 2*exp(4*t) %或者 f = subs(s,'C1',2);
|
方程组和相平面图
设置曲线图像细节%调用 findobj 命令告诉 MATLAB 查找图象中的线条,然后使用 set 命令为线条设置颜色(最后所有的line都变为红色) ezplot(s.X),set(findobj('Type','line'),'Color','r') %调用 get 命令,它将返回当前图形对象的句柄 h=get(gca,'children'); %使用下面的命令改变它(单独的一条line变为虚线) set(h(1),'linestyle','--')
|
常微分方程(ODE)的数值解使用ODE23和ODE45求解一阶方程我们创建一个.m文件,输入下面的内容。
function ydot = eq1(t,y) ydot = cos(t);
|
通过调用ODE32/ODE45函数来求解ODE(产生的是t和对应的y的数组元素)
%[t,y] = ode23('func_name', [start_time, end_time], y(0)) [t,y] = ode23('eq1',[0 2*pi],2); %[t,y] = ode45('func_name', [start_time, end_time], y(0)) [t,w] = ode45('eq1',[0 2*pi],2)
|
首先我们产生一个表示解析解的数集,然后我们可以比较:
使用下面的命令来产生图象:
plot(t,y,'o',t,f),xlabel('t'),ylabel('y(t)'),axis([0 2*pi 0 4]) plot(t,w,'o',t,f),xlabel('t'),ylabel('y(t)'),axis([0 2*pi 0 4])
|
ODE23
ODE45
ODE23与ODE45区别:
- 如果误差对你非常重要,那么使用ode45将是明智的选择,ODE45误差小
- 根据数值画出的点比前面我们从ode32得到的密度要高
带有扰动的常微分方程
function ydot = eq2(t,y) global tc w F = t*exp(-t/tc)*cos(w*t); ydot = 5*(F-y);
|
tc = 0.1; w = 6.28; final_time = 1.0; [t,y] = ode45('eq2',[0 final_time],y0); plot(t,y),xlabel('t'),ylabel('y(t)'),axis([0 0.7 0 0.015]) plot(t,y,t,F,'--'),xlabel('t'),ylabel('y(t)'),axis([0 0.7 0 0.05])
|
二阶方程求解
function xdot = eqx(t,x); %创建数组储存数据 xdot = zeros(2,1); xdot(1) = -x(1)^2 + x(2); xdot(2) = -x(1) - x(1)* x(2); [t,x] = ode45('eqx',[0 10],[0,1]); plot(t,x(:,1),t,x(:,2),'--'),xlabel('t'), axis([0 10 -1.12 1.12])
|
二阶方程求解需要把这个方程换成一阶方程组
积分计算INT命令%int(f) %int(f, v) 语法来调用 int,其中 f 就是要积分的函数,而 v 是积分变量 syms x; int(x)
|
对于计算积分的读者来说,不要忘记在你的答案后面带上积分常量
定积分
or
F = int(x); subs(F,x,3)-subs(F,x,2)
|
多重积分
int(int(int(x*y^2*z^5,x),y),z)
|
数值积分调用 trapz(x, y)函数 MATLAB 可以进行梯形积分
%等分次数越多,误差越小 x = linspace(0,2,10); y = x.^2; a = trapz(x,y); a= 2.6831
|
正交积分MATLAB 有两个命令 quad 和 quad1 可以用来实现正交积分。这种类型的方法基于使用 二次函数代替矩形更能接近曲线下方面积的原理(使用高阶的多项式还能够得到更精确的结 果)。辛普森法则(Simpson’s rule)是把积分区间分成偶数段,相邻两段下面的面积用不同 的二次函数近似表示。quad 函数采用适应辛普森法则的逼近方法进行数值积分。要使用 quad,把被积的函数传递给它,后面跟着积分区间。 quadl 函数采用洛巴托(Lobatto)积分法。这是一种适应正交积分更加灵活复杂的类型, 查阅 MATLAB 的帮助以便获得更多的信息。
quad 和 quadl 函数的不利方面是无法对点集进行积分。
数据拟合%n 是我们要 MATLAB 求出的多项式的次数 %对于 y = mx + b 形式的方程,我们把 n 设为等于 1, %因此调用的语句将是 polyfit(x, y, 1) %n次多项式有n+1个常数系数 polyfit(x, y, n) 如果我们使用 p = polyfit(x, y, n)调用 polyfit,第 j 个系数的引用写成 p(j) m = p(1) b = p(2)
|
指数函数的拟合
拟合程度当r^2接近1,或者,RMS小于1,则说明拟合程度比较好。
%其中,AVE是原有的数据,MEAN是原有数据的平均值,w是拟合数据,S和A公用的数据是AVE,即原有数据 S = sum((Ave - MEAN).^2) A = sum((w - Ave).^2) r2 = 1 - A/S
|
另一种我们可以用来体现拟合程度的方法是计算一个称为均方根(Root-Mean-Square,RMS)误差的数 值,要用过这种方法来评估多项式与实际数据的拟合程度,我们可以使用下面的命令:
w = m*sqft + b d = price - w; N = 10; d2 = d.^2; RMS = sqrt((1/N)*sum(d2))
|
可以使用 find 命令提问与数据有关的问题。例如,温度小于 80 度是在什么时候
|