Octave 用倍频程写简单的方程

Octave 用倍频程写简单的方程,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的偏导数 到目前为止,我唯一关心的是定义上面的功能,使其按照我的想象工作;是否可能以及如何使用?您

假设我想定义一个八度音程
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
的偏导数

到目前为止,我唯一关心的是定义上面的功能,使其按照我的想象工作;是否可能以及如何使用?

您可以使用和:

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):

结果并不特别有趣,但它确实证明了该技术的有效性:


这里有一个链接可供使用。

符号偏导数或有限差分可以吗?因为我使用倍频程来测试一个复杂的方程,该方程将通过Java中的梯度下降算法最小化,似乎有限差分就是答案。还有,Octave是做这件事的工具吗?还是我应该转移到Matlab?Matlab可能会快一点,尽管Octave肯定会赶上。就我个人而言,与Python相比,我觉得两者都有点尴尬。感谢您的详细回复,乍一看非常好,我会在回家后进行测试,如果成功,我会将其标记为正确:)我希望您不介意编辑@MadPhysical。那阴谋实在是太难看了,哈哈。你一定用的是很旧的八度音阶@塔索帕帕斯泰利亚努。我是。新的情节看起来很好。是的,这些天八度音阶看起来确实很好。比起matlab,我更喜欢它。特别是对于情节,我发现它们看起来好多了!我的论文中所有的数字都用它。
(z(x + delta, y) - z(x - delta, y)) / (2 * delta)
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));