想象一下,我想在Octave z(var1, var2) = a(var1) + b(var1) + c(var2) + d(var2) + const
中定义一个函数。在此定义之前,我想定义所有必要的函数,例如:a(var1) = var1^2 + const
,b(var1) = cos(var1)
,c(var) = sqrt(var2 - const)
等。稍后,我添加所有这些函数并形成最终一,z
函数。之后,我想在[{1}}和z
方面获得函数var1
的偏导数。
到目前为止,我唯一担心的是定义上面的函数,以便像我想象的那样工作;它有可能吗?如何?
答案 0 :(得分:4)
您可以使用function handles和anonymous functions:
a = @(x) x^2 + c1;
b = @cos;
c = @(x) sqrt(x - c2);
d = @exp;
b
和d
是现有函数的句柄。您可以使用b(...)
或d(...)
将其称为常规功能。 a
和c
是匿名函数。它们在赋值中提供了句柄的参数列表和定义,有点像Python的lambdas。您可以执行b = @(x) cos(x)
之类的操作,但由于没有必要执行其他操作,因此没有任何意义。
现在你可以做到
z = @(x, y) a(x) + b(x) + c(y) + d(y) + c3;
另一种方法是为每个函数编写单独的m文件,我假设您要避免使用。
使用该函数,例如取偏导数,现在相当简单。调用函数句柄就像任何其他内置函数或m文件定义的函数一样:
(z(x + delta, y) - z(x - delta, y)) / (2 * delta)
<强>更新强>
为了好玩,我运行了以下脚本(在Red Hat 6.5上使用Octave 3.4.3):
octave:1> c1 = -100;
octave:2> c2 = -10;
octave:3> c3 = 42;
octave:4> a = @(x) x^2 + c1;
octave:5> b = @cos;
octave:6> c = @(x) sqrt(x - c2);
octave:7> d = @exp;
octave:8> z = @(x, y) a(x) + b(x) + c(y) + d(y) + c3;
octave:9> [X, Y] = meshgrid([-10:0.1:10], [-10:0.1:10]);
octave:10> surf(X, Y, z(X, Y));
结果不是特别有趣,但它确实证明了这种技术的有效性:
以下是一个IDEOne链接。