0

我有一个矩阵,A

A=[ x.^2 + y , 0;
    0 , x.^2 + y ] 

我还有一个运算符矩阵D

D = [d/dx  ,  0;
     0   ,  d/dy ]

我希望能够相乘D*A并得到一个如下所示的矩阵:

 B =    [ diff(A(1,1),x) , 0 ;
         0  , diff(A(2,2),y) ]

显然我不能用 diff() 函数做到这一点,因为该函数不是可以乘以函数的运算符。那么如何使用符号运算符来解决这个问题呢?实际上,我的矩阵很大,因此在没有运算符乘法的情况下执行是不可取的。

另外,假设我找到了一种生成上述B矩阵的方法,如下所示:

B =
[ 2*x, 0
   0, 1]

B例如,我如何评估x=2, y=1;

我的尝试:

subs(B,x,2,y,1)

但这显然是sym.subs函数的不正确参数

我也试过:

subs(B,2,1) 

这也不起作用,所以我的另一个问题是如何在矩阵中替换x和替换。yB

4

2 回答 2

0

对于您的第二个问题:用多个值替换符号变量的语法是

subs(B, {x,y}, {2,1})

(并且help subs在 Matlab 命令提示符下输入会给出这个例子)。

首先:您通过矢量化符号导数来加速计算符号导数的想法行不通。向量化对于可以由一些旨在处理数组的现有 C++ 库批量执行的低级操作是有意义的。符号微分是完全不同的:每个表达式都有一个复杂的算法要运行。使用 for 循环查找多个符号导数是合适的,无论有多少。如果需要很长时间,那是因为获取大量符号导数需要很长时间。

我要寻找的一种可能的优化是在矩阵 B 中的函数之间找到共同的元素,以便它们可以被区分一次。但这需要处理矩阵中包含哪些函数的细节。

于 2016-01-07T01:29:56.340 回答
0

看看这里:https ://www.mathworks.com/matlabcentral/answers/36580-operator-matrix-for-matrix-differentiation

function dNdv = diffmtx(v,N)
    % v -vector m x 1 - sym array
    % N - matrix m x n - sym array
    rz = arrayfun(@(ii)diff(N(ii,:),v(ii)),(1:numel(v)).','un',0);
    dNdv = cat(1,rz{:});
end
于 2021-02-24T01:09:14.177 回答