问题:有一个多变量函数 f(abcx) ,现需要分别在 a=a0b=b0c=c0 和 a=a1b=b1c=c1 的条件下对 f(abcx) 进行某一操作。
此类问题常在数值积分时出现。
解决方案:
1. 使用全局变量
可在主调函数和被调函数中分别将a,b,c声明为全局变量(
global a b c
),这时f通过全局变量传递abc, 定义时可以只有一个参数x。2. 使用anonymous function
3. 使用 nested function
下面举例说明anonymous function和nested function的使用。
例:对任意二次多项式进行数
此处显然可以解析得到,此例使用anonymous
function做演示)
解:(1)使用匿名函数
编写文件intpoly2.m
如下
function y_int=intpoly2(a,b,c) y_int=quad(@(x)(poly2(a,b,c,x)), 0,1); %此处利用matlab内部函 %数quad(fun, x0,xt)进行积分, %被积函数fun我们使用匿名函 %数“@(x)(poly2(a,b,c,x))”以便 %将自变量限制为x. function y=poly2(ai,bi,ci,x) %此处定义一个多变量的子函数 poly2( a,b,c,x) y=ai.*x.^2+bi.*x+ci; %此处使用矩阵元素运算(.* 和.^)等便于 %被矩阵化的内部函数调用,且提高程序效率
执行:
保存该文件并将matlab切换至该文件目录下,命令行输入intpoly2(1,2,3), 便给出积分结果ans=4.33
实际上,上例也可以简化成:
function y_int=intpoly2(a,b,c) y_int=quad(@(x)(a.*x.^2+b.*x+c), 0,1); %此处利用matlab内部函 %数quad(fun, x0,xt)进行积分, %被积函数fun我们使用匿名函 %数@(x)(a.*x.^2+b.*x+c)以便 %将自变量限制为x.
(2)使用nested function
编写函数保存为intnest.m, 内容如下
function y_int=intnest(a,b,c) y_int=quad(@poly2, 0,1); %此处利用matlab内部函 %数quad(fun, x0,xt)进行积分, %被积函数fun我们使用内嵌函 %数poly2(x)的句柄@poly2 function y=poly2(x) %此处定义一个内嵌函数 poly2( a,b,c,x) y=a.*x.^2+b.*x+c; %直接调用母函数中的变量a,b,c end % 结束内嵌函数poly2 end % 结束母函数intpoly2
保存后执行,同样效果。
可见nested
function只是将主调函数和被调函数封装到了一起以共享主调函数的变量。
注意:一般函数不需要end,当出现nested function时,主调函数和被调函数都必须有end 来结束!