处理函数Matlab



我开始在Matlab中使用函数句柄,我有一个问题,当我这样做时,Matlab会计算什么:

y = (0:.1:1)';
fun = @(x) x(1) + x(2).^2 + exp(x(3)*y)

以及当我这样做时Matlab计算的内容:

fun = @(x) x + x.^2 + exp(x*y)

因为我正在评估这些函数的雅可比矩阵(来自这段代码(,它给出了不同的结果。我不明白放x(I(或只放x 的区别

让我们将向量vec定义为vec = [1, 2, 3]

当您在第一个函数中使用这个vec作为results = fun(vec)时,程序将只接受向量的特定元素,即x(1) = vec(1)x(2) = vec(2)x(3) = vec(3)。整个表达式将看起来像

results = vec(1) + vec(2).^2 + exp(vec(3)*y)

或更好的

results = 1 + 2^2 + exp(3*y) 

然而,当您将第二个表达式用作results = fun(vec)时,它将在所有类似的情况下使用整个向量vec

results = vec + vec.^2 + exp(vec*y)

或更好的

results = [1, 2, 3] + [1^2, 2^2, 3^2] + exp([1, 2, 3]*y)

您还可以清楚地看到,在第一种情况下,我实际上不需要关心矩阵维度,results变量的最终维度与y变量的维度相同。第二个示例中的情况并非如此,因为将矩阵vecy相乘(在这个特定示例中(会导致错误,因为vec变量具有维度1x3y变量11x1

如果您想对此进行研究,我建议您将其拆分为子表达式并进行调试,例如

f1 = @(x) x(1);
f2 = @(x) x(2).^2;
f3 = @(x) exp(x(3)*y);
f  = @(x) f1(x) + f1(x) + f3(x)

如果有任何子表达式不清楚,您可以将其进一步拆分。

区别在于,一个是数组乘法(x * y,我假设x是一个有11列的数组,以便矩阵乘法保持一致(,另一个是标量数组乘法(x(3) * y(。任何矩阵的下标算子(n)从该矩阵中提取第n个值。对于标量,索引只能是1。对于1D阵列,它提取列/行向量的第n个元素。对于二维数组,当按列遍历时,它是第n个元素。

此外,如果你只需要一阶导数,我建议使用复数阶微分。它提供了减少的数值误差并且在计算上是有效的。

相关内容

  • 没有找到相关文章