数学建模matlab学习.docx

上传人:b****6 文档编号:4180291 上传时间:2022-11-28 格式:DOCX 页数:50 大小:471.23KB
下载 相关 举报
数学建模matlab学习.docx_第1页
第1页 / 共50页
数学建模matlab学习.docx_第2页
第2页 / 共50页
数学建模matlab学习.docx_第3页
第3页 / 共50页
数学建模matlab学习.docx_第4页
第4页 / 共50页
数学建模matlab学习.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

数学建模matlab学习.docx

《数学建模matlab学习.docx》由会员分享,可在线阅读,更多相关《数学建模matlab学习.docx(50页珍藏版)》请在冰豆网上搜索。

数学建模matlab学习.docx

数学建模matlab学习

第六章复数数据、字符数据和附加画图类型3

6.1复数数据3

6.1.1复变量(complexvariables)4

6.1.2带有关系运算符的复数的应用4

6.1.3复函数(complexfunction)5

1.类型转换函数5

2.绝对值和幅角函数5

3.数学函数5

例6.16

6.1.4复数数据的作图7

6.2字符串函数(stringfunctions)11

6.2.1字符转换函数11

6.2.2创建二维字符数组12

6.2.3字符串的连接12

6.2.4字符串的比较13

6.2.5在一个字符串中查找/替换字符14

6.2.6大小写转换15

6.2.7字符串转换为数字16

6.2.8数字转化为字符串16

例6.218

6.3多维数组21

6.4关于二维作图的补充说明23

6.4.1二维作图的附加类型23

6.4.2作图函数27

6.4.3柱状图28

6.5三维作图28

6.5.1三维曲线作图29

6.5.2三维表面,网格,等高线图象30

6.6总结33

6.6.1好的编程习惯总结33

6.6.2MATLAB函数与命令总结33

6.7练习34

6.134

6.235

6.335

6.435

6.535

6.635

6.735

6.835

6.936

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)得到)。

(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)

Print'x2=',real(x2),'+i',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');

disp('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

disp('Therootsofthisequationare:

');

fprintf('x1=(%f)+i(%f)\n',real(x1),imag(x1));

fprintf('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.

EnterthecoefficientA:

1

EnterthecoefficientB:

5

EnterthecoefficientC:

6

Therootsofthisequationare:

x1=(-2.000000)+i(0.000000)

x2=(-3.000000)+i(0.000000)

>>calc_root2

Thisprogramsolvesfortherootsofaquadratic

equationoftheformA*X^2+B*X+C=0.

EnterthecoefficientA:

1

EnterthecoefficientB:

4

EnterthecoefficientC:

4

Therootsofthisequationare:

x1=(-2.000000)+i(0.000000)

x2=(-2.000000)+i(0.000000)

>>calc_root2

Thisprogramsolvesfortherootsofaquadratic

equationoftheformA*X^2+B*X+C=0.

EnterthecoefficientA:

1

EnterthecoefficientB:

2

EnterthecoefficientC:

5

Therootsofthisequationare:

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)。

t=0:

pi/20:

4*pi;

y=exp(-0.2*t).*(cos(t)+i*sin(t));

plot(t,real(y),'b-');

holdon;

plot(t,imag(y),'r-');

title('\bfPlotofComplexFunctionvsTime');

xlabel('\bf\itt');

ylabel('\bf\ity(t)');

legend('real','imaginary');

holdoff;

图6.4包含了y(t)的实部和虚部

可选择的,函数的实部-虚部图可以被画出来。

如果有一个复参数提供给plot函数它会自动产生一个函数的实部-虚部图。

产生这类图的语句如下,产生的结果如图6.5所示。

t=0:

pi/20:

4*pi;

y=exp(-0.2*t).*(cos(t)+i*sin(t));

plot(y,'b-');

title('\bfPlotofComplexFunction');

xlabel('\bfRealPart');

ylabel('\bfImaginaryPart');

图6.5y(t)的的实部-虚部图

最后,我们可以画出函数的极坐标图。

产生这类图语句如下,产生的结果如图图6.6所示。

t=0:

pi/20:

4*pi;

y=exp(-0.2*t).*(cos(t)+i*sin(t));

polar(angle(y),abs(y));

title('\bfPlotofComplexFunction');

图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)

x=

Thisisatest

6.2.2创建二维字符数组

我们可以创建二维字符数组,但一个数组中每一行的长度都必须相等。

如果其中的一行比其他行短,那么这个字符数据将会无效,并产生一个错误。

例如,下面的语句是非法的,因为他两行的长度不同。

name=['StephenJ.Chapman';'SeniorEngineer'];

创建二维字符数组的最简单的方法是用char函数。

函数将会自动地寻找所有字符串中最长的那一个。

>>name=char('StephenJ.Chapman','SeniorEngineer')

name=

StephenJ.Chapman

SeniorEngineer

二维字符数组也可以用函数strvcat,这个函数我会在下一节中介绍。

好的编程习惯

用char函数创建二维字符数组,我们就不用担心每一行的长度不相同了。

我们可以应用deblank函数去除多余空格。

例如,下面的语句去除name数组中第二行的多余空格,产生的结果与原来的进行比较。

>>line2=name(2,:

line2=

SeniorEngineer

>>line2_trim=deblank(name(2,:

))

line2_trim=

SeniorEngineer

>>size(line2)

ans=

118

>>size(line2_trim)

ans=

115

6.2.3字符串的连接

函数strcat水平连接两字符串,忽略所有字符串末端的空格,而字符串的空格保留。

例如,下面的语句为

>>result=strcat('string1','String2')

result=

string1String2

产生的结果string1String2。

函数strvcat用于竖直地连接两字符串,自动地把它转化为二维数组。

这个函数将产生这样的结果

>>result=strvcat('LongString1','String2')

result=

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)

c=

1

字符串str1和str3不相同,所以strcmp与strcmpi返回0。

但是str1和str3的前三个字符是相同,所以按照下面的方式调用将会返回1。

>>c=strncmp(str1,str3,2)

c=

1

6.2.4.2判断单个字符是否相等

我们可以利用MATLAB关系运算符对字符数组中的每一个元素进行检测,看是否相同,但是我们要保证它们的维数是相同的,或其中一个是标量。

例如,你可以用相等运算符(==)来

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1