Matlab实验课-第二章 Matlab基础
第一章 线性规划
第二章 Matlab基础
- Matlab实验课-第二章 Matlab基础
- 一、介绍
- 二、Matlab桌面
- 三、Matlab编程
- 四、矩阵操作
- 矩阵
- 冒号表达式 e1:e2:e3 - 五、基于MATLAB的基础数学
- 六、MATLAB曲线拟合
- 七、使用MATLAB进行数据分析
- 八、基础函数
- 九、求解线性方程式
- 十、求解微分方程
- 十一、图形和绘图
一、介绍
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室),软件主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式。
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等。MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
关键词: 矩阵实验室 Matlab数学软件
二、Matlab桌面
界面由三部分组成,分别是当前文件夹、命令行窗口以及工作区。
当前文件夹:访问您的文件
命令行窗口:输入命令
工作区:观察你所输入的或者是文件导入数据
三、Matlab编程
变量:
Matlab中的语法不同于Java、C,其变量的定义和创建可以直接通过赋值来实现,而不需要单独声明,也不需要指定其数据类型. 如果需要使用一个矩阵,可以直接给其元素赋值,不需要指定它的具体维度.
x = 3 % defining x and initializing it with a value
运算:
-
算术运算:
基本算术运算符:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)。点运算符:.*、./、.\和.^。
两矩阵进行点运算是指他们的对应元素进行相关运算,相当于普通的算术运算,要求矩阵同型。 -
关系运算:
关系运算符:<(小于)、<=(小于或等于)、>=(大于或等于)、==(等于)、~=(不等于)。
当两个比较量为标量时,直接比较两个数的大小。若关系成立,关系表达式结果为1,否者为0。 -
逻辑运算:
逻辑运算符:&(与)、|(或)和~(非)。
设两个标量a和b,运算规则:
a&b: a、b全为非零时,运算结果为1,否则为0。
a|b: a、b中只要有一个非零,结果为1。
~a: 当a为零时,运算结果为1;当a为非零时,运算结果为0。
案例:求水仙花数
>> m=100:999;
>> m1=rem(m,10);
>> m2=rem(fix(m/10),10);
>> m3=fix(m/100);
>> k=find(m==m1.*m1.*m1+m2.*m2.*m2+m3.*m3.*m3)
k =
54 271 272 308
>> s=m(k)
s =
153 370 371 407
常用函数
- 操作函数:
- 命令窗口函数:clc:清空命令窗口,使用向上箭头翻看命令。open:打开文件网址(*.url)和变量等。format:设置数据输出格式。format(‘command’)。disp:在commandwindow中显示字符和矩阵。
- 帮助函数:doc:在help浏览器中打开相应帮助页面。help:在MATLAB命令窗口中显示MATLAB的m函数,mdl文件,工具箱等的帮助信息。
- 文件脚本函数:
- function:声明函数
function [out1, out2, ...]=funname(in1,in2,...): <!-- 定义一个名为funname的函数,该函数输入参数为in1、in2、……输出参数为 out1、out2、…… -->
- input:请求用户输入
user_entry=input('prompt') : <!-- 在屏幕上显示prompt作为提示,等待键盘输入,并返回用户输入的 --> user_entry=input('prompt','s'): <!-- 将键入的字符返回为文本变量而非变量名或数值。 -->
四、矩阵操作
矩阵
子矩阵:
A(i,:) %第i行的全部元素
A(;,j) %第j列的全部元素
A(i:i+m,k:k+m) %第i~i+m行内且在第k~k+m列中的所有元素
A(i:i+m,:) %第i~i+m行的全部元素
空矩阵
x=[] %指没有任何元素的矩阵:
改变矩阵的形状:
reshape(A,m,n) %在矩阵总元素保持不变的前提下,将矩阵A重新排成m X n的二维矩阵。
A[1,2,3;4,5,6]
B=A(:) %A(:) 将矩阵A的每一列堆叠起来,成为一个列向量
%B=[1,4,2,5,3,6]`
特殊矩阵
A=zeros(m,n);%零矩阵
B=ones(m,n);%单位矩阵
C=eye(m,n);%幺模矩阵,行列式|det(U)|=1
E=zeros(size(D)); %生成和矩阵D同样位数的零矩阵
A=rand(n,m); %元素满足[0,1]区间上的均匀分布的伪随机分布矩阵
randn(n,m) %产生均值为0,方差为1的标准正态分布随机矩阵。
A=diag(V); %对角矩阵 已知向量生成对角矩阵
V=diag(A); %已知矩阵提取对角元素 列向量!!
A=diag(V,k); %主对角线上面第k条对角线为V的矩阵
A=[1,2,3,4];
v=diag(A,2);
v
v =
0 0 1 0 0 0
0 0 0 2 0 0
0 0 0 0 3 0
0 0 0 0 0 4
0 0 0 0 0 0
0 0 0 0 0 0
magic(n)
%魔方矩阵:其每行、每列及两条对角线上的元素和都相等。对于n阶魔方阵,其元素由1,2,3,…,n2共n2个整数组成。生成一个n阶魔方阵。
A=vander([1;2;3;4])
%范得蒙(Vandermonde)矩阵;最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范得蒙矩阵。
A =
1 1 1 1
8 4 2 1
27 9 3 1
64 16 4 1
%y=x^3+2x^3+3x^1+4
A=[1,2,3,4]
%MATLAB生成伴随矩阵的函数是compan(p),其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后。
compan(A)
ans =
-2 -3 -4
1 0 0
0 1 0
tril(X)%对角线以上元素为0
tril(X,k)%第k条对角线以上为0
tril(ones(4,4),-1)
ans =
0 0 0 0
1 0 0 0
1 1 0 0
1 1 1 0
冒号表达式 e1:e2:e3
省略步长e2,则步长为1
linspace(a,b,n)
<!-- 当n省略时,自动产生100个元素
a:第一个元素
b:最后元素
n:元素总数 -->
五、基于MATLAB的基础数学
矩阵运算
a=magic(3);
b=ones(3);
ans=a-b
C1 = a * b
C2 = a .* b
ans =
7 0 5
2 4 6
3 8 1
C1 =
15 15 15
15 15 15
15 15 15
C2 =
8 1 6
3 5 7
4 9 2
矩阵的行列式
A = [1 2 0; 2 5 -1; 4 10 -1]
det(A)
A =
1 2 0
2 5 -1
4 10 -1
ans =
1
矩阵的逆
A = [1 2 0; 2 5 -1; 4 10 -1]
inv(A)
ans =
5 2 -2
-2 -1 1
0 -2 1
矩阵的特征值
A = [1 2 0; 2 5 -1; 4 10 -1]
eig(A)
ans =
3.7321
0.2679
1.0000
正整数幂
A = [1 1 1;1 2 3;1 3 6]
A^2
ans =
3 6 10
6 14 25
10 25 46
逆幂和分数幂
A = [1 1 1;1 2 3;1 3 6]
A^(-3)
ans =
145.0000 -207.0000 81.0000
-207.0000 298.0000 -117.0000
81.0000 -117.0000 46.0000
逐元素幂
A = [1 1 1;1 2 3;1 3 6]
A.^2
ans =
1 1 1
1 4 9
1 9 36
六、MATLAB曲线拟合
n维曲线拟合
a=polyfit (x, y,n) % x,y 数据点, n= 维度
• x=[5 10 20 50 100]
• y=[15 33 53 140 301]
• p = polyfit(x,y,1)
拟合结果 2.9953x - 2.4264
x =
5 10 20 50 100
y =
15 33 53 140 301
p =
2.9953 -2.4264
插值函数
%{
MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,'method')
其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,
'method'表示采用的插值方法,MATLAB提供的插值方法有几种:
'nearest'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值; 'pchip'立方插值.缺省时表示线性插值
注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。
%}
x = 0:2*pi;
y = sin(x);
xx = 0:0.5:2*pi;
% interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值
y1 = interp1(x,y,xx,'linear');
subplot(2,2,1);
plot(x,y,'o',xx,y1,'r')
title('分段线性插值')
% 临近插值
y2 = interp1(x,y,xx,'nearest');
subplot(2,2,2);
plot(x,y,'o',xx,y2,'r');
title('临近插值')
%球面线性插值
y3 = interp1(x,y,xx,'spline');
subplot(2,2,3);
plot(x,y,'o',xx,y3,'r')
title('球面插值')
%三次多项式插值法
y4 = interp1(x,y,xx,'pchip');
subplot(2,2,4);
plot(x,y,'o',xx,y4,'r');
title('三次多项式插值')
%{
例如:在一 天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为
12,9,9,1,0,18 ,24,28,27,25,20,18,15,13,
推测中午12点(即13点)时的温度.
%}
x = 0:2:24;
y = [12 9 9 10 18 24 28 27 25 20 18 15 13];
a = 13;
y1 = interp1(x,y,a,'spline')
% 结果为: 27.8725
% 若要得到一天24小时的温度曲线,则:
xi = 0:1/3600:24;
% 插值点可以是向量,则返回的也就是对应的向量
yi = interp1(x,y,xi, 'spline');
subplot(1,1,1);
plot(x,y,'o' ,xi,yi);
y1 =
27.8725
七、使用MATLAB进行数据分析
X=[1 2 3 4 5]
mean=mean(x)% 平均值
median=median(x)% 中间值
std=std(x)% 标准差
max=max(x)%最大
min=min(x)%最小
sum=sum(x)%求和
cumsum=cumsum(x)%前n项累加
prod=prod(x)%元素相乘
八、基础函数
三角函数
a=[-pi/2 -pi/4 pi/4 pi/2];
y= sin(a)
y =
-1.0000 -0.7071 0.7071 1.0000
cos
tan
sec
asin (sine inverse)
acos (cosine inverse)
atan
双曲函数
a=[-pi/2 -pi/4 pi/4 pi/2];
y= sinh (a)
y =
-2.3013 -0.8687 0.8687 2.3013
sinh
cosh
tanh
asinh (hyperbolic sine inverse)
acosh (hyperbolic cosine inverse)
atanh (hyperbolic tangent inverse)
指数函数和对数函数
a=[-1 -0.5 -0.25; 0.25 0.5 1];
x=exp(a) %指数函数
y = [0.3679 0.6065 0.7788 1.2840 1.6487 2.7183 ]
a=[ 0.25 0.5 1];
t=log(a) %对数函数
x =
0.3679 0.6065 0.7788
1.2840 1.6487 2.7183
y =
0.3679 0.6065 0.7788 1.2840 1.6487 2.7183
t =
-1.3863 -0.6931 0
九、求解线性方程式
解如下方程:
{
0.4096
x
1
+
0.1234
x
2
+
0.3678
x
3
+
0.2943
x
4
=
0.4043
0.2246
x
1
+
0.3872
x
2
+
0.4015
x
3
+
0.1129
x
4
=
0.1150
0.3645
x
1
+
0.1920
x
2
+
0.3781
x
3
+
0.0643
x
4
=
0.4240
0.1784
x
1
+
0.4002
x
2
+
0.2786
x
3
+
0.3927
x
4
=
−
0.2557
\begin{array}{c} \left\{\begin{array}{l} 0.4096 x_{1}+0.1234 x_{2}+0.3678 x_{3}+0.2943 x_{4} = 0.4043 \\ 0.2246 x_{1}+0.3872 x_{2}+0.4015 x_{3}+0.1129 x_{4} = 0.1150 \\ 0.3645 x_{1}+0.1920 x_{2}+0.3781 x_{3}+0.0643 x_{4} = 0.4240 \\ 0.1784 x_{1}+0.4002 x_{2}+0.2786 x_{3}+0.3927 x_{4} = -0.2557 \end{array}\right. \end{array}
⎩
⎨
⎧0.4096x1+0.1234x2+0.3678x3+0.2943x4=0.40430.2246x1+0.3872x2+0.4015x3+0.1129x4=0.11500.3645x1+0.1920x2+0.3781x3+0.0643x4=0.42400.1784x1+0.4002x2+0.2786x3+0.3927x4=−0.2557
A=[0.4096 0.1234 0.3678 0.2943;0.2246 0.3872 0.4015 0.1129;
0.3645 0.1920 0.3781 0.0643;0.1784 0.4002 0.2786 0.3927];
b=[0.4043;0.1150;0.4240;-0.2557];
x=A\b;
计算结果
x =
0.3327
-1.4121
1.6028
-0.5003
十、求解微分方程
(1) { y ′ ′ + 4 y ′ + 29 y = 0 y ( 0 ) = 0 , y ′ ( 0 ) = 15 \begin{array}{c} \text { (1) }\left\{\begin{array}{l} y^{\prime \prime}+4 y^{\prime}+29 y=0 \\ y(0)=0, y^{\prime}(0)=15 \end{array}\right. \end{array} (1) {y′′+4y′+29y=0y(0)=0,y′(0)=15
y=dsolve('D2y+4*Dy+29*y','y(0)=0,Dy(0)=15','x')
%D2y:y''
%Dy:y'
%y'(n):Dy(n)
y =
3*sin(5*x)*exp(-2*x)
(2) { d x d t = 2 x − 3 y + 3 z d y d t = 4 x − 5 y + 3 z d z d t = 4 x − 4 y + 2 z x ( 0 ) = 1 , y ( 0 ) = 2 , z ( 0 ) = 1 \begin{array}{c} \text { (2) }\left\{\begin{array}{l} \frac{d x}{d t}=2 x-3 y+3 z \\ \frac{d y}{d t}=4 x-5 y+3 z \\ \frac{d z}{d t}=4 x-4 y+2 z \\ x(0)=1, y(0)=2, z(0)=1 \end{array}\right. \end{array} (2) ⎩ ⎨ ⎧dtdx=2x−3y+3zdtdy=4x−5y+3zdtdz=4x−4y+2zx(0)=1,y(0)=2,z(0)=1
eq1='Dx=2*x-3*y+3*z';
eq2='Dy=4*x-5*y+3*z';
eq3='Dz=4*x-4*y+2*z';
[x,y,z]=dsolve(eq1,eq2,eq3,'x(0)=1,y(0)=2,z(0)=1');%如果省略自变量,默认为t
x =
exp(-t)
y =
exp(-t) + exp(-2*t)
z =
exp(-2*t)
十一、图形和绘图
1.matlab的画图
最基本的命令:plot(x,y)
x=[1 6 23]
y=[1 56 2]
plot(x,y)
eg:如果要画y=x^2这条曲线,命令为:x=-4:0.1:4;
z=-3:3 ;指-3到3的所有整数
h=-4:0.1:4; 指 -4到4 间隔0.1取点
y=x.*x;
plot(x,y)
可以换颜色plot(x,y,‘green’),加上小点:plot(x,y,‘green-o’)
横纵坐标相等的指令:axis equal
2.画直方图
x=2000:2007;
y=[10 20 30 40 50 60 70 80];
bar(x,y)
3.三维图像的画法
theta=0: pi/50 :6*pi;
x=cos(theta);
y=sin(theta);
z=0:300;
plot3(x,y,z)
4.补充
保留上一次的图形,使多次绘制的图形呈现在一个坐标里:hold on;**
注意hold on;应该添加在两次plot之间,若有多个图像只需要一句hold on即可
x1=-5:0.1:5;
y1=x1.^2;
plot(x1,y1)
hold on
x1=-5:0.1:5;
y2=x1.^3;
plot(x1,y2) 只有plot是刷新重画需要hold on
给画布添加辅助网格:grid on;
给画布添加标题: title(‘x^2 vs x^3’);
横纵坐标添加标签名:
xlabel('x-axis');%横坐标
ylabel('y-axis'); %纵坐标
同理 z轴标签可以用 zlabel(‘z’)
5.分图
将多个图像同时呈现为一张画布,但不画在一个坐标里:
subplot(a,b,c)/subplot(a,b,[c,d])
abc三个参数表示将画布分为纵向a个坐标;横向b个坐标;
此次绘制在编号为c的坐标上进行 (当第三位参数为[c,d时,表示这个图像占据编号为c、d的两个位置)
再在subplot语句下面使用plot即可
四分图 subplot(2,2,…)这只是定位,后面还是要plot
x1=-5:0.1:5;
y2=x1.^3;
y1=x1.^2;
y3=x1.^4;
y4=x1.^5;
subplot(2,2,1)
plot(x1,y2)
title('1')
subplot(2,2,2)
plot(x1,y1)
title('2')
subplot(2,2,[3,4])
plot(x1,y3)
title('3')
6.绘制曲面:
x = -3:0.1:3;
y = -3:0.1:3;
[X,Y] = meshgrid(x,y); %用【X,Y】表示出所有可能的点(x,y)
Z = X.^2+Y.^2; %注意不可以直接用x,y表示Z,应该先meshgrid一下
surf(X,Y,Z)
顺带一提,前面的指定颜色在曲面绘制函数surf这里不好使哦