我正在尝试使用以下代码创建一个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);
但正如您所看到的,这种方法导致了许多不必要的代码。那么,我的第一种方法出了什么问题?
答案 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()
而不将矩阵转换为字符串则无法工作。
话虽这么说,我个人发现你的第二种方法,你手动填充元素,以便更清晰,更容易阅读。