欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

使用匿名函数和内嵌函数处理多变量传递问题

发布时间:2025/4/16 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 使用匿名函数和内嵌函数处理多变量传递问题 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

问题:有一个多变量函数f(abcx),现需要分别在a=a0b=b0c=c0a=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
如下

<span style="color: rgb(0, 0, 255);">function</span> y_int=intpoly2<span style="color: rgb(0, 136, 0);">(</span>a,b,c<span style="color: rgb(0, 136, 0);">)</span> y_int=quad<span style="color: rgb(0, 136, 0);">(</span>@<span style="color: rgb(0, 136, 0);">(</span>x<span style="color: rgb(0, 136, 0);">)</span><span style="color: rgb(0, 136, 0);">(</span>poly2<span style="color: rgb(0, 136, 0);">(</span>a,b,c,x<span style="color: rgb(0, 136, 0);">)</span><span style="color: rgb(0, 136, 0);">)</span>, <span style="color: rgb(51, 51, 255);">0</span>,<span style="color: rgb(51, 51, 255);">1</span><span style="color: rgb(0, 136, 0);">)</span>; <span style="color: rgb(34, 139, 34);">%此处利用matlab内部函</span><span style="color: rgb(34, 139, 34);">%数quad(fun, x0,xt)进行积分,</span><span style="color: rgb(34, 139, 34);">%被积函数fun我们使用匿名函</span><span style="color: rgb(34, 139, 34);">%数“@(x)(poly2(a,b,c,x))”以便</span><span style="color: rgb(34, 139, 34);">%将自变量限制为x. </span><span style="color: rgb(0, 0, 255);">function</span> y=poly2<span style="color: rgb(0, 136, 0);">(</span>ai,bi,ci,x<span style="color: rgb(0, 136, 0);">)</span> <span style="color: rgb(34, 139, 34);">%此处定义一个多变量的子函数 poly2( a,b,c,x)</span> y=ai.*x.^<span style="color: rgb(51, 51, 255);">2</span>+bi.*x+ci; <span style="color: rgb(34, 139, 34);">%此处使用矩阵元素运算(.* 和.^)等便于</span><span style="color: rgb(34, 139, 34);">%被矩阵化的内部函数调用,且提高程序效率</span>

执行:

保存该文件并将matlab切换至该文件目录下,命令行输入intpoly2(1,2,3), 便给出积分结果ans=4.33

实际上,上例也可以简化成:

<span style="color: rgb(0, 0, 255);">function</span> y_int=intpoly2<span style="color: rgb(0, 136, 0);">(</span>a,b,c<span style="color: rgb(0, 136, 0);">)</span> y_int=quad<span style="color: rgb(0, 136, 0);">(</span>@<span style="color: rgb(0, 136, 0);">(</span>x<span style="color: rgb(0, 136, 0);">)</span><span style="color: rgb(0, 136, 0);">(</span>a.*x.^<span style="color: rgb(51, 51, 255);">2</span>+b.*x+c<span style="color: rgb(0, 136, 0);">)</span>, <span style="color: rgb(51, 51, 255);">0</span>,<span style="color: rgb(51, 51, 255);">1</span><span style="color: rgb(0, 136, 0);">)</span>; <span style="color: rgb(34, 139, 34);">%此处利用matlab内部函</span><span style="color: rgb(34, 139, 34);">%数quad(fun, x0,xt)进行积分,</span><span style="color: rgb(34, 139, 34);">%被积函数fun我们使用匿名函</span><span style="color: rgb(34, 139, 34);">%数@(x)(a.*x.^2+b.*x+c)以便</span><span style="color: rgb(34, 139, 34);">%将自变量限制为x. </span>

(2)使用nested function

编写函数保存为intnest.m, 内容如下

<span style="color: rgb(0, 0, 255);">function</span> y_int=intnest<span style="color: rgb(0, 136, 0);">(</span>a,b,c<span style="color: rgb(0, 136, 0);">)</span> y_int=quad<span style="color: rgb(0, 136, 0);">(</span>@poly2, <span style="color: rgb(51, 51, 255);">0</span>,<span style="color: rgb(51, 51, 255);">1</span><span style="color: rgb(0, 136, 0);">)</span>; <span style="color: rgb(34, 139, 34);">%此处利用matlab内部函</span><span style="color: rgb(34, 139, 34);">%数quad(fun, x0,xt)进行积分,</span><span style="color: rgb(34, 139, 34);">%被积函数fun我们使用内嵌函</span><span style="color: rgb(34, 139, 34);">%数poly2(x)的句柄@poly2 </span><span style="color: rgb(0, 0, 255);">function</span> y=poly2<span style="color: rgb(0, 136, 0);">(</span>x<span style="color: rgb(0, 136, 0);">)</span> <span style="color: rgb(34, 139, 34);">%此处定义一个内嵌函数 poly2( a,b,c,x) </span> y=a.*x.^<span style="color: rgb(51, 51, 255);">2</span>+b.*x+c; <span style="color: rgb(34, 139, 34);">%直接调用母函数中的变量a,b,c</span> <span style="color: rgb(0, 0, 255);">end</span> <span style="color: rgb(34, 139, 34);">% 结束内嵌函数poly2</span> <span style="color: rgb(0, 0, 255);">end</span> <span style="color: rgb(34, 139, 34);">% 结束母函数intpoly2</span>

保存后执行,同样效果。

可见nested
function只是将主调函数和被调函数封装到了一起以共享主调函数的变量。

总结

以上是生活随笔为你收集整理的使用匿名函数和内嵌函数处理多变量传递问题的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。