使用函数元素创建符号矩阵

时间:2014-07-08 23:27:54

标签: matlab symbolic-math

我正在尝试使用以下代码创建一个nxm矩阵,其中的元素是其他符号变量的函数(在本例中为时间t):

syms t x(t) L
N = [                    0,                        0, ...
                         0,                        0;
                         0,                        0, ...
                         0,                        0;
 1 - 3*(x/L)^2 + 2*(x/L)^3, -x + 2*x^2/L - x^3/(L^2), ...
     3*(x/L)^2 - 2*(x/L)^3,        x^2/L - x^3/(L^2)];

我遇到的问题是MATLAB将矩阵N转换为函数,即N(t)。当我尝试访问特定成员时

N(1, 1)

或子矩阵

N(1, 3:4)

MATLAB收到以下错误:

Symbolic function expected 1 inputs and received 2.

我理解错误消息,但这不是我对代码的期望。我不想要一个取决于t的符号矩阵,在这种情况下我不理解MATLABS的行为(例如为什么N也不是L的函数或者其他什么)。解决方案是使用

创建零符号矩阵
N = sym(zeros(3, 4));

并手动填充元素

N(3, 1) = 1 - 3*(x/L)^2 + 2*(x/L)^3;
N(3, 2) = -x + 2*x^2/L - x^3/(L^2);
N(3, 3) = 3*(x/L)^2 - 2*(x/L)^3;
N(3, 4) = x^2/L - x^3/(L^2);

但正如您所看到的,这种方法导致了许多不必要的代码。那么,我的第一种方法出了什么问题?

1 个答案:

答案 0 :(得分:1)

当您定义x(t)时,它最终会成为符号函数(symfun)而不是符号对象,因为它依赖于t。然后将此依赖关系转移到矩阵N,使其成为依赖于t的符号函数(这解释了为什么它仅依赖于t而不依赖L)。

>> syms t x(t) L
>> N = ...
>> whos
   Name      Size            Bytes  Class     Attributes

   L         1x1               112  sym                 
   t         1x1               112  sym                 
   x         1x1               112  symfun  
   N         1x1               112  symfun 

您可以通过上面的解决方法避免自动转换为symfun,也可以在创建矩阵N时明确定义它,如下所示:

>> N = sym(char([    0,                        0, ...
                     0,                        0;
                     0,                        0, ...
                     0,                        0;
                     1 - 3*(x/L)^2 + 2*(x/L)^3, -x + 2*x^2/L - x^3/(L^2), ...
                     3*(x/L)^2 - 2*(x/L)^3,        x^2/L - x^3/(L^2)]));

这里的技巧是sym()char()函数的组合使用。如果您只使用sym()而不将矩阵转换为字符串则无法工作。

话虽这么说,我个人发现你的第二种方法,你手动填充元素,以便更清晰,更容易阅读。