matlab 与科学计算
DESCRIPTION
MATLAB 与科学计算. 一、前言. MATLAB : matrix laboratory 的缩写,矩阵实验室的意思。一开始它是一种专门用于矩阵数值计算的软件。自 MATLAB4.0 版本问世以来,该软件成为最具有吸引力,应用最为广泛的科学计算语言。我们这个课就拿 MATLAB6.1 版本来讲。( 6.x 版本大同小异). 学习该软件的必要性: 目前, MATLAB 软件不仅走入企业、公司和科研机构,而且在高等院校也是从大学生到博士生都必须掌握的一项基本技能,是必不可少的计算工具,。 MATLAB 功能: 数值计算、符号运算和图形处理。. - PowerPoint PPT PresentationTRANSCRIPT
MATLAB 与科学计算
一、前言• MATLAB : matrix laboratory 的缩
写,矩阵实验室的意思。一开始它是一种专门用于矩阵数值计算的软件。自 MATLAB4.0 版本问世以来,该软件成为最具有吸引力,应用最为广泛的科学计算语言。我们这个课就拿 MATLAB6.1 版本来讲。( 6.x 版本大同小异)
• 学习该软件的必要性:目前, MATLAB 软件不仅走入企业、公司和科研机构,而且在高等院校也是从大学生到博士生都必须掌握的一项基本技能,是必不可少的计算工具,。
• MATLAB 功能:数值计算、符号运算和图形处理。
• 学习它的意义:随着计算机科学和计算软件的发展,数学系学生必须掌握一门好的计算软件。这是我们就业、继续身造或做科研工作所要用到的。是当代大学生必备的一项技能。
• 其它计算软件: MATHEMATIC(数学分析问题的计算); IDL(航天、控制), FOETRAN 、BASIC (科学计算)。可以说一个人掌握了一门计算软件,再学习其它计算软件很容易。
• MATLAB 桌面平台: (1) 主窗口:整个大的窗口(其它
几个窗口都包括在其中)( 2 )命令窗口( command win
dow ):》为运算提示符,表示MATLAB 在准备状态。当在提示符后输入一段运算式并按回车键后,就给出计算结果
( 3 )历史窗口 (command history) :保留命令历史记录,这方便于使用者查询。双击历史窗口中的某一行命令,即可在命令窗口中执行该命令。
( 4 )当前目录窗口( current directory ):在当前目录窗口中可显示或改变当前目录,也可以显示当前目录下的文件,并提供搜索功能。
(5) 发行说明书窗口( launch pad ) : 用来说明用户所拥有的 Mathworks 公司产品的工具包、演示以及帮助信息。
( 6 )工作间管理窗口( workspace ) : 显示目前内存中所有的 MATLAB 变量的变量名、数学结构、字节数及其类型。
•命令窗口查询帮助: help+ 函数名,当用户知道函数名字,而不知道其用法时,用 help 命令可以去了解此函数的用法。
如: help inv
•MATLAB 标点的含义:( 1 )分号;……区分行以及取消
运行显示等。例: A=[1,2;3,4] 与 A=[1,2;3,4] ;的区别。
(2) 逗号,……区分列及函数参数分隔符等。例: =[1,2;3,4] , B=[1,4,3;3,2,1;4,5,6]
(3) 小括号():指定运算过程的先后次序等。例:
x=0.5; y=sin(x)/(2+cos(x)) z= sin(x)/2+cos(x) (4) 方括号 [ ] :矩阵定义标志等。见上。
( 5 )续行号…:例: y=sin(x)/(2+cos(x))也可写为 y=sin(x)… /(2+cos(x))
(6) 百分号 % :注释标记,该行 %以后的语句不执行。例
% 线性规划程序%a=0.5;b=sin(x);% 正弦函数
( 6 )等号 = :赋值标记。见上。( 7 )单引号’ ’:字符串表示
符,单引号里面的内容为字符串。单引号一定在英文状态下输入例:
a='xingtai college'
( 8 )冒号’:’:有多种应用功能,学习过程中注意。如:选取矩阵的所有行、列;矩阵定义
二、数值计算变量: MATLAB 语言不需要对所使用的变量进行事先声明,也不需要指定其类型,它会自动根据所赋予变量的值或所进行的操作来确定变量的类型。如果变量重新赋值将会用新值代替旧值。如: a=1 b=0.5 c=a*b c=3
• 变量命名的规则:( 1 )变量名区分大小写;( 2 )变量名长度不能超过 31 位;( 3 )必须以字母开头,变量名中
可包含字母、数字、下划线,但不能使用标点。
• 常量: MATLAB 中有些预定义的变量,这些特殊的变量称为常量。常用到的有:
i,j: 虚数单位; pi: π ; NaN: 表示不定值 , 比如 0/0 ; inf: 无穷大( infinit ),比如 1/0 。
• 算术操作符: + 、 - :加,减;可以通用。 * , ^,\ , / :分别为矩阵乘,乘方,左除,右除;
.*, .^ , .\ , ./ :分别为数组乘,乘方,左除,右除;此时向量的运算不会满足矩阵的运算法则。注意矩阵的加点运算结果。
如:a1=2;
a2=[1,2,3,4];
b2=[4,3,2,1];
a1+a2
a1-a2
a2-a1
a1*a2
a1./a2 %a1/a2 是错误的写法a1.\a2
a2-b2
a2+b2
a2.*b2 %a2*b2 是错误的写法a2./b2
b2./a2
a2.\b2
例 已知水的黏度随温度的变化公式为 μ=μ0/ ( 1+at+bt2 )其中 μ0=1.785×10-3 ,
a=0.03368,b=0.000221,
求水在 0 , 20 , 40 , 80℃ 时的黏度。
程序如下:
miu0=1.785e-3;
a=0.03368;
b=0.000221;
t=0:20:80
miu=miu0./(1+a*t+b*t.^2)
运行后的结果为 :miu =
0.0018 0.0010 0.0007 0.0005 0.0003
• 字符串:字符串的约定( 1 )字符串用单引
号括起来;( 2 )字符串的每个每个字符(包括空格)都是字符数组的一个元素 .
例 s=‘xingtai college’
f=‘sin(x)’ 是字符串( char array )
• 向量的生成:( 1 )直接输入:如 a=[1,2,5,3]
(2) 利用冒号表达式生成:如: b=[2:2:10], 此时 [ ] 可省略,步长为 1 时,步长可省略。第一个数为首元素的值,第 2 个数为步长或差值,第三个数为尾元素的限值,不能超过这个值。如 b=2;2:11 等价于 b=[2:2:10]
( 3 )线性等份向量生成: y=linspace(x1,x2,n), 生成 n 维向量,使得 y(1)=x1,y(n)=x2 。如: y=linspace(1,100,6) 。
向量的基本运算( 1 )向量的加减:用 + 、 - 。同维向量才可以加、减。相应元素加减
( 2 )向量与数可以加、减。用+ 、 - 。数与向量的每个元素进行作用。
( 3 )向量与数可以相乘。用 * 。 (4) 向量与数可以相除。向量 / 数,
数 ./ 向量。( 5 )两个向量点积。必须是同维向量。用 dot(a,b) 。
( 6 )两个向量叉积。 cross(a,b),a,b 必须有是 3 维且次序不能颠倒 , 。
( 7 )混合积。由以上两个函数实现。 dot(a,cross(b,c))
• 矩阵的生成:(1) 直接输入 : 如 :a=[1,3,4;4,3,2].
(2) 创建 M 文件输入大矩阵 : 当矩阵很大时 , 直接输入显得很笨 , 出错不易修改 . 我们可以编写一个M 文件 ,M 文件的扩展名必须是m.
例 编写一个名为 matrix.m( 名字自己随便起 ) 的 M 文件如下 :
%matrix.m
mat=[1,2,3,3;3,4,5,1;3,2,1,4;8,9,7,5]
在命令窗口中输入 matrix, 就会运行该文件 . 查看矩阵的结构可用 size(mat).
•矩阵运算 : (1) + 、 - 、 * :加、减、乘运算。( 2 )矩阵的除法有两种形式 : 左除“ \” 和右除‘ /’. 右除是先计算逆再做乘法 ; 而左除不计算逆直接进行除法运算 , 这样可避免奇异矩阵无法求逆带来的麻烦 .
如 :A=[1,2,3,2;3,2, 4,1;3,1,5,6;2,5,3,2], b=[1;3;2;1], 求方程组 Ax=b 的解 . 由于 rank(A)=rank(B)=4(B 为增广矩阵 ), 所以有唯一解 ,x=A\b, 或 x=inv(A)*b.
•又如 : A=[361,625,961,1444,1936;1,1,1,1,1], b=[1;1]‘, 求方程组Ax=b 的解 . 由于 rank(A)=rank(B)=2(B 为增广矩阵 ), 所以有无穷多个解 ,MATLAB 中用除法解方程组时所得到的解是所有解中范数最小的一个 x=A\b 。
( 3 )矩阵与常数间的运算 :+ 、 - 、* 运算是数与矩阵的每个元素进行运算,除法运算,只能常数做除数。
( 4 )矩阵求逆: inv(A) 为 A 的逆 (inverse).
( 5 )求转置矩阵 :A'.( 6 )求矩阵的行列式 :det(A) ,(d
eterminant 是行列式 ) 。( 7 )矩阵幂运算:用 ^. 如 A^3,
表示 A*A*A 。( 8 )矩阵指数运算: expm(A),A
为方阵。
( 9 )矩阵对数运算 :logm(A),A为方阵。
如: a=rand(3) ; % 成生一个3 阶随机矩阵
b=expm(a) c=logm(b)
( 10 )矩阵开方: sqrtm(a). (11) 求矩阵呢的秩: rank(a).•特殊矩阵的生成:( 1 ) zeros(n): 生成 n×n 阶 0 矩
阵。( 2 ) zeros(m,n): 生成 m×n 阶0 矩阵。
( 3 ) zeros(size(a)): 生成与 a 阶数相同的 0 矩阵。
( 4 ) eye(n): 生成 n 阶单位矩阵。( 5 ) eye(m,n): 生成 m×n 阶单位矩阵。
( 6 ) eye(size(a)): 生成与 a 阶数相同的单位矩阵。
( 7 ) ones(n): 生成 n 阶全 1 矩阵。
( 8 ) ones(m,n): 生成 m×n 阶全 1 矩阵。
( 9 ) ones(size(a)): 生成与 a 阶数相同的全 1 矩阵。
( 10 ) rand(n): 生成 n×n 阶随机矩阵,其元素值在 0 和 1 之间。
( 11 ) rand(m,n): 生成 m×n 阶随机矩阵。
( 12 ) rand :生成一个随机数。
( 13 ) rand(size(a)): 生成与 a阶数相同的随机矩阵。
矩阵的特殊操作:( 1 )变维操作 reshape(a,m,n):把矩阵 a 变成 n×n 阶矩阵。如
a=1:12,reshape(a,2,6), reshape(a,3,4) 。注意变维操作要保证元素个数一致。
例 s=1:12; c=zeros(3,4); c(:)=s(:); % 符号“ :” 表示变维操作,这两个矩阵必须预先定义维数,结果 c 取的是 s 的元素。
( 2 )对角元素抽取 diag(a,k)(注: diagonal 为对角线的意思):抽取矩阵 a 的第 k 条对角线的元素作为向量, k=0 时为主对角线, k 为正值时为上方第 k条对角线, k 为负值时为下方第k 条对角线。
diag(a) 相当于 diag(a,0). 例 a=rand(3); v=diag(a)
说明:如果 b 是一个向量,则 diag(b) 为对角矩阵,其对角线元素为b 的元素。如: b=1:3,diag(b).
( 3 ) tril(a) ( 注: triangle low):提取矩 a 的主下三角。
( 4 ) tril(a , k): 提取矩 a 的第k 条对角线下面部分。 k=0 时为主对角线, k 为正值时为上方第 k条对角线, k 为负值时为下方第k 条对角线。
( 5 ) triu(a , k) ( 注: triangle up) : 提取矩 a 的第 k 条对角线上面部分。
•逻辑运算符:( 1 ) = = :等于。( 2 ) ~= :不等于。( 3 )〈:小于。( 4 )〉:大于。
( 5 )〈 = :小于等于。( 6 )〉 = :大于等于。( 7 ) &: 逻辑与。( 8 ) | :逻辑或。( 9 ) ~ :逻辑非。
说明: ① 在关系比较中,若双方为同维
数组(矩阵),则比较的结果也是同维数组(矩阵)。它们的元素有 0 和 1 组成。对应位置上的元素满足比较关系时为 1 ,否则为 0 。当常数与数组(矩阵)比较时,结果与数组(矩阵)同维,其值依次为常数与数组元素依次比较的结果。例:
a=[1:3;4:6;7:9]x=5y=x<=a运行结果y = 0 0 0 0 1 1 1 1 1
② 逻辑运算的意义是: 与:当运算双方的对应元素值都
为非 0 时,结果为 1 ,否则为 0 ; 或:当运算双方的对应元素值有
一非 0 时,结果为 1 ,否则为 0 ; 非:当运算数组(矩阵)的对应
位置上的元素值为 0 时,结果为1 ,否则为 0 。例
a=[1,2;3,2]; b=[0,1;3,0]; d=a&b e=a|b f= ~b③ 算术运算、比较运算、逻辑与
或非运算的优先级:先比较运算、再算术运算、最后逻辑与或非运算。
• 常用的一些函数 ( 直接调用 ):
sin(x): 正弦函数 (sine); 例 :
x=-pi:0.1:pi;y=sin(x);plot(x,y)
asin(x): 反正弦函数 (anti-sine);
cos(x): 余弦函数 (cosine);
acos(x): 反余弦函数 (anti-cosine);
tan(x): 正切函数 (tangent);
atan(x): 反正切函数 (anti-tangent);cot(x): 余切函数 (cotangent);acot(x): 反余切函数 (anti-cotange
nt);sec(x): 正割函数 (secant);asec(x): 反正割函数 (anti-secant);csc (x): 余割函数 (cosecant);acsc (x): 反余割函数 (anti-coseca
nt);
sinh(x): 双曲正弦 (hyperbolic sine);
asinh(x): 反双曲正弦 (anti-hyperbolic sine);
cosh(x): 双曲余弦 (hyperbolic cosine);
acosh(x): 反双曲余弦 (anti-hyperbolic cosine);
tanh(x): 双曲正切函数 (hyperbolic tangent);
atanh(x): 反双曲正切函数 (anti-hyperbolic tangent);
coth(x): 双曲余切函数 (hyperbolic cotangent);
acoth(x): 反双曲余切函数 (anti-hyperbolic cotangent);
exp(x):e 指数函数 (exponent);
log(x): 自然对数函数 (logarithm);log10(x): 以 10 为底的对数 ;log2(x): 以 2 为底的对数 ;sqrt(x): 平方根函数 (square root);abs(x): 求模函数 (absolute)Inline(‘f 的表达式’ ) :自定义函数。函数的自变量为函数中出现的变量。自变量顺序安字母表顺序。Inline(‘f 的表达式’,‘变量 1’ , ‘变量 2’ , ‘变量 3’ ,…… ) :与上面的区别是它安变量表的给出的顺序规定函数的变量顺序。如: g = inline(‘sin(2*x*y +z)’) , 表示: g(x,y,z) = sin(2*x*y +z) g = inline(‘sin(2*x*y +z)’, ‘x’, ‘z’,‘y’) 表示: g(x,z,y) = sin(2*x*y +z) ;g1(1,2,3) 与 g2(1,2,3) 的意义不同。
• 多项式表示方法: 在 MATLAB 中多项式 p(x)=anxn+
an-1xn-1+…+a0 是以向量 p=[an ,an-1,…,a0] 的形式储存的 .
(1) 系数向量直接输入 : 例输入多项式 x^3-5x^2+6x-33.
p=[1,-5,6,-33];
poly2sym(p) %polynomial 多项式 , 将系数向量表示成符号多项式
(2) 矩阵的特征多项式输入 : 例 a=[1,2,3;2,3,4;3,4,5]; p=poly(a);% 求 a 的特征多项式系
数向量 p1=poly2sym(p); % 即为 a 的特征多项式
(3) 由根创建多项式 : 例 root=[-5,-3+4i,-3-4i];% 是某个多
项式的根 p=poly(root) % 求相应的多项式
的系数向量P1=poly2sym(p) % 将多项式系数向量表示成符号多项式
• 多项式运算 :
(1) 求多项式的值 : 例 p=[1,11,55,125];
a=1.2
b=[1,2;2,3]
polyval(p,a) %polynomial value 求多项式在 1.2 的值
polyvalm(p,b) % 多项式在 b 的值
(2) 求多项式的根 : 例求多项式 2x^4-5x^3+6x^2-x+9=0 的所有根 . p=[2,-5,6,-1,9] roots(p) % 得到多项式的根(3)factor: 因式分解。例 syms x factor(x^9-1) 结果: ans =(x-1)*(x^2+x+1)*(x^6+x^3+
1)
factor(sym(‘100’))% 把整数100进行素数分解 . 结果: (2)^2*(5)^2
( 4 ) expand(s): 多项式展开 ,s 可为多项式、多项式向量和矩阵。例 expand(sym('(x+1)^3'))
结果: ans =x^3+3*x^2+3*x+1
expand(sym('sin(x+y)'))
结果: ans = sin(x)*cos(y)+cos(x)*sin(y)
( 5 ) collect(s): 对默认的变量合并同类项。
collect(s,v): 对变量 v 合并同类项。
s 可为符号多项式、多项式向量和矩阵例 collect(sym('x^2*y+y*x-x^2-2*y*x'))
collect(sym('x^2*y+y*x-x^2-2*y*x'),x)
collect(sym('x^2*y+y*x-x^2-2*y*x'),y)
(6)simple(s): 符号表达式简化, s 可为符号多项式、多项式向量和矩阵。
例 f=simple(sym('sin(x)^2+cos(x)^2'))
结果: f = 1 g=simple(sym('x^3+3*x^2+3*x+1'))
结果: g =(x+1)^3
(7) 多项式乘除运算分别用 conv 和 deconv: (convolution,deconvolution)
例 p1=[2,-5,6,-1,9]; p2=[3,-90,18]; p=conv(p1,p2) % 为 p1 和 p2 所相
应的多项式的乘积多项式的系数向量
p3=deconv(p,p1) % 为 p2 p4= deconv(p,p2) % 为 p1 poly2sym(p1) ; poly2sym(p2) ; poly2sym(p) poly2sym(p3) poly2sym(p4) %观看这几个多项
式
polyfit(x,y,n) 其中 x,y 为拟合数据,n 为拟合多项式的阶数。例
用最小二乘法拟合数据 x: 0.50 1.00 1.50 2.00 2.50 3.00
y: 1.75 2.45 3.81 4.80 8.00 8.60
x=[0.5,1,1.5,2,2.5,3] y=[1.75,2.45,3.81,4.80,8.00,8.60]
a=polyfit(x,y,2) % 用 2 次多项式拟合上组数据, a 为拟合多项式的系数向量
x1=0.5:0.05:3 y1=a(1)*x1.^2+a(2)*x1+a(3) plot(x1,y1) %画出拟合曲线的图
形 hold on % 保留上面的图形和坐标,可在该坐标系中继续作图
plot(x,y,‘*’) % 用 * 号的形式画出被拟合的数据图形
求矩阵的特征值( eigenvalue: )和特征向量 (eigenvector)
例 a=[7,3,-2;3,4,-1;-2,-1,3];
[x,y]=eig(a) % 所得结果 x 为 a 的特征向量矩阵, y 为特征值矩阵
说明: a 必须是方阵,此时 a*x=y*x ,
三、符号运算•MATLAB 进行符号运算的主要功
能:符号表达式和符号矩阵的基本操作、符号矩阵的基本运算、符号微积分运算、符号线性方程求解、符号微分方程求解、特殊数学符号函数、符号函数图形等。
• 符号表达式的生成创建符号函数:如 f='log(x)‘
创建符号方程:如 g='a*x^2+b*y^2+c=0‘
创建微分方程:如 q='Dy-y=x‘
或者: f=sym(‘log(x)’) 、 g=sym(‘a*x^2+b*y^2+c=0‘) 、
q=sym('Dy-y=x’)
说明:符号函数也可以用另一方法创建 ( 该方法不能创建方程 ) :
syms x % 用 syms 可以定义多个变量,变量间用空格分开
f=log(x)
w=sin(x)+cos(x)
•符号与数值之间的转换(1) Vpa 函数:如 digits(25) %设置有效数字的精度为 25 位有效数字
vpa(pi+1) %显示在上述 digits函数设置下的精度的数值
或者 vpa(pi+1,25) 注 vpa:variable precision arithmetic
(2)numeric 函数:如 numeric(pi+2)
(3)double 函数 : 如 double(pi+2) % 与上一个函数
结果一样。例 求函数 f(x)=x-cos(x) 在 x=2 的值。解
syms x f=x-cos(x); f1=subs(f,’2’,x) % 字符替代,
在 符号函数 f 中用 2 代替 x f1=subs(f,x,1) % 给出 f 在 x=1
处的值。 digits(20) vpa(f1) numeric(f1), double(f1)
例求方程 3x2-ex=0 的精确解和各种精度的近似解。
解 s=solve(‘3*x^2-exp(x)=0’)
vpa(s) % 显示 32 位有效数字 vpa(s,6) %显示 6 位有效数字 syms x
ezplot(3*x^2-exp(x))注: W = LAMBERTW(X) 是 w*exp(w) = x 的解
• 符号函数运算复合函数运算:设 z=g(y),y=f(x)
compose(g,f) % 即为 g(f(x)),自变量的符号取为 f 函数的自变量符号。
compose(g,f,t) % 即为 g(f(x)),自变量的符号取 t 。
反函数运算: finverse
例• syms x;syms y;syms t;% 或者 syms x y t
• g=sin(y);f=1/x
• compose(g,f)
• compose(g,f,t)
• finverse(g)
• finverse(f)
• 符号矩阵创立 使用 sym 函数直接创建符号矩阵:例 a=sym
(‘[1/sin(x),cos(x)^2;2*x,1+x^2]’)或 syms x a=[1/sin(x),cos(x)^2;2*x,1+x^2] 用创建子矩阵的办法创建符号矩阵(该方法不推
荐):例
a=[‘[1/sin(x),cos(x)^2]’;‘[2*x ,1+x^2 ]’] %同列元素的位数必须一样,可用空可空格来补。 例 b=[a,;'[1 ,x^2 ]']
• 将数值矩阵转化为符号矩阵a=[2/3,sqrt(2);0.222,log(3)] %a
为数值矩阵b=sym(a) %把 a 转化为符号矩阵
b 。• 符号矩阵索引和修改b(2,2) % 矩阵的索引 , 显示矩阵 b
的第 2 行第 2 列元素。
• 符号矩阵的修改 b(2,2)=‘log(9)‘ % 矩阵的修改, b(2,2) 修改为 log(9) 。• 符号矩阵的运算( 1 )+、-、 * 、 \ 、 / 运算( 2 )矩阵转置(’): a’ (3) 行列式运算: det(a) %determin
ant 的简写计算符号矩阵的行列式。
( 4 )求逆 inv(a): 求矩阵 a 的逆。( 5 )求矩阵的秩 rank(a): 求矩阵 a 的秩。• 符号极限limit(f,x,a): 求表达式 f 在 x→a 时的极限。limit(f): 求 f 在 x→0 时的极限 .
imit(f,x,a,’left’): 求表达式 f 在 x→a 时的左极限。
limit(f,x,a,’right’): 求表达式 f 在 x→a 时的右极限。例
syms x
limit(sin(x)/x,x,1)
limit(sin(x)/x)
limit((1+1/x)^(1/x),x,inf)
f=atan(1/(1-x))
y=limit(f,x,1) %没极限 y1=limit(f,x,1,’left’)
y2= limit(f,x,1,’right’)
f=1/x,
y1=limit(f,x,0,'left')
y2=limit(f,x,0,'right')
• 符号积分 ( 积分: integral)
( 1 ) int(f,x): 计算符号表达式 f, 自由变量为 x 的不定积分.
( 2 ) int(f,x,a,b): 计算符号表达式 f,自由变量为 x, 从 a 到 b 的定积分
说明:符号表达式可以是符号函数,也可是符号矩阵。
例 syms x
int(sin(x),x)
int(sin(x),x,0,1)
int(sin(x),x,0,1 )说明:变量 x 省略时默认对 x 积分。
a=sym('[1/sin(x),cos(x)^2;
2*x,1+x^2]')
int(a,x)
• 符号函数求导 (微分 :differential )
(1) diff(f,x) % 求表达式 f, 自由变量为 x 的导数。
( 2 ) diff(f,x,n) % 求表达式 f, 自由变量为 x 的 n 阶导数。
syms x f=sin(x)^2 diff(f,x)%变量 x 省略时默认对 x 求导
diff(f,x,2)% x 省略时默认对 x 求导•线性方程组的符号解法( linsolve )例 a=sym('[10,-1,0;-1,10,-2;0,-2,10]') b=sym('[9;7;6]') x=linsolve(a,b) %x 为线性方程 ax=b
的解。注:这里 a,b 也可是 double 型,但得到的 x 为 sym 型。
vpa(x) % 转化为浮点近似解 ,32 位有效数字。
•非线性方程(组)的符号解法( 1 ) fsolve(‘f’,x0): 其中 f 为被求零点
的函数, x0 为初值。注: fsolve 对 sym 型函数无效;可用于有函数文件、字符串、和 inline 定义的函数。
( 2 ) slove(‘ 方程 1’ ,‘方程 2’ ,… ).
例、求解下面非线性方程组 x1-0.7sinx1-0.2cosx2=0
x2-0.7cosx1+ 0.2sinx2=0解首先编写函数文件 f.m 如下function y=fc(x)y(1)=x(1)-0.7*sin(x(1))-0.2*cos(x(2));y(2)=x(2)-0.7*cos(x(1))+0.2*sin(x(2));y=[y(1);y(2)];在命令窗口中输入x0=[0.502,0.51]; % x0 为初始向量fsolve(‘fc’,x0)
作业:分别用 solve 和 fsolve 函数求sinx+cosx+x=0 的解,并进行验证。
作业:分别用 solve 和 fsolve 函数求方程组
x^2*y^2 - 2*x - 1 = 0 x^2 - y^2 - 1 = 0的解 , 并进行验证。 两个函数用法的区别是什么?
%方法 1• [x,y]=solve(‘x^2*y^2 - 2*x - 1 = 0’,‘x^2 - y^2 - 1 = 0’) ;%方法 2• function y=fc(x)• y(1)=x(1)^2*x(2)^2-2*x(1)-1;• y(2)=x(1)^2-x(2)^2-1;• y=[y(1),y(2)]……• x0=[1.6;1.2]• x=fsolve('fc',x0)%方法 3• f='[x(1)^2*x(2)^2-2*x(1)-1;x(1)^2-x(2)^2-1]‘• x0=[0.6;0]• x=fsolve(f,x0)%方法 4f=inline('[x(1)^2*x(2)^2-2*x(1)-1;x(1)^2-x(2)^2-1]')• x0=[1.6;1.2]• x=fsolve(f,x0)
( 4 )已知 x=[x1,x2,…,xn] f=(f1(x);f2(x);…;fn(x)) 试求导数 f'(x) ,即 f 对 x 的 jacobi
an 矩阵。 提示:利用函数: jacobian(f,v),
其中 v 为自变量向量。 利用该雅可比函数求下面函数的导数以及在( 1,2,3 )点的导数值。
F=[3x-cos(xy)-0.5; x2-80(y+0.1)2+sinz+1.06; e-xy+20z+1]• syms x,syms y,syms z• f=[3*x-cos(x*y)-0.5;x^2-
80*(y+0.1)^2+sin(z)+1.06;exp(-x*y)+20*z+1]
• df=jacobian(f,[x,y,z])• b=subs(df,[x,y,z],[1,2,3]); b='[1;2;3]';
• c=linsolve(a,b);
•常微分方程的符号解( dsolve ):字符 D 代表对独立变量导数 d/dt,Dn
代表对独立变量的 n 阶导数,例 求 dy/dt=-ay 的解解 dsolve(‘Dy=-a*y’) % 得到通解。 dsolve(‘Dy=-a*y’,’y(0)=1’) % 给定
了初始条件,求特解。方程和 初始条件用逗号分开,都用单引号引起来。
•符号函数的二维图形( 1 ) ezplot(f):绘制 f(x) 的图
形, x 的范围为 [-2π, 2π] 。如
ezplot(‘sin(x)’) 。( 2 ) ezplot(f,a,b):绘制 f(x) 的
图形, x 的范围为 [a , b] 。如 ezplot(‘sin(x)’,0,9) 。
四、图形处理
图形可视化是数学计算人员所喜欢和追求的一项技术。把结果用图形描述出来,便于理解、分析。
• 二维绘图命令(1)plot(y):%若 y 是向量,就以向量的
索引为横坐标,以向量的元素值为纵坐标;
(2)plot(x,y): 一般来说是绘制向量 y 的图形,横坐标为 x 的值,纵坐标为 y的值。
(3) plot(x,y,’.’): 这里‘ .’ 表示用点线显示。
• 二维绘图命令(1)plot(y): %若 y 是向量,就以向量的索引为横坐标,以向量的元素值为纵坐标;(2)plot(x,y): 一般来说是绘制向量 y 的图形,横坐标为 x 的值,纵坐标为 y 的值。 x,y 的
维数相同(3) plot(x,y,’.’): 这里‘ .’ 表示用离散点显示。(4) plot(x1,y 1 ,x2,y2):x1,y1 的维数相同,x2 , y2 的维数相同。
例 x=-pi:0.1:pi
y=sin(x)
plot(y)
hold on % 保留上一个图形 plot(x,y)
plot(x,y+1,':r')
说明:在 plot(x,y,’s’) 中图形设置选项 s 的规定
例 x=0:0.1*pi:2*pi;
y=sin(x);
z=cos(x);
plot(x,y,‘--k’,x,z,‘-.r’) % 分别用虚黑线和点划红线显示两条曲线。
(5) polar(θ , r):画出极坐标函数 r=r(θ) 的图形
例 cita=0:0.1*pi:4*pi; r=cita+sin(cita/2) polar(cita,r)( 6 ) refline(k,b):画平面参考线, k 为斜率, b 为在 y轴的截距
• 三维图形命令 ( 1 ) plot3(x,y,z):x,y,z 为同维向量时画空间曲线,例画出 x=sin(t),y=cos(t), x=t , t [0∈ , 10π] 的图形。
解
t=0:pi/50:10*pi; z=t,x=sin(t),y=cos(t),plot3(x,y,z) ; plot3(x,y,z+1,’--r’)
( 2 ) plot3(x,y,z): 当 z=f(x,y),(x,y) 为 xoy 平面上的网格节点时,它可以画出空间曲面 z=f(x,y) 的图形。
( 3 ) mesh(x,y,z):画出三维网格图。
( 4 ) meshc(x,y,z):画出三维网格与等高线图
( 5 ) meshz(x,y,z): 增加边界面屏蔽。
(6) surf(x,y,z) : 与 mesh 函数不同的是把图形着色 ,surfc 与 meshc 类似。例
[x,y]=meshgrid(-2:0.1:2, -2:0.1:2); z=x.^2+y.^2;
plot3(x,y,z)
hold on
meshc(x,y,z+8) , meshc(x,y,z+16) , %mesh(z) 与 mesh(x,y,z) 的区别类似于 plot(x) 与 plot(x,y) 的区别。
( 3 )坐标轴标注 xlable(‘ 标注’ ) , ylable(‘ 标注’ )
(4) 标题标注 title(‘ 标题’ )
x=-pi:0.1*pi:pi , y=sin(x)
plot(x,y) , v=[-16,6,-1,2] , axis(v)
grid on
xlabel(‘x-axis’) , ylabel(‘y=sinx’)
title(‘ 正弦函数图像’ )
( 5 )图形保持 hold on/off: hold on 是启动图形保持功能,在已存在的一张图中添加曲线, hold off 是关闭图形保持功能。
( 6 )图例标注 legend(‘ 标注 1’ ,‘标注 2’ ,… )
例 x=0:0.1*pi:2*pi;
y=sin(x); z=cos(x);
plot(x,y,'-*')
hold on
plot(x,z,'-o')
plot(x,y+z,'-h')
legend('y=sinx','z=cosx','y+z=sinx+cosx
hold off % 关闭图形保持
(7)子图 subplot(m,n,p): 其功能是把一个图形分成 m×n 个小图形窗口,通过参数 p 调用各子窗口进行操作。例
x=0:0.1*pi:2*pi;
y=sin(x);
z=cos(x);
subplot(2,2,1), plot(x,y,'-*')
subplot(2,2,2), plot(x,z,'-o')
subplot(2,2,3), plot(x,y+z,'-h')
subplot(2,2,4), plot(x,y-z,'-x')
• 图形处理技术( 1 )坐标轴控制函数 axis ( v ) :对二维图形 v=[a,b,c,d], 其中 [a,b]和 [c,d] 分别为 x轴和 y轴的范围;对于三维图形 v=[a,b,c,d,e,f] 分别给出 x,y 和 z轴的范围。例
(2) 平面坐标网格函数 grid on/off:作用是平面图形带有网格和取消网格。
五、程序设计
• MATLAB 作为一种高级计算语言,不仅可以做如上所讲的那些工作,还可以像 basic ,fortran,c 等其它高级计算机语言一样进行程序设计,即编制以 m 为扩展名的文本文件(简称 M 文件)。
• M 文件的形式(1 )命令式( script ):命令式
文件就是命令行的简单叠加, MATLAB 就会自动按顺序执行文件中的命令,这样就可以避免在命令窗口运行许多命令的麻烦和重复行工作,也便于修改。其可在命令窗口直接输入文件名运行
例 %sinfig.m
x=-pi:0.1*pi:pi ; y=sin(x) ; plot(x,y) ; hold on; plot(y,x)
(2)函数式( function ):他主要解决参数传递和函数调用问题,它的第一句以 function 语句为引导。不能直接运行,只能调用。
例 % f.m 文件名与函数名必须一致 function f(x) f=2*x^2+4*x+6在命令窗口中输入: f(0),f(10) 可以看出结果。
例、建立一个名字为 f 的函数文件,该
函数为 f=cos2(x)
试计算该函数在 x=1:10 的函数值,并给出离散点( x,f(x) )的图形。(大家一起讨论)
例、一个函数文件可以定义个函数 function [y1,y2,y3] = f(x)
y1=sin(x);
y2=cos(x);
y3=tan(x);
( 3 )数据文件:用 save(‘ 文件名’,‘变量 1’ ,‘变量 2’ ,…… ) 创建,用 load(‘ 文件名’ ) 调入到工作间。
控制语句( 1 )循环语句 ( a ) for循环:例 s=0;
for k=1:1:10 %初始值、步长和最大限值
s=s+k;
end %循环结束标志
( b ) while循环:例 s=0; k=0; while k<=9 k=k+1; s=s+k; end s
( c ) if……else……end 选择语句:例
编写分段函数 f(x)=x,(-1=<x<0);f(x)=x^2,(0<=x<=1) 。
function y=f(x) if x>=-1 & x<0 y=x; else y=x^2; end
(d) if…end 语句:例• for i=1:10
• if i<8
• a(i)=100
• end
• end• 结果: a =
100 100 100 100 100 100 100
(e) if…elseif…elseif…else…end 多重选择语句:例编写函数文件:
function y=f(x)
if x>=-1 & x<0 , y=x; elseif x>=0 & x<=1 , y=x^2;else,f=0
end
在命令窗口中输入 f(1),(3) 可以得到结果。
( f ) swith 变量 case 1
语句 case 2
语句 …… otherwise
语句 end
例、• for i=1:6• switch i• case 1• a=1• case 2• a=2• case 3• a=3• case 4• a=4• otherwise• b=0• end• end
例 已知 n= 自己的真实学号,在 xoy平面有点
Ai=(i,0) Bi=(i,n) (i=0,1,2,……,n) 现要画连接 AiBj的线段 (i,j=0,1,…, n) ,试给出其 MAT LAB 程序。解 现就学号为 6 ,给出其程序如下:
n=6;x=0:n;y=0:n;for i=1:7for j=1:7 if i==j plot(x(i)*ones(size(y)),y); xlabel('x');ylabel('y');title('AiBj 的连线 ') v=[0,n,0,n];axis(v) hold on; else a=min(x(i),x(j)); b=max(x(i),x(j)); X1=a:0.1*(b-a):b; Y1=-n/(x(i)-x(j))*(X1-x(i));%连接 AiBj 的直线 plot(X1,Y1); end endend
作业:在上题的基础上,再加上点 Ci=(0,i),Di=(n,i) (i=0,1,2,……,n)
现要画连接 AiBj和 CiBj的线段 (i,j= 0,1,…,n) ,试给出其 MAT LAB程序。把运行结果得到的图像,存放到WORD文件,文件名字取为:真实姓名 _ 真实学号,然后发送到信箱 :[email protected]
六、主要命令汇总
1 、常用信息•help: 在线帮助(显示在命令窗)。•helpwin: 在线帮助(独立窗口显示)。•ver:MATLAB 及工具箱的版本信息。2 、管理工作区命令•who: 显示当前变量。•whos: 显示当前变量具体信息。
• clear: 从内存中清楚变量和函数。• quit:退出 MATLAB 。3 、管理命令和函数• what: 显示当前目录下的 MATLAB
文件。• edit: 编辑 M 文件。 edit( 建立编辑新
文 件 );edit+文件名 ( 编辑已有 的文件 ) 。
• which:找出函数和文件的位置。• type: 显示 M 文件内容。 Type+ 文件 名。• Inmem: 显示内存中的函数。4 、操作系统命令• dir: 显示目录。• pwd: 显示当前工作目录。• delete:删除文件。 Delete+ 文件名。
• web:打开页面浏览器加载文件。5 、数据类型• double: 双精度类型• sym: 符号型• Inline: 内联对象• char: 字符数组或字符串。• uint8: 无符号 8 位整数( unsigned
integer )6 、数据基本操作• max: 最大元素。向量为数,矩阵为向量
• min: 最小元素。类似max.• mean: 求平均值。 mean(a),a 为向量 时得到向量平均值,结果为一 个数; a 为矩阵时,进行每列 平均,得到一个向量。• sum: 元素和。 sum(a),a 为向量时得 到该向量各元素之和,结果为一 个数; a 为矩阵时,进行每列 求和,得到一个向量。
• prod: 元素积。 prod(a) 当 a 为向量和
矩阵时的情况,类似于 max(a) 。• cumsum: 元素累和。 cumsum(a),a
可为向量,也可为矩阵。• cumprod: 元素累积。 a 可为向量, 也可为矩阵。7 、基本矩阵函数• zeros:零矩阵函数。
• ones: 全 1 矩阵。• eye: 单位矩阵。• rand: 随机数、向量、矩阵 .
• linspace: 线性等分向量。8 、基本数组操作• size: 矩阵大小。• length: 数组长度。• isempty:判断是不是空矩阵。
• isequal: 判断数组是否相等。 isequal(a,b) 。• isnumeric:判断是否为数值矩阵。• reshape: 矩阵重置。• tril: 抽取下三角部分。• triu: 抽取上三角部分。• fliplr: 左右方向翻转矩阵( flip:翻转)。
• flipud: 上下方向翻转矩阵。
• rot90: 逆时针把矩阵旋转 90 度。9 、专用变量和常量• ans: 最新答案。• pi:圆周率。• i,j:复数单位。• inf: 无穷大。• NaN: 不定数。• isnan:判断不定数。
• isinf:判断无穷大元素。• isfinite:判断有限大元素。10 、指数、对数函数• exp:e 指数函数。• pow2: 以 2 为底的幂函数。• sqrt: 平方根函数。11 、舍入函数和剩余函数• fix:朝零方向舍入为整数。
• floor:朝负方向舍入为整数。• ceil:朝正方向舍入为整数。• round:四舍五入为整数。• sign: 符号函数。• mod: 无符号求余函数。 mod(3,2)=1• rem: 带符号求余函数。12 、复数函数• abs: 求模。
• conj: 求共轭函数( conjugate )。• angle: 相角函数。• imag:复矩阵虚部。• real:复矩阵实部。• isreal: 实矩阵判断函数。12 、矩阵函数• norm: 矩阵或向量范数。• normest: 向量、矩阵 2 范数。
• rank: 矩阵的秩。• det: 矩阵行列式的值。• trace: 矩阵的迹 ( 主对角线元素之和 ) 。• inv: 矩阵逆。13 、特征多项式、特征值• poly: 特征多项式。• poly2sym: 多项式表示。• eig: 特征值和特征向量。
• eigs: 特征值。14 、矩阵函数• expm: 矩阵指数。• logm: 矩阵对数。• sqrtm: 矩阵平方根。15 、坐标转换• cart2sph: 转换直角坐标为球坐标。• cart2pol: 转换直角坐标为极坐标。
•pol2cart: 转换极坐标为直角坐标。•sph2cart: 转换球坐标为直角坐标。16 、坐标轴控制•axis: 控制坐标轴范围。•grid on/off:栅格线保持、取消。•hold on/off: 图形保持 / 取消。•box on/off: 图形四周都显示 / 常规坐标轴。
例 1 、
•[x,y]=meshgrid(0:0.5:10);•z=y.*sin(x.^2)+cos(y);•surf(x,y,z)•v=[-20,10,-20,10,-10,50];%坐标轴范围控制
•axis(v)%注意该语句必须在图形显示语句的后面
说明:二维图形是类似的。
例 2 、 axis(‘ 控制字符串’ ) :可以选择
不同的字符串完成对坐标轴的操作。控制字符串有:( 1 ) auto: 自动模式,使得图形的坐标范围满足图中一切图元素。
( 2 ) axis: 将当前坐标设置固定,使用 hold 命令后,图形仍以此作为坐标界限。
( 3 ) manual: 以当前的坐标限定绘制。( 4 ) tight: 将坐标限控制在指定的
数据范围内。( 5 ) equal: 使坐标轴分度相等。( 6 ) off: 取消对坐标轴的一切设置,包括系统的自动设置。( 7 ) on:恢复对坐标轴的一切设置。
• [x,y]=meshgrid(-1:0.1:1,-1:0.1:1);
• z=x.^2+y.^2;
• surf(x,y,z)
• box on
17 、基本二维图形• plot: 线性绘图。
• loglog: 双对数坐标图。• semilogx:半对数( x )坐标图。• semilogy:半对数( y )坐标图。• polar:极坐标图。• subplot: 分割图窗• refline(slope,intercept): 加参考线18 、图形注解• legend: 图形标签 .• xlable:x轴标签。
• ylable:y轴标签。• title: 图形题目。• text: 文字注解。19 、特殊二维图形• bar: 条形图。• barh: 水平柱图。• ezplot: 符号函数图。• fplot:绘制字符串指定的函数名的函
数图。如 fplot(‘sin(x)’,[2,3]) 。
• pie:饼图。• plotmatrix:绘矩阵点图。• stem:2 维火柴杆图。• stem3 : 3 维火柴杆图。20 、等高线图和向量图• contour: 等高线图。• contour3: 三维等高线图。• quiver: 向量图。例
[x,y] = meshgrid(-2:.2:2,-1:.15:1);
z = x .* exp(-x.^2 - y.^2);
[px,py] = gradient(z,2);
contour(x,y,z),
hold on
quiver(x,y,px,py)
hold off
21 、特殊三维图形•comet3: 三维彗星轨线( comet(x,y)画二维彗星线)。 t = -10*pi:pi/500:10*pi comet3(sin(t),cos(t),t)
•meshc(x,y,z):画出三维网格与等高线 图,类似 sutfc 。•meshz(x,y,z): 增加边界面屏蔽。
• stem3: 三维火柴干图。例 a=rand(3) ; stem3(a) ;22 、固体模型• cylinder: 生成圆柱。格式为 [x,y,z]= cylinder(r,n),r 为母线半 径, N 为显示的母线条数 mesh(x,y,z) 或 surf(x,y,z) 显示单位 高度柱面。
t = -1*pi:pi/20:1*pi;
r=5+cos(t);
[x,y,z]=cylinder(r,30)
surf(x,y,z)
• sphere: 生成单位球面。例 [x,y,z]=sphere(40) %40 为子午线条 数, sphere默认为 20 条。 mesh(x,y,z) 或 surf(x,y,z) %画球面 axis(‘equal’) %坐标轴刻度相同
例、绕地球运动的飞行物• [x,y,z]=sphere(50);• mesh(x,y,z);• hold on• v=[-6,6,-6,6,-6,6];• axis(v);• axis('off')• t= 0:pi/1000:200*pi;• x=6*sin(t);• y=2*cos(t);• z=zeros(size(t));• comet3(x,y,z)
23 、四维表现图 对于三维图形自变量是二维的,对
于三个自变量的函数 w=fx,y,z), 其其图形应该是四维的,由于我们所处的空间和思维的局限性,在计算机屏幕上只能表现出三维空间。为了表现四维图像,可利用三维实体的四维切片色图,用三维实体上的颜色来描述函数值的变化情况。
• MATLAB 中用 slice 函数来完成 ( 1 ) slice(x,y,z,w,sx,sy.sz):绘制向量 sx,sy,sz 中的点沿 x,y,z轴方向的切片图, v 的大小决定了每一点的颜色。
( 2 ) slice(x,y,z,w,x1 , y1,z1): 按数组 x1 , y1,z1 切片(按坐标轴单位)。
( 3 ) slice(w,x1 , y1,z1): 按数组 x1 ,y1,z1 切片(按 x,y,z 的网格单位进行切片。
( 4 ) slice(w,sx , sy,sz): 按 x,y,z 的网格单位进行切片。
例、程序如下:[x,y,z]=meshgrid(-2:0.2:2,-2:0.25:2,-2:0.16:2);w=x.^2+y.^2+z.^2;%slice(x,y,z,a,x,y,z)x1=1:15;y1=1:10;z1=1:10subplot(2,2,1),slice(x,y,z,w,1,1,[0,1]);subplot(2,2,2),slice(w,1,1,[0,1]);subplot(2,2,3),slice(x,y,z,w,x1,y1,z1);hold onsubplot(2,2,4),slice(w,x1,y1,z1);colorbar % 色轴,它可以标注颜色与数值之间的关系
24 、数据文件( 1 ) Save(‘x1’ ,‘变量 1’ , ‘变量
2’ ,… ) :把变量 1 ,变量 2 ,…的数据
保存到名字为 x1.mat 的数据文件中;当变量缺省时,保存所有变量的数据。数据文件自己起名字,变量为程序中的已赋值的变量。 请看下面例子
w='Xingtai College'
x=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1];
y=[0.002,0.114,0.189,0.316,0.394,0.434,0.427,0.409,0.379,0.327,0.254];
a=x'*y;
save(‘x1’) %所有的变量全部保存save(‘x2’,‘w’) %只保存 w 变量的数据save('x3','w','x') %保存 w,x 变量的数据save(‘x4’,‘w’,‘x’,‘y’,‘a’) %保存 w,x,y,a 变量的数据%用 load(‘ 文件名’ ) 可把数据文件调入内存。
25 、时间函数( 1 ) calendar: 返回当前日历( 2 ) calendar(year, month): 反回指定
的年月日历。( 3 ) calendar(data):返回公元 0000 年
算起的天数( data )的日历。( 4 ) cputime: 以秒返回 cpu 当前时间。( 5 ) tic,toc 启用、关闭计时器。( 6 ) clock: [year month day hour minute se
conds]
% 计算运行程序所用的时间• t1=clock• ….• t2=clock• etime(t2,t1) % elapsed time from t1 to t2或者• tic% 打开计时器• …• toc% 关闭计时器,且显示所用的时间• 或者• T1=cputime• …• T2=cputime• E=T2-t1
说明:通过计算程序所用的时间可以来衡量解决同样的一个问题的所编写的不同程序的优劣。例1、• t1=clock;• for k=1:m• x0=[1;0];• T=0.2;• m=1000;• f=inline('[-sin(t);cos(t)]');• x1=x0+f((k-1)*T)*T;• x0=x1;• x(k)=x1(1);• y(k)=x1(2);• end• comet(x,y)• t2=clock;• t=etime(t2,t1)
• t1=clock;• x0=[1;0];• T=0.2;• m=1000;• f=inline('[-sin(t);cos(t)]');• for k=1:m• x1=x0+f((k-1)*T)*T;• x0=x1;• x(k)=x1(1);• y(k)=x1(2);• end• comet(x,y)• t2=clock;• t=etime(t2,t1)
以上我们只介绍了 MATLAB 最基本的知识,用此我们可以解决一些数值计算、符号运算和图形处理问题。
MATLAB 的应用比较广泛,它在数学的一些学科(计算方法、微积分、线性方程组、常微分方程、偏微分方程、复变函数、概率统计、最优问题等)的应用,有一些专门的开发程序。以后自己在用中可以去学习。
谢谢大家!