MatLab中文版word版第六章文档格式.docx
- 文档编号:17146342
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:50
- 大小:471.22KB
MatLab中文版word版第六章文档格式.docx
《MatLab中文版word版第六章文档格式.docx》由会员分享,可在线阅读,更多相关《MatLab中文版word版第六章文档格式.docx(50页珍藏版)》请在冰豆网上搜索。
6.1036
6.1136
6.1236
6.1336
6.1436
6.1536
6.1636
6.1737
6.1837
6.1937
6.2037
第六章复数数据、字符数据和附加画图类型
在第二章中,我们学习了MATLAB基础数据类型:
double和char。
MATLAB还有许多的附加数据类型,在本章,我们将会了解它们中的一个。
我们要讨论的附加数据类型是MATLAB支持的复数数据。
我们也将学习如何使用char数据类型,以及如何把MATLAB数组扩展为多维数组。
本章还会涉及到MATLAB的附加画图类型。
6.1复数数据
复数是指既包含实部又包含虚部的数。
复数出现在许多的科研工作问题上。
例如,在电器工程中,我们可以用复数代表交变电压,交变电流和阻抗。
描述电器系统行为的公式经常用到复数。
因为这是非常常见的,作为一个程师如果没有很好理解和运用复数,它无法工作。
复数的一般形式如下:
C=a+bi
其中C为复数,a和b均为实数,i代表
。
a,b分别为C的实部和虚部。
由于复数有两个部分,所以它能在平面内标出。
这个平面的横轴是实轴,纵轴是虚轴,所以复数在这个平面内为一个点,横轴为a,纵轴为b。
用上面的方式表示一个复数,叫做直角坐标表示,为坐标的横轴与虚轴分别代表复数的实部与虚部。
复数有在一平面内另一种表达方式,既极坐标表示,公式如下,
c=a+bi=z∠θ
其中z代表向量的模,θ代表辐角。
直角坐标中的a,b和极坐标z,θ之间的关系为
a=zcosθ(6.2)
b=zsinθ(6.3)
z=
(6.4)
(6.5)
图6.1直角坐标系中复数
图6.2极坐标系中复数
MATLAB用直角坐标表达复数。
每一个复数应有一对实数(a,b)组成。
第一个数(a)代表复数的实部,第二个数(b)代表复数的虚部。
如果复数c1=a1+b1i和复数c2=a2+b2i,那么它们的加减乘除运算定义如下。
c1+c2=(a1+a2)+(b1+b2)i(6.6)
c1-c2=(a1-a2)+(b1-b2)i(6.7)
c1×
c2=(a1a2-b1b2)+(a1b2+b1a2)i(6.8)
(6.9)
当两个复数进行二元运算,MATLAB将会用上面的法则进行加法,减法,乘法和除法运算。
6.1.1复变量(complexvariables)
当复数值赋值于一个变量名,MATLAB将自动创建一个复变量。
创建复数的最简单方法是用MATLAB本自带的因有变量i或j,它们都被预定义为
例如下面的语句将复数4+3i赋值于c1。
>
c1=4+3*i
c1=
4.0000+3.0000i
函数isreal可以判断一个数组包是实数组还是复数组。
如果一个数组中的所有元素只有虚部,那么这个数组是复数组,并且isreal(array)将会返回一个0。
6.1.2带有关系运算符的复数的应用
用关系运算符==来判断两复数是否相等,或用关系运算符~=判断两复数是否不相等,这种情况是可能的。
这些运算都会产生出我们所期望的结果。
例如,如果c1=4+3i和c2=4-3i,那么关系运算c1==c2将会产生0,关系运算c1~=c2将会产生1。
但是,比较运算符>
,<
=或>
=将不会产生我们所期望的结果。
当复数进行此类关系运算时,只对复数的实部进行比较。
例如,如果c1=4+i3和c2=4+i8,那么比较运算c1>
c2将会产生1,尽管c1的模要比c2的模小。
如果我们需要用这些运算对两复数进行比较,我们更加关心的是两复数的模,而不只是实部。
复数的模可以由abs固有函数计算得到(在下一节介绍,或者由公式(6.4)得到)。
如果我们对两复数进行比较,得到的结果将更加合理。
abs(c1)>
abs(c2)将会产生0,因为c1的模大于c2的模。
常见编程错误
当我们应用关系运算符对复数运算时,一定要小心。
关系运算符>
=只比较复数的实部,而不是它们的模。
如果你要用这些关系运算符对一复数进行运算,比较两复数的模将更加常见。
6.1.3复函数(complexfunction)
MATLAB中有许多的函数支持复数的运算。
这些函数可分为三大类。
1.类型转换函数
这些函数把数据从复数据类型转换为实数数据类型(double)。
函数real将复数的实部转化为double型数据,把复数的虚部抛弃。
函数imag把函数的虚部转化为相应的实数。
函数
描述
conj(c)
计算c的共共轭复数。
如果c=a+bi,那么conj(c)=abi。
real(c)
返回复数c的实部
imag(c)
返回复数c的虚部
isreal(c)
如果数组c中没有一个元素有虚部,函数isreal(c)将返回1。
所以如果一个数组c是复数组成,那么~isreal(c)将返回1。
abs(c)
返回复数c模
angle(c)
返回复数c的幅角,等价于atan2(imag(c),real(c))
表6.1常见的支持复数运算的MATLAB函数
2.绝对值和幅角函数
这些函数把复数转化它的极坐标形式。
函数abs(c)用于计算复数c相应的绝对值,公式如下
其中c=a+bi。
函数angle(c)用下面的公式计算复数c的幅角
angle(c)=atan2(imag(c),real(c))
由它产生的角的取值范围为-π<
θ≤π。
3.数学函数
许多的数函数都可以对复数进行运算。
这些函数包括指数函数,对数函数,三角函数,还有平方根函数。
函数sin,cos,log,sqrt等既能对复数数据进行运算,又能对实数据进行运算。
一些支持复数运算的函数在表6.1中列出。
例6.1
二次方程的求解(重写)
复数的价值体现在它能使运算简化。
例如,我们在例3.2中已解决的二次方程的求解问题,但它根据判别式用到3个选项的选择结构,由于复数的出现,负数的平方根的处理将不困难。
所以能够大大简化我们的计算。
编写一个普通的程序,解一元二次方程的根,不管是什么类型的。
用复变量,而不用选择结构。
1.陈述问题
编写一个程序,解一元二次方程的根,不管有两个不同的实根,还是用两个相同的实根或两个不同复根。
不需要检测判别式。
2.定义输入输出
本程序所需要方程式
ax2+bx+c=0(3.1)
的三个系数a,b,c。
输出是这个方程式的所有根。
3.设计算法
这个程序从整体上可以分为三大步,即输入,计算,输出
Readtheinputdata
Calculatetheroots
Writeouttheroots
我们现在把每一步进行逐步细化。
这时判别式的值对程序的执行过程不产生影响。
伪代码如下:
Prompttheuserforthecoefficientsa,b,andc.
Reada,b,andc
discriminant←b^2-4*a*c
x1←(-b+sqrt(discriminant))/(2*a)
x2←(-b-sqrt(discriminant))/(2*a)
Print'
x1='
real(x1),'
+i'
imag(x1)
x2='
real(x2),'
imag(x2)
4.将算法转化为MATLAB语句
%Scriptfile:
calc_roots2.m
%
%Purpose:
%Thisprogramsolvesfortherootsofaquadraticequation
%oftheforma*x**2+b*x+c=0.Itcalculatestheanswers
%regardlessofthetypeofrootsthattheequationpossesses.
%Recordofrevisions:
%DateProgrammerDescriptionofchange
%===================================
%12/06/98S.J.ChapmanOriginalcode
%Definevariables:
%a--Coefficientofx^2termofequation
%b--Coefficientofxtermofequation
%c--Constanttermofequation
%discriminant--Discriminantoftheequation
%x1--Firstsolutionofequation
%x2--Secondsolutionofequation
%Prompttheuserforthecoefficientsoftheequation
disp('
Thisprogramsolvesfortherootsofaquadratic'
);
equationoftheformA*X^2+B*X+C=0.'
a=input('
EnterthecoefficientA:
'
b=input('
EnterthecoefficientB:
c=input('
EnterthecoefficientC:
%Calculatediscriminant
discriminant=b^2-4*a*c;
%Solvefortheroots
x1=(-b+sqrt(discriminant))/(2*a);
x2=(-b-sqrt(discriminant))/(2*a);
%Displayresults
Therootsofthisequationare:
'
fprintf('
x1=(%f)+i(%f)\n'
real(x1),imag(x1));
x2=(%f)+i(%f)\n'
real(x2),imag(x2));
5.检测程序下一步,我们必须输入检测来检测程序。
我们要有三组数据进行检测,其判别式分别大于0,等于0,小于0。
根据方程式(3。
1),用下面的方程式验证程序。
x2+5x+6=0x=-2,x=-3
x2+4x+4=0x=-2
x2+2x+5=0x=-1±
2i
我们把它们的系数分别输入程序,结果如下
calc_root2
Thisprogramsolvesfortherootsofaquadratic
equationoftheformA*X^2+B*X+C=0.
1
5
6
x1=(-2.000000)+i(0.000000)
x2=(-3.000000)+i(0.000000)
4
x2=(-2.000000)+i(0.000000)
2
x1=(-1.000000)+i(2.000000)
x2=(-1.000000)+i(-2.000000)
在三种不同的情况下,程序均给出了正确的结果。
注意此程序与例3.2中的程序相比有多简单。
复数数据的应用可大大简化我们的程序。
6.1.4复数数据的作图
因为复数数据既包括实部又包括虚部,所以在MATLAB中复数数据的作图与普通实数据的作图有所区别。
例如,考虑下面的函数
y(t)=e-0.2t(cost+isint)(6.10)
如果我们用传统的plot命令给这个函数作图,只有实数数据被作出来,而虚部将会被忽略。
下面的语句得到图象如图6.3所示,注意出现了警告信息:
数据的虚部被忽略
t=0:
pi/20:
4*pi;
y=exp(-0.2*t).*(cos(t)+i*sin(t));
plot(t,y);
title('
\bfPlotofComplexFunctionvsTime'
xlabel('
\bf\itt'
ylabel('
\bf\ity(t)'
图6.3用plot(t,y)画出的y(t)=e-0.2t(cost+isint)图象
如果函数的实部和虚部都需要的话,那么用户可以有几种选择。
我们可以用下面的语句,在相同的时间轴内画出函数的图象(图6.4)。
plot(t,real(y),'
b-'
holdon;
plot(t,imag(y),'
r-'
legend('
real'
'
imaginary'
holdoff;
图6.4包含了y(t)的实部和虚部
可选择的,函数的实部-虚部图可以被画出来。
如果有一个复参数提供给plot函数它会自动产生一个函数的实部-虚部图。
产生这类图的语句如下,产生的结果如图6.5所示。
plot(y,'
\bfPlotofComplexFunction'
\bfRealPart'
\bfImaginaryPart'
图6.5y(t)的的实部-虚部图
最后,我们可以画出函数的极坐标图。
产生这类图语句如下,产生的结果如图图6.6所示。
polar(angle(y),abs(y));
图6.6y(t)的极坐标图
6.2字符串函数(stringfunctions)
一个MATLAB字符串是一个char型数组。
每一个字型占两个字节。
当字符串被赋值于一个变量时,这个变量将被自动创建为字符变量。
例如语句
str='
Thisisatest'
;
将会创建一个含有14个元素的数组。
用whos命令查看它属性。
whos
NameSizeBytesClass
str1x1428chararray
Grandtotalis14elementsusing28bytes
一个专门的函数ischar常用来判断一个变量是否为字符数组。
如果是的话,那么函数较会返回1,如果不是,将会返回0。
在下面的的小节中,我们将向大家介绍一些对字符串进行操作的函数。
6.2.1字符转换函数
我们可以利用double函数把变量从字型转化为double型。
所以,函数double(str)产生的结果为
x=double(str)
x=
Columns1through12
8410410511532105115329732116101
Columns13through14
115116
我们可以利用char函数把double型数据转化为字符型数据。
所以函数char(x)产生的结果为
x=char(x)
Thisisatest
6.2.2创建二维字符数组
我们可以创建二维字符数组,但一个数组中每一行的长度都必须相等。
如果其中的一行比其他行短,那么这个字符数据将会无效,并产生一个错误。
例如,下面的语句是非法的,因为他两行的长度不同。
name=['
StephenJ.Chapman'
SeniorEngineer'
];
创建二维字符数组的最简单的方法是用char函数。
函数将会自动地寻找所有字符串中最长的那一个。
name=char('
)
name=
StephenJ.Chapman
SeniorEngineer
二维字符数组也可以用函数strvcat,这个函数我会在下一节中介绍。
好的编程习惯
用char函数创建二维字符数组,我们就不用担心每一行的长度不相同了。
我们可以应用deblank函数去除多余空格。
例如,下面的语句去除name数组中第二行的多余空格,产生的结果与原来的进行比较。
line2=name(2,:
line2=
line2_trim=deblank(name(2,:
))
line2_trim=
SeniorEngineer
size(line2)
ans=
118
size(line2_trim)
115
6.2.3字符串的连接
函数strcat水平连接两字符串,忽略所有字符串末端的空格,而字符串的空格保留。
例如,下面的语句为
result=strcat('
string1'
String2'
result=
string1String2
产生的结果string1String2。
函数strvcat用于竖直地连接两字符串,自动地把它转化为二维数组。
这个函数将产生这样的结果
result=strvcat('
LongString1'
LongString1
String2
6.2.4字符串的比较
字符串与子字符串可以通过下面许多的方式进行比较。
●两个字符串,或两个字符串的部分,看两者是否相同
●两个独立的字符相比较看两者是否相同
●检查字符串判断每一个字符是字母,还是空格
6.2.4.1比较两字符串,看是否相同
你可以利用MATLAB函数比较两字符串整体是否相同。
它们是
●strcmp判断两字符串是否等价
●strcmpi忽略大小写判断两字符串是否等价
●strncmp判断两字符串前n个字符是否等价
●strncmpi忽略大小写判断两字符串前n个字符是否等价
函数strcmp比较字符串,包括字符串前面或后面的空格。
如果两字符串完全相同,那么这个函数将返回1。
否则,返回0。
strcmpi与strcmp类似,但它忽略了大小写(即“a”与“A”看作相同的)
函数strncmp用来比较两字符串前n个字符串,包含开头的空格,如果这个n个字符是相同的,它们将会返回1。
否则它将会返回0。
函数strncmpi与它相类似,但忽略了大小写。
为了更好的理解这些函数,考虑下面的字符串
str1='
hello'
str2='
Hello'
str3='
help'
字符串str1和str2不相同,但它第一个字母大小不同。
所以strcmp将返回0,strcmpi将返回1。
c=strcmp(str1,str2)
c=
0
c=strcmpi(str1,str2)
字符串str1和str3不相同,所以strcmp与strcmpi返回0。
但是str1和str3的前三个字符是相同,所以按照下面的方式调用将会返回1。
c=strncmp(str1,str3,2)
6.2.4.2判断单个字符是否相等
我们可以利用MATLAB关系运算符对字符数组中的每一个元素进行检测,看是否相同,但是我们要保证它们的维数是相同的,或其中一个是标量。
例如,你可以用相等运算符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MatLab 中文版 word 第六