2009-11-25 34 views
3

我正在嘗試編寫一個Matlab程序,該程序接受來自用戶的系統變量,但存在比系統參數更多的變量。具體而言,六個變量在三個方程:在超參數化系統中求解變量

w - d - M = 0 
l - d - T = 0 
N - T + M = 0 

這可以用矩陣形式表示爲A*x=0其中

A = [1 0 0 -1 0 -1; 
    0 1 0 -1 -1 0; 
    0 0 1 0 -1 1]; 

x = [w l N d T M]'; 

我希望能夠解決這個系統給出的已知子集變量。例如,如果用戶給出d,T,M,那麼對於其他三個變量,系統可以得到平凡解決。如果用戶提供w,N,M,則它變成可解的3-DOF系統。等等。 (如果用戶過度或不足指定系統然後錯誤當然可以結果。的)

鑑於這些組合起來很簡單的任何一個(先驗)使用矩陣代數來計算未知量。但我不知道如何解決一般情況,除了使用符號工具箱(爲了兼容性原因,我不想這麼做)。

當我開始使用這種方法時,我認爲這一步很簡單,但我的線性代數是生鏽的;我錯過了一些簡單的東西嗎

回答

4

首先,讓x爲具有未知值的NaN的向量。這允許您使用ISNAN來查找未知數的獨立性。如果只計算用戶指定的術語A*x,則會給出一列常量b。將這些常數放在等式的右邊,並且您有一個形式爲A*x = -b的等式。

A = [1 0 0 -1 0 -1; 
    0 1 0 -1 -1 0; 
    0 0 1 0 -1 1]; 

idx = ~isnan(x); 
b = A(:,idx)*x(idx); % user provided constants 
z = A(:,~idx)\(-b); % solution of Ax = -b 
x(~idx) = z; 

隨着輸入x = [NaN NaN NaN 1 1 1]',例如,你得到的結果[2 2 0 1 1 1]'。這使用MLDIVIDE,我不太熟悉線性代數,知道PINV或其他什麼會更好。

+0

這看起來很有前途,謝謝! – 2009-11-25 12:12:43

+0

事實上,它就像一個魅力:)看到解決方案之後,我應該能夠爲自己想象......對我來說,太長的一個晚上,我想! – 2009-11-25 12:30:56

0

方程組是固定的嗎?如果你存儲存在的變量在三個方程中的每公式列表:

(w, d, M) 
(l, d, T) 
(N, T, M) 

然後你得到了用戶的輸入,你可以計算出每個方程在給定的變量數:

User input: w, N, M 
Given variables: 
(w, d, M) -> 2 
(l, d, T) -> 0 
(N, T, M) -> 1 

這可以從第一個等式中得到d。因此,你最終得到兩個包含兩個變量的方程,並且你知道你需要解決的方程系統。

它基本上是您自己的簡單符號求解器,適用於單個方程組。

+0

是的,這就是我想要做的......但這是我在這裏遇到麻煩時遺漏的細節。我同意用代數方法很容易,但棘手的部分通常是這樣做的(但也許我總是過於樂觀/雄心勃勃)。 – 2009-11-25 12:10:38

3

鑑於線性系統

A = [1 0 0 -1 0 -1; 
    0 1 0 -1 -1 0; 
    0 0 1 0 -1 1]; 

A*x = 0 

其中x的元素被確定爲:

x = [w l N d T M]'; 

現在,假設{d,T,M}已經已知的固定值。我們需要的是這些元素的索引。我們選擇了x的第4,第5和第6個元素作爲知識。

known_idx = [4 5 6]; 
unknown_idx = setdiff(1:6,known_idx); 

現在,讓我爲這些已知變量挑選一些任意數字。

xknown = [1; -3; 7.5]; 

我們將A分成兩個子矩陣,分別對應已知和未知變量。

Aknown = A(:,known_idx); 
Aunknown = A(:,unknown_idx); 

現在,將已知值移動到相等的右側,然後求解。看到Aknown是一個3x3矩陣,所以問題是(希望)很好地提出。

xunknown = Aunknown\(-Aknown*xknown) 
xunknown = 
     -8.5 
      2 
     10.5 

將這一切結合到最終的解決方案中。

x = zeros(6,1); 
x(known_idx) = xknown; 
x(unknown_idx) = xunknown; 
x = 
     -8.5 
      2 
     10.5 
      1 
      -3 
      7.5 

請注意,我已將這一切擴展爲幾行,以便更清楚地顯示發生的情況。但是我可以在一行或兩行代碼中完成所有工作,但我希望能夠簡化。

最後,看看我選擇了其他幾組數字作爲知識,例如{l,d,T},那麼所得到的系統將是單數的。所以你必須注意那個事件。對Aunknown排名進行測試可能有助於清除問題。或者你可以選擇使用pinv來構建解決方案。