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

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 ,您会得到 result [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 划分为两个子矩阵,对应于已知变量和未知变量。

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 来构建解决方案。

于 2009-11-25T15:31:10.840 回答
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从第一个等式中轻松地给你。因此,您最终会得到两个包含两个变量的方程,并且您知道必须求解的方程组。

它基本上是您自己的单一方程组的简单符号求解器。

于 2009-11-25T09:52:02.233 回答