通过微分算子乘以符号函数来创建导数

时间:2016-01-06 23:59:40

标签: matlab matrix operators symbolic-math symbolic-computation

我有一个矩阵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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分: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