在 Octave 中编写简单的方程式
Writing simple equations in Octave
假设我想在 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
函数。之后,我想获得函数 z
关于 var1
和 var2
的偏导数。
到目前为止,我唯一关心的是定义上面的函数以按照我的想象工作;这可能吗?如何做到?
您可以使用 function handles and anonymous functions:
a = @(x) x^2 + c1;
b = @cos;
c = @(x) sqrt(x - c2);
d = @exp;
b
和 d
是现有函数的句柄。您可以使用 b(...)
或 d(...)
将它们作为常规函数调用。 a
和 c
是匿名函数。它们在赋值中提供参数列表和句柄的定义,有点像 Python 的 lambda。您可以执行类似 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 link 可以玩。
假设我想在 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
函数。之后,我想获得函数 z
关于 var1
和 var2
的偏导数。
到目前为止,我唯一关心的是定义上面的函数以按照我的想象工作;这可能吗?如何做到?
您可以使用 function handles and anonymous functions:
a = @(x) x^2 + c1;
b = @cos;
c = @(x) sqrt(x - c2);
d = @exp;
b
和 d
是现有函数的句柄。您可以使用 b(...)
或 d(...)
将它们作为常规函数调用。 a
和 c
是匿名函数。它们在赋值中提供参数列表和句柄的定义,有点像 Python 的 lambda。您可以执行类似 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 link 可以玩。