2014-07-08 116 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()而不將矩陣轉換爲字符串,則不起作用。

這就是說,我個人發現你的第二種方法,你手動填寫的元素更清晰,更易於閱讀。