《基于MATLAB的數(shù)值分析.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于MATLAB的數(shù)值分析.ppt(31頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、第五章 自定義函數(shù)的計(jì)算,,,,,函數(shù)的創(chuàng)建 用M文件 function f=fun(x) f=1./(1+x.2); 內(nèi)聯(lián)函數(shù) y=inline((3*x2-1)/2,x); 3.字符串表達(dá)式(函數(shù)) theta=t/2,y=sin(theta) 4.符號(hào)函數(shù),5.1 字符串?dāng)?shù)組,,一、字符串入門,,,【例1】先實(shí)際操作 本例,以體會(huì)數(shù)值量 與字符串的區(qū)別。 clear a=12345.6789 class(a) a_s=size(a),a = 1.2346e+004 ans = double a_s = 1 1,b=S class(b) b_s=size(b) b = S ans
2、= char b_s = 1 1,whos Name Size Bytes Class a 1x1 8 double array a_s 1x2 16 double array ans 1x4 8 char array b 1x1 2 char array b_s 1x2 16 double array,【例2】本例演示:串的基本屬性、標(biāo)識(shí)和簡單操作。 (1) 創(chuàng)建串?dāng)?shù)組 a=This is an example. a = This is an example.,(2)串?dāng)?shù)組a的大小 size(a) ans = 1 19,(3)串?dāng)?shù)組的元素標(biāo)識(shí) a14=a(1:4)
3、 ra=a(end:-1:1) a14 = This ra = .elpmaxe na si sihT,【例3】中文字符串?dāng)?shù)組 A=這是一個(gè)算例。; A_s=size(A) A56=A(5 6),A_s = 1 7 A56 = 算例,【例4】由小串構(gòu)成大串 b=Example 3.1.2-1 b = Example 3.1.2-1 ab=a(1:7), ,b, . ab = This is Example 3.1.2-1 .,二、復(fù)雜串?dāng)?shù)組的創(chuàng)建,【例1】多行串?dāng)?shù)組的直接輸入示例。 clear S=This string array has multiple rows. S = This
4、 string array has multiple rows. size(S) ans = 2 18,【例2】演示:用專門函數(shù)char , str2mat , strvcat 創(chuàng)建多行串?dāng)?shù)組示例。 S1=char(This string array,has two rows.) S1 = This string array has two rows.,S2=str2mat(這,字符,串?dāng)?shù)組, ,由4行組成) S2 = 這 字符 串?dāng)?shù)組 由4行組成,S3=strvcat(這,字符,串?dāng)?shù)組, ,由4行組成),5.2 串演算函數(shù),,,,,,為了提高計(jì)算的靈活性,MATLAB提供了一種利用 字符
5、串進(jìn)行計(jì)算的能力。利用字符串可以構(gòu)成函數(shù),可以在運(yùn)行中改變所執(zhí)行的指令,可以被泛涵指令調(diào)用實(shí)現(xiàn)比較復(fù)雜的求零點(diǎn)、求極值等運(yùn)算。,一、 eval,y=eval(CEM) y1,y2,=eval(CEM),注: (1) eval指令的輸入宗量必須是字符串。 (2)構(gòu)成字符串的CEM,可以是MATLAB任何合 法的指令、表達(dá)式、語句、或M文件名。 (3)第二種格式中的CEM只能是(包含輸入宗量 在內(nèi)的) M函數(shù)文件名。,【例】計(jì)算“語句”串,創(chuàng)建變量。 clear,t=pi; eval(theta=t/2,y=sin(theta)); theta = 1.5708 y = 1,【例】計(jì)算“
6、表達(dá)式”串,產(chǎn)生向量值。 clear,t=pi;cem=t/2,t*2,sin(t);y=eval(cem) y = 1.5708 6.2832 0.0000,【例】計(jì)算“替代”串。 A=ones(2,1);B=ones(1,3);c=eval(B*A,A*B),errmessage=lasterr c = 1 1 1 1 1 1 errmessage = Error using == * Inner matrix dimensions must agree.,【例】計(jì)算“合成”串。 CEM=cos,sin,tan; for k=1:3 theta=pi*k/12; y(1,k)=
7、eval(CEM1,(,num2str(theta),)); end y y = 0.9659 0.8660 0.7071,y1,y2,=feval(F,arg1,arg2,) F 可以是函數(shù)句柄,函數(shù)名字符串,內(nèi)聯(lián)函數(shù) feval與函數(shù)句柄配套使用,【例】對字符串類型函數(shù)只能用eval ,而不能用feval。 x=pi/4; Ve=eval(1+sin(x)) Ve = 1.7071 Vf=feval(1+sin(x),x) ??? Error using == feval Invalid function name 1+sin(x).,二、 feval,【例】函數(shù)句柄只能被feval
8、運(yùn)用,而不能被eval 調(diào)用。 (1)函數(shù)句柄被feval調(diào)用 rand(seed,1);A=rand(2,2); Heig=eig; d=feval(Heig,A) d = 0.7568 -0.1488,(2)eval不能對函數(shù)句柄進(jìn)行操作 de=eval(Heig,A) ??? Error using == eval Function eval not defined for variables of class function_handle.,(3)feval能對函數(shù)名字符串進(jìn)行操作 dn=feval(eig, A) dn = 0.7568 -0.1488,dn=feval(sin
9、, pi/2) dn = 1,【例】feval 和eval 調(diào)用區(qū)別:feval 的FN只接受函數(shù)名。 本例兩種方法以后者為好。 randn(seed,1);A=rand(2,2); ue,de,ve=eval(svd(A)); disp(Results by eval); disp(ue,de,ve);disp(blanks(1)) uf,df,vf=feval(svd,A); disp(Results by feval);disp(uf,df,vf) Results by eval -0.9193 -0.3936 1.2212 0 -0.7897 -0.6135 -0.3936 0
10、.9193 0 0.2633 -0.6135 0.7897 Results by feval -0.9193 -0.3936 1.2212 0 -0.7897 -0.6135 -0.3936 0.9193 0 0.2633 -0.6135 0.7897,三、 內(nèi)聯(lián)函數(shù) inline(CE) inline(CE,arg1,arg2,) inline(CE,n),注: CE字符串, CE必須是不包含賦值號(hào)=的表達(dá) 式。 (2)內(nèi)聯(lián)函數(shù)是溝通eval,feval兩個(gè)不同指令的橋梁。 凡eval可以運(yùn)作的表達(dá)式,都可以通過inline轉(zhuǎn)化為內(nèi)聯(lián)函數(shù),而
11、這種內(nèi)聯(lián)函數(shù)總可以被feval使用。 (3)第三種調(diào)用格式最簡練,但對輸入宗量的字符限制嚴(yán)格。輸入宗量的字符只能是x,P1,P2,,Pn.,,(2)使適應(yīng)數(shù)組運(yùn)算規(guī)則 GG=vectorize(G) GG = Inline function: GG(a,x,y) = a.*exp(x).*cos(y) GG(2,1,2,pi/3,pi) ans = 2.7183 -14.7781,【例】用內(nèi)聯(lián)函數(shù)對象實(shí)現(xiàn)。 (1)創(chuàng)建帶一個(gè)參量的二元函數(shù) G=inline(a*exp(x)*cos(y),a,x,y);,【例】演示:內(nèi)聯(lián)函數(shù)的第一種創(chuàng)建格式;使內(nèi)聯(lián)函數(shù)適于“數(shù)組運(yùn)算”。 clear,F1
12、=inline(sin(rho)/rho) F1 = Inline function: F1(rho) = sin(rho)/rho f1=F1(2) f1 = 0.4546 FF1=vectorize(F1) xx=0.5,1,1.5,2;ff1=FF1(xx) FF1 = Inline function: FF1(rho) = sin(rho)./rho ff1 = 0.9589 0.8415 0.6650 0.4546,【例】演示:產(chǎn)生向量輸入、向量輸出的內(nèi)聯(lián)函數(shù); 這種向量函數(shù)的調(diào)用方法。 Y2=inline(x(1)2;3*x(1)*sin(x(2))) argnames
13、(Y2) Y2 = Inline function: Y2(x) = x(1)2;3*x(1)*sin(x(2)) ans = x x=4,pi/6; y2=Y2(x) y2 = 16.0000 6.0000,【例】演示:最簡練格式創(chuàng)建內(nèi)聯(lián)函數(shù);內(nèi)聯(lián)函數(shù)可 被feval 指令調(diào)用。 Z2=inline(P1*x*sin(x2+P2),2) Z2 = Inline function: Z2(x,P1,P2) = P1*x*sin(x2+P2) z2=Z2(2,2,3) fz2=feval(Z2,2,2,3) z2 = 2.6279 fz2 = 2.6279,5.3 函數(shù)句柄,
14、引入函數(shù)句柄使“函數(shù)調(diào)用”像“變量調(diào)用”一樣靈活方便。,一、函數(shù)句柄的創(chuàng)建 (1) 利用符號(hào) (2) 利用轉(zhuǎn)換函數(shù)str2func,,【例】為MATLAB的“內(nèi)建”函數(shù)創(chuàng)建函數(shù)句柄,并觀察其內(nèi)涵。 (1)創(chuàng)建函數(shù)句柄 hsin=sin; (2)類型判別 class(hsin) size(hsin) ans = function_handle ans = 1 1,,,二、函數(shù)句柄的基本用法 ao1,ao2,,aon=FunName(ai1,ai2,,ain) Hfun=FunName; ao1,ao2,,aon=feval(Hfun,ai1,ai2,,ain),【例】本例通過si
15、n函數(shù)及其句柄演示若干基本用法。 (1)函數(shù)句柄的創(chuàng)建 fhandle=str2func(sin); (2)函數(shù)句柄在“數(shù)值計(jì)算”中的情況 ys=sin(pi/4) yfold=feval(sin,pi/4) yfnew=feval(fhandle,pi/4) ys = 0.7071 yfold = 0.7071 yfnew = 0.7071,(3)函數(shù)句柄在“符號(hào)計(jì)算”中的情況 Alpha=sym(pi/4); yss=sin(Alpha) yfold=feval(sin,Alpha) ynews=feval(fhandle,Alpha) yss = 1/2*2(1/2) yfold
16、 = 1/2*2(1/2) ynews = 1/2*2(1/2),(4)函數(shù)句柄在泛函指令中的用法 在0,2間求sin函數(shù)的極小值點(diǎn)的位置。 xold=fminbnd(sin,0,2*pi) xnew=fminbnd(fhandle,0,2*pi) xold = 4.7124 xnew = 4.7124,【例】自建函數(shù)及其句柄的使用。通過本例可看到:只要在當(dāng)前MATLAB工作空間中存在函數(shù)句柄,那末不管該函數(shù)當(dāng)前是否在搜索范圍內(nèi),均可通過函數(shù)句柄實(shí)現(xiàn)正確的運(yùn)作。 (1)zzy076_3.m function Hr=zzy076_3(flag ) % ZZY076_3 為演示函數(shù)、子函數(shù)句柄
17、而設(shè)計(jì)的繪圖文件。 % flag 可以取字符串line或 circle。 t=(0:100)/100*2*pi; x=sin(t); y=cos(t); Hr=cirline; %創(chuàng)建子函數(shù)的句柄 feval(Hr,flag,x,y,t),%-------------subfunction--------------------- function cirline(wd,x,y,t) % wd 接受字符串line或circle % t 畫線用的獨(dú)立參變量 % x 由t產(chǎn)生的橫坐標(biāo)變量 % y 由t產(chǎn)生的縱坐標(biāo)變量 switch wd case line plot(t,x,b
18、 ,t,y,r,LineWidth,2) case circle plot(x,y,g.,MarkerSize,30), axis square off otherwise error(輸入宗量只能取 line 或 circle ! ) end shg,(2) Hzzy076_3=zzy076_3 zzy076_3(line); Hzzy076_3 = zzy076_3,,HCL=zzy076_3(circle) HCL = cirline,,,【例】用簡單算例演示subs的置換規(guī)則。 syms x;f=2*sin(x)+5; f2=subs(f,x,pi/3) f2 = 6.7321,5.4 符號(hào)函數(shù),