本博客向您介绍如何存储或访问向 MATLAB 复合函数(如 fzero 或 integral)传递的数学函数的额外参数。
MATLAB 复合函数基于某个值范围计算数学表达式。这些函数之所以称为复合函数是因为它们是接受函数句柄(函数的指针)作为输入的函数。这些函数的每一个都要求目标函数具有特定数量的输入变量。例如, fzero 和 integral 接受恰好具有一个输入变量的函数的句柄。
假设您需要在系数 b 和 c 具有不同的值时,计算三次多项式 x3 + bx + c 的零点。尽管您可以创建接受三个输入变量(x、b 和 c)的函数,但无法将需要所有这三个输入的函数句柄传递给 fzero。不过,您可以利用匿名函数或嵌套函数的属性来定义其他输入的值。
1.使用嵌套函数参数化
定义参数的一种方法是使用嵌套函数 - 完全包含于程序文件中另一个函数内的函数。对于此示例,将创建一个名为 findzero.m 的文件,该文件包含父函数 findzero 和嵌套函数 poly :
function y = findzero(b,c,x0)
y = fzero(@poly,x0);
function y = poly(x)
y = x^3 + b*x + c;
end
end
该嵌套函数定义具有一个输入变量 x 的三次多项式。父函数接受参数 b 和 c 作为输入值。将 poly 嵌套于findzero 内的原因是,嵌套函数共享其父函数的工作区。因此, poly 函数可以访问您传递给 findzero 的 b 和 c 的值。
要求 b = 2 和 c = 3.5 时多项式的零点,如果使用开始点 x0 = 0 ,则可以从命令行调用 findzero :
x = findzero(2,3.5,0)
x =
-1.0945
2.使用匿名函数进行参数化
访问额外参数的另一种方法是使用匿名函数。匿名函数是可以在单个命令中定义而无需创建一个单独程序文件的函数。这些函数可以使用当前工作区中可用的任何变量。例如,创建用于描述三次多项式的匿名函数的句柄并求零点:
b = 2;
c = 3.5;
cubicpoly = @(x) x^3 + b*x + c;
x = fzero(cubicpoly,0)
x =
-1.0945
变量 cubicpoly 是具有一个输入 x 的匿名函数的函数句柄。匿名函数的输入以包含在括号中的形式显示,并紧跟用于创建函数句柄的 @ 符号之后。由于在您创建 cubicpoly 时 b 和 c 位于工作区中,因此匿名函数不需要这些系数的输入。无需为匿名函数创建中间变量 cubicpoly 。可以将函数句柄的整个定义包含在对 fzero 的调用中:
b = 2;
c = 3.5;
x = fzero(@(x) x^3 + b*x + c,0)
x =
-1.0945
您也可以使用匿名函数调用在函数文件中定义的更复杂的目标函数。例如,假设存在具有以下函数定义的名为 cubicpoly.m 的文件:
function y = cubicpoly(x,b,c)
y = x^3 + b*x + c;
end
在命令行上,定义 b 和 c ,然后使用调用 cubicpoly 的匿名函数调用 fzero :
b = 2;
c = 3.5;
x = fzero(@(x) cubicpoly(x,b,c),0)
x =
-1.0945
注意 要更改参数的值,必须创建一个新匿名函数。例如:
b = 10;
c = 25;
x = fzero(@(x) x^3 + b*x + c,0);