MATLAB 在实际问题中的分析与应用
自20世纪80年代以来,出现了多种科学计算语言,亦称数学软件,比较流行的有MATLAB、Mathematical、Maple等。因为他们具有功能强、效率高、简单易学等特点,在在许多领域等到广泛应用。MATLAB便是一种影响大、流行广的科学计算语言。MATLAB的语法规则简单,更加贴近人的思维方式。
MATLAB是英文Matrix Laboratory(矩阵实验室)的缩写。自1984年由美国Math Works公司推向市场以来,得到了广泛的应用和发展。在欧美各高等院校MATLAB已经成为线性代数、自动控制理论、数字信号处理、时间序列分析、动态系统仿真、图像处理等诸多课程的基本教学工具,成为大学生、硕士生以及博士生必须掌握的基本技能。在设计研究单位和工业部门,MATLAB已被广泛的应用于研究和解决各种具体的工程问题。近年来,MATLAB在我国也开始流行,应用MATLAB的单位和个人急剧增加。可以预见,MATLAB将在我国科学研究和工程应用中发挥越来越大的作用。
Mat lab 是当前数值计算方面应用地非常广泛的一种计算机软件,特别是在工程应用求解中发挥了重要作用。其所具有的浅显易懂的编程语言、强大的绘图功能、大量的内部函数等都深深地吸引了我认真地去学习它。同时在上《过程装备力学基础》时,其中涉及有很多的问题是超越方程、微积分的问题,难以用普通的线性方法求解,而Mat lab 在此方面有强大的功能,特别是超越方程的精确求解以及图形的绘制方面。数学当中的绘制函数图象、绘制立体图形的交线(如绘制两个等直径圆柱体的交线)、求多项式的根等问题,这些问题如果依靠我们人工进行操作,则需要很多的时间和精力,当我们掌握了基本原理后,借助于MATLAB进行解决则会大大提高效率和精确度。
仅举一些运用MATLAB的例子。 常用控制命令:
click:%清屏; clear:%清变量; save:%保存变量; load:%导入变量 一、利用公式直接进行赋值计算
本金P以每年n次,每次i%的增值率(n与i的乘积为每年增值额的百分比)增加,当增加到r×P 时所花费的时间T为:(利用复利计息公式可得到下式)
r?P?P(1?0.01i)nT?T?MATLAB 的表达形式及结果如下: >> r=2;i=0.5;n=12; %变量赋值 >> T=log(r)/(n*log(1+0.01*i)) 计算结果显示为:
T = 11.5813
即所花费的时间为T=11.5813 年。
lnr(r?2,i?0.5,n?12)
nln(1?0.01i)分析:上面的问题是一个利用公式直接进行赋值计算问题,实际中若变量在某个范围变化取很多值时,使用MATLAB,将倍感方便,轻松得到结果,其绘图功能还能将结果轻松的显示出来,变量之间的变化规律将一目了然。
若r在[1,9]变化,i在[0.5,3.5]变化;我们将MATLAB的表达式作如下改动,结果如图1。 r=1:0.5:9; i=0.5:0.5:3.5; n=12;
p=1./(n*log(1+0.01*i)); T=log(r')*p; Plot (r, T)
Label('r') %给x轴加标题
1
label('T') %给y轴加标题
q=ones (1,length (i);
text(7*q-0.2,[T(14,1:5)+0.5,T(14,6)-0.1,T(14,7)-0.9],num2str(i'))
4035302520 1151.51050 22.5 33.512345r67890.5T
图1
从图1中既可以看到T随r的变化规律,而且还能看到i的不同取值对T—r曲线的影响(图中的六条曲线分别代表i的不同取值)。 二、已知多项式求根
已知多项式为h?x?10x?31x?10x?116x?200x?96,求其根。 分析:对多项式求根问题,我们常用roots()函数。MATLAB 的表达形式及结果如下: >> h=roots([1 -10 31 -10 -116 200 -96]) %中括号内为多项式系数由高阶到常数。 计算结果显示为(其中i为虚数单位): h =
-2.0000 4.0000 3.0000 2.0000 + 0.0000i 2.0000 - 0.0000i 1.0000
如果已知多项式的根,求多项式,用poly()函数。对上面得到的h的值求多项式,其MATLAB的表达形式及结果如下:
>>h=[-2.0000 4.0000 3.0000 2.0000+0.0000i 2.0000-0.0000i 1.0000]; >>c=poly (h) 计算结果显示为:
c =
1 -10 31 -10 -116 200 -96 三、方程组的求解
65432?8x1?x2?6x3?7.5求解下面的方程组:??3x1?5x2?7x3?4
?4x?9x?2x?1223?1分析:对于线性方程组求解,常用线性代数的方法,把方程组转化为矩阵进行计算。 ax?b?x?ab?x?a\\b MATLAB 的表达形式及结果如下:
2
?1>> a=[8 1 6;3 5 7;4 9 2]; %建立系数矩阵 >> b=[7.5;4;12]; %建立常数项矩阵 >> x=a\\b %求方程组的解 计算结果显示为: x =
1.2931 0.8972 -0.6236
四、数据拟合与二维绘图
在数学建模竞赛中,我们常会遇到这种数据表格问题,如果我们仅凭眼睛观察,很难看到其中的规律,也就更难写出有效的数学表达式从而建立数学模型。因此可以利用MATLAB的拟合函数, 即prolific() 函数,并结合MATLAB的绘图功能(利用plot()函数),得到直观的表示。
例:在化学反应中,为研究某化合物的浓度随时间的变化规律,测得一组数据如下表: 分析:
MATLAB 的表达形式如下:
t=[1:16]; %数据输入
y=[4 6.4 8 8.4 9.28 9.5 9.7 9.86 10 10.2 10.32 10.42 10.5 10.55 10.58 10.6]; plot(t,y,'o') %画散点图 p=politic(t,y,2) %二次多项式拟合 Hold on
xi=lenspiece(0,16,160); %在[0,16]等间距取160 个点
y I =polygala(p, xi); %由拟合得到的多项式及xi,确定y i plot(xi, y I ) %画拟合曲线图 执行程序得到图2;
1110T(分) y T(分) y 1 4 9 10 2 6.4 10 10.2 3 8.0 11 10.32 4 8.4 12 10.42 5 9.28 13 10.5 6 9.5 14 10.55 7 9.7 15 10.58 8 9.86 16 10.6 98765
图2 显示的结果为 p=
-0.0445 1.0711 4.3252
40246810121416
p的值表示二阶拟合得到的多项式为:y= -0.0445t+1.0711t+ 4.3252
3
2
下面是用lsqcurvefit()函数,即最小二乘拟合方法的Mat lab表达: t= [1:16];
y= [4 6.4 8 8.4 9.28 9.5 9.7 9.86 10 10.2 10.32 10.42 10.5 10.55 10.58 10.6]; x 0=[0.1,0.1,0.1];
min=inline ('x(1)*t.^2+x(2)*tax(3)','x','t');
x=lsqcurvefit(zuixiao,x0,t,y) %利用最小二乘拟合 其显示的结果为: x =
-0.0445 1.0711 4.3252
可以看出其得到的结果与politic函数的结果相同。这说明在多项式拟合问题上这两个函数的效果是相同的。
下面的一个例子将体现lsqcurvefit()函数的优势。
例2: 在物理学中,为研究某种材料应力与应变的关系,测得一组数据如下表:
应力σ 应变ε 925 0.11 1125 0.16 1625 0.35 2125 0.48 2625 0.61 3125 0.71 3625 0.85 如果假定应力与应变有如下关系(σ为应力值,ε为应变值): 试计算a 、b 的值。 MATLAB 的表达形式如下:
x= [925, 1125, 1625, 2125, 2625, 3125, 3625]; y= [0.11, 0.16, 0.35, 0.48, 0.61, 0.71,0.85 ]; Plot (t,y,’o')
[p,resid1]=politic(x, y, 2) Hold on
Xi=lenspiece (700, 3700, 3000); Yi =polygala (pox); Plot ( xi, y I ) X0= [0.1, 0.1];
Fife =inline ('a (1)+a(2)*log(x)','a' ,' x'); [a,resid2]=lsqcurvefit (ff f , x0,x,y) plot( xi, ff f a, xi),'r')
执行程序得到图3,图中蓝色曲线为利用prolific()函数得到的曲线,红色曲线为利用lsqcurvefit()函数得到的曲线;
4
0.90.80.70.60.50.40.30.20.10-0.15001000150020002500300035004000
其显示的结果为: p =
-0.0000 0.0004 -0.2266 resid1 =
R: [3x3 double] D f: 4 Norms: 0.0331 a =
-3.5810 0.5344 resid2 = 0.0064
其中a的值代表利用lsqcurvefit()函数得到的关系为:ε=-3.5810+0.5344σ
resid1、resid2 分别代表运用politic()函数、lsqcurvefit()函数得到的残差。可以看出利用lsqcurvefit()函数残差更小,即得到了更好的拟合效果。
在数学建模的实际问题中,如果问题的机理不明,我们只能采用politic()函数,即多项式拟合的方法,以获得近似的数据描述函数;但如果通过分析,可以得到一些机理,那么采用最小二乘的方法将得到更好的效果,而且得到的拟合函数也更有意义。 五、隐函数的图形绘制
plot()只能绘制显函数图形,对于形如
1?lny?ln(?1?y)?x?sin(x)?0的复杂隐函数,很难转化为y显函数并利用plot()函数绘制图形,这时就可以用employ()函数直接绘制其曲线。 MATLAB的表达形式如下:
>> e z plot ('1/y-log(y)+log(-1+y)+x-sin(x)') 执行程序得到图5
5