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

Matlab 使用函数元素创建符号矩阵,matlab,symbolic-math,Matlab,Symbolic Math,我试图创建一个nxm矩阵,其中的元素是其他符号变量(在本例中为时间t)的函数,代码如下: syms t x(t) L N = [ 0, 0, ... 0, 0; 0, 0, ...

我试图创建一个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);
但正如您所看到的,这种方法会产生大量不必要的代码。那么,我的第一种方法有什么问题呢?

当你定义
x(t)
时,由于它依赖于
t
,它最终成为一个符号函数(
symfun
),而不是一个符号对象。然后,此依赖关系被传递到矩阵
N
,使其成为依赖于
t
的符号函数(这解释了为什么它只依赖于
t
而不依赖于
L

通过上述解决方法,您可以避免自动转换为
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()
,而不将矩阵转换为字符串,则无法工作


话虽如此,我个人发现您的第二种方法是手动填充元素,使其更清晰、更易于阅读。

我找到了解决问题的另一种方法,但我并不十分满意,因为需要定义临时变量,这会使代码非常快地膨胀。其思想是在x(t)旁边创建第二个符号变量,该变量不依赖于使用sym x_的其他变量。然后我用x_u而不是x(t)重写N,然后用subs命令将x(t)替换回矩阵。我只是注意到,当我尝试积分或微分时,这种方法变得更加奇怪,因为MATLAB不允许对因变量(或函数或w/e MATLAB解释它们)进行积分/微分或其衍生物。所以我必须创建额外的变量,比如x和x来处理所有的导数。这是MATLAB的预期工作流程吗?
>> 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)]));