【问题标题】:Writing simple equations in Octave用 Octave 编写简单的方程
【发布时间】:2016-09-02 20:34:56
【问题描述】:

假设我想在 Octave z(var1, var2) = a(var1) + b(var1) + c(var2) + d(var2) + const 中定义一个函数。在此定义之前,我想定义所有必要的函数,例如:a(var1) = var1^2 + constb(var1) = cos(var1)c(var) = sqrt(var2 - const) 等。稍后,我添加所有这些函数并形成最后一个函数,z 函数.之后,我想得到函数zvar1var2 的偏导数。

到目前为止,我唯一关心的是定义上面的函数以按我想象的那样工作;有可能吗?如何?

【问题讨论】:

  • 符号偏导或有限差分都可以吗?
  • 因为我使用 Octave 来测试一个复杂的方程,该方程将被 Java 中的梯度下降算法最小化,似乎有限差分就是答案。此外,Octave 是执行此操作的工具还是应该转移到 Matlab?
  • MATLAB 可能会快一点,尽管 Octave 肯定会迎头赶上。就个人而言,与 Python 相比,我觉得两者都有点尴尬。

标签: octave


【解决方案1】:

您可以使用function handlesanonymous functions

a = @(x) x^2 + c1;
b = @cos;
c = @(x) sqrt(x - c2);
d = @exp;

bd 是现有函数的句柄。您可以使用b(...)d(...) 将它们作为常规函数调用。 ac 是匿名函数。它们在赋值中提供参数列表和句柄定义,有点像 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 链接供您使用。

【讨论】:

  • 感谢您的详细回复,乍一看还不错,我回家测试一下,如果成功的话标记为正确:)
  • 我希望你不介意编辑@MadPhysicist。剧情太丑了,哈哈。您一定在使用 真的 旧版本的 Octave?!
  • @TasosPapastylianou。我是。新的情节看起来很不错。
  • 是的,这些天八度确实看起来非常好。我更喜欢它而不是matlab。特别是对于情节,我发现它们看起来好多了!我将它专门用于我论文中的所有数字。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2013-12-16
  • 2010-10-13
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多