Matlab学习系列14匿名函数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

14.匿名函数Matlab7.0以上版本开始引入匿名函数,它可以实现内联函数所有功能,而且代码更简捷高效。匿名函数的主要功能:(1)可以代替“将函数编写为单独的m-文件”;(2)可以实现符号函数的赋值运算;(3)很方便地对含参变量函数进行操作。(一)基本语法f=@(参数1,参数2,…)函数表达式其中,f为函数句柄,即调用匿名函数时使用的名字。例如,f=@(x,y)x^2+y^2;f(1,2)输出结果:ans=5输入参数也可以是向量,例如,f=@(x,y)x.^2+y.^2;a=1:1:10;b=10:-1:1;f(a,b)输出结果:ans=1018573656161657385101二重匿名函数:例如,f=@(a,b)@(x)a*x+b;其中,“a,b”是外层变量,“x”是内层变量。这样理解:每个“@”符号后面括号里的变量的作用域一直到表达式的结尾。例如对于“a=2,b=3”,f(2,3)是以x为变量的匿名函数:(f(2,3))(x)=2*x+3类似的可以定义多重匿名函数。(二)应用实例一、符号函数的赋值运算例1求下面函数的三阶导数在x=0.5的值,并绘制其在[0,1]上的图像:sin()(tan)xfxxx分析:先用符号运算得到三阶导数的解析表达式,再转化为匿名函数,再求值和绘图。代码:symsxf=(x+tan(x))^(sin(x));c=diff(f,3);f3=eval(['@(x)'vectorize(c)]);%vectorize函数的功能是使内联函数适合数组运算的法则f3(0.5)x=linspace(0,1,100);plot(x,f3(x),'linewidth',2)title('y=[x+tan(x)]\^(sin(x))三阶导数图像')xlabel('x')ylabel('y')运行结果:ans=4.3158二、求解方程与参数方程Matlab中求解连续函数f(x)=0的根的命令是:fzero(f,x0)其中,x0为寻找根的初始值。例2求下面方程的根:2100xxexx代码:f=@(x)exp(x)+x^2+x^(sqrt(x))-100;formatlong%设置更高的精度x0=fzero(f,3)00.20.40.60.81-12000-10000-8000-6000-4000-200002000y=[x+tan(x)]^(sin(x))三阶导数图像xyf(x0)%验证根运行结果:x0=4.163549956946139ans=2.842170943040401e-014例3若例2中的方程带有参数a,100xaxexx要求针对a在[0,2]上的不同取值求解方程,并绘制方程的解x与a的关系的图像。代码:f=@(a)@(x)exp(x)+x^a+x^(sqrt(x))-100;%相当于(f(a))(x)=exp(x)+x^a+x^(sqrt(x))-100formatlongfzero(f(1),4)%a=1时,求解方程的根x,初始值为4A=0:0.01:2;x=@(a)fzero(f(a),4);%带着参数a求解方程的根x,得到x=x(a)X=@(A)arrayfun(@(a)x(a),A);%x(a)只能接受标量a,处理成能接受向量AY=X(A);plot(A,Y,'*-')xlabel('$a$','interpreter','latex','fontsize',15)ylabel('$x$','interpreter','latex','fontsize',15)title('$\mathrm{e}^{x}+x^{\sqrt{x}}+x^a-100$','interpreter','latex','fontsize',15)%用latex格式输入要显示的公式运行结果:ans=4.315274301739397三、“显式”表示隐函数隐函数一般无法给出显式表达式,但借助匿名函数可以实现“已知隐函数表达式,对于给定的自变量x,可以通过数值方法求出因变量y”。例4“显式”表示下列隐函数:12()0yyyexxy其“显式表示”为:y=@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1);相当于求解满足“exp(y)+x^y)^(1/y)-x^2*y=0”的y=y(x),其中1是初始值。代码:y=@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1);%求解满足隐函数方程的y=y(x),由此可以计算x=某值时的y的值00.511.524.154.24.254.34.354.4formatlongy1=y(1)y2=y(2)y3=y(3)Y=@(X)arrayfun(@(x)y(x),X);%把y=y(x)处理成可以接受向量的形式Y(1:10)运行结果:y1=2.777942350124938y2=1.105452026515033y3=0.775941879211877ans=2.7779423501249381.1054520265150330.7759418792118770.6283593292510390.5425418176717300.4855906809132260.4446201689250790.4134938512082350.3888973988666000.368874717117660例5绘制下面隐函数的图像:2222sin(0.5)2exp0.5exp())3105zzzzxxyxyzy分析:借助匿名函数写出z=z(x,y)的“显式”表示,再绘图。代码:z=@(x,y)fzero(@(z)z-sin((z*x-0.5)^2+2*x*y^2-z/10)*...exp(-((x-0.5-exp(-y+z))^2+y^2-z/5+3)),rand);[X,Y]=meshgrid(-1:0.1:7,-2:0.1:2);Z=arrayfun(@(x,y)z(x,y),X,Y);surf(X,Y,Z)xlabel('\fontsize{15}\fontname{timesnewroman}x','color','b')ylabel('\fontsize{15}\fontname{timesnewroman}y','color','b')zlabel('\fontsize{15}\fontname{timesnewroman}z','color','b')title('\fontsize{15}\fontname{隶书}z(x,y)的函数图像','color','r')运行结果:四、应用到优化问题表示目标函数例6求下面函数的最小值:221122()32fxxxxx代码:f=@(x)3*x(1)^2+2*x(1)*x(2)+x(2)^2;x0=[1,1];%开始寻找最优解的初始值[x,fval]=fminunc(f,x0)运行结果:-202468-2-1012-0.04-0.0200.020.04xz(x,y)的函数图像yzx=1.0e-006*0.2541-0.2029fval=1.3173e-013五、已知被积函数、积分值,反求积分区域例7要使f(x)=(sin2x)/x2的积分值为0.99π,求其关于0对称的积分区域。分析:由于被积函数是偶函数、积分区域对称,故只需计算x0范围的积分区域,即求使00.99/2()0ufxdx的u.代码:u0=fzero(@(u)0.99*pi/2-quadl(@(x)sin(x).^2./(x.^2),0,u),1)运行结果:u0=32.3138故积分区域为[-32.3138,32.3138].六、和cell数组合用,批量执行函数例8用cell数组存储下面函数:23123()sin,()5,()sin(1/)fxxxfxxfxx求各个函数在x=2处的函数值。代码:fun=cell(3,1);fun{1}=@(x)x^2+sin(x);fun{2}=@(x)x^3-5;fun{3}=@(x)sin(1/sqrt(x));val=cellfun(@(x)x(2),fun)运行结果:val=4.90933.00000.6496参考文献[1]吴鹏.MATLAB高效编程技巧与应用:25个案例分析(第四章).北京航空航天大学出版社,2010.

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功