2014-07-08 74 views
3

我试图创建与其他符号变量的函数(时间t在这种情况下)的元素与下面的代码的n×m矩阵:创建功能元素符号矩阵

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 trows以下错误:

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

我发现了另一个解决方案来解决我的问题,但是我不是很满意它,因为临时变量需要定义,并且代码速度很快。这个想法是在x(t)旁创建第二个符号变量,它不依赖于使用sym x_的其他变量。然后我用x_而不是x(t)重写N,之后用subs命令将x(t)替换回矩阵中。 – rocketsound

+0

我刚刚注意到,当我尝试集成或区分时,这种方法变得更奇怪,因为MATLAB不允许关于因变量(或函数或w/e MATLAB解释它们)或其派生物的集成/区分。所以我必须创建像x__和x___这样的其他变量来处理所有派生。这是MATLAB的预期工作流程吗? – rocketsound

回答

1

当您定义x(t)时,由于其依赖于t,因此它最终会作为符号函数(symfun)而不是符号对象。然后将这种依赖关系转交给您的矩阵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()而不将矩阵转换为字符串,则不起作用。

这就是说,我个人发现你的第二种方法,你手动填写的元素更清晰,更易于阅读。