代码之家  ›  专栏  ›  技术社区  ›  Will Robertson

超参数系统中变量的求解

  •  3
  • Will Robertson  · 技术社区  · 16 年前

    我正在尝试编写一个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 , 米 从而成为一个可解的三自由度系统。等等。(如果用户过度或过低指定了系统,那么当然会导致错误。)

    给出任何 一 在这些组合中,(先验的)使用矩阵代数来计算未知量是很简单的。但除了使用符号工具箱(出于兼容性原因,我不喜欢这样做),我不知道如何解决一般情况。

    当我开始使用这种方法时,我认为这一步很容易,但是我的线性代数已经过时了;我是否遗漏了一些简单的东西?

    3 回复  |  直到 16 年前
        1
  •  4
  •   mtrw    16 年前

    首先,让 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或其他什么东西会更好。

        2
  •  3
  •   user85109    16 年前

    给定线性系统

    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,那么得到的系统将是奇异的。所以你必须注意那个事件。一个关于未知等级的测试可能有助于排除这些问题。或者您可以选择使用PINv来构建解决方案。

        3
  •  0
  •   Sebastian    16 年前

    方程组是固定的?如果将三个方程中的变量存储在每个方程的列表中,会怎么样?

    (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 从第一个方程。因此,你最终会得到两个包含两个变量的方程,你知道你要解的方程组。

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