3

ユーザーからシステムの変数を受け入れる Matlab プログラムを作成しようとしていますが、システム パラメーターよりも多くの変数があります。具体的には、3 つの方程式の 6 つの変数:

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]';

変数の既知のサブセットが与えられた場合に、このシステムを解決できるようにしたいと考えています。たとえば、ユーザーがdT、を与えた場合M、システムは他の 3 つの変数について自明に解かれます。ユーザーがwNMを指定すると、解ける 3-DOF システムになります。等々。(ユーザーがシステムを過大または過小に指定すると、もちろんエラーが発生する可能性があります。)

これらの組み合わせのいずれかが与えられた場合、行列代数を使用して未知の量を計算するのは簡単です。しかし、シンボリックツールボックスを使用することを除いて、一般的なケースを解決する方法がわかりません(互換性の理由から使用したくない)。

このアプローチを始めたとき、このステップは簡単だと思っていましたが、私の線形代数は錆びています。簡単なものがありませんか?

4

3 に答える 3

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]'たとえば、inputを使用すると、結果が得られます[2 2 0 1 1 1]'。これはMLDIVIDEを使用します。私は線形代数に精通しておらず、PINV や他のものが優れているかどうかを判断できません。

于 2009-11-25T10:36:07.803 に答える
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 におけるこれらの要素のインデックスです。x の 4 番目、5 番目、6 番目の要素を既知のものとして選択しました。

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

ここで、これらの既知の変数に対して任意の数値を選択してみましょう。

xknown = [1; -3; 7.5];

A を、既知の変数と未知の変数に対応する 2 つの部分行列に分割します。

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

何が起こっているのかをより明確に示すために、これをすべて数行に拡張したことに注意してください。しかし、節約したいのであれば、すべてを 1 ~ 2 行のコードで実行できたはずです。

最後に、{l,d,T} などの他の数のセットを既知の数として選択した場合、結果のシステムは特異になることを確認してください。したがって、そのイベントを監視する必要があります。Aunknown のランクに対するテストは、問題を取り除くのに役立つ場合があります。または、pinv を使用してソリューションを構築することを選択することもできます。

于 2009-11-25T15:31:10.840 に答える
0

連立方程式は固定ですか?3 つの方程式に存在する変数を方程式ごとのリストに格納するとどうなるでしょうか。

(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これは、最初の方程式から簡単に得られます。したがって、最終的には 2 つの変数を含む 2 つの方程式になり、解かなければならない方程式系がわかります。

基本的には、単一の連立方程式に対する独自の単純なシンボリック ソルバーです。

于 2009-11-25T09:52:02.233 に答える