首页 > 解决方案 > 在 Matlab 或 Mathematica 中处理未知数量的变量

问题描述

我有一个算法可以为任何给定的 n 生成 n × n 矩阵 A。我的目标是使用 Matlab 或 Mathematica找到线性方程组 A x = 0的齐次系统的所有解。我先试试matlab。

尝试 1:我不能使用“linsolve”,因为 A 可能是单数。我想要所有的解决方案。

尝试 2:使用solve(eqns, vars, 'ReturnConditions', true). 但是,如何将 Ax 变成方程形式?似乎我需要一个 for 循环来将方程放入“eqns”,但是如何定义符号变量 x1、x2、...、xn?一开始我不知道 n 的值。这是我的伪代码:

read (n);    
for i=1:n %% i_th equation
       eq=[];
       for j=1:n
         eq=eq+A[i,j]*x[j]; %% keep adding terms
       end
       eq=eq+['==0']; %% add '==0' to make it an equation
       eqns=eqns+eq %% add the ith equation to the equation list
 end
 vars=[];
 for i=1:n 
     vars=vars+x[i];
 end
 solve(eqns, vars, 'ReturnConditions', true)

你能帮忙把它变成真正的 Matlab 或 Mathematica 代码吗?

标签: matlabvariableswolfram-mathematicasymbols

解决方案


Matlab 是为线性代数而设计的,因此A*x=0具有一个、多个或没有向量x作为解的方程也是如此。

Matlab 的问题是,它有很多方法可以给你一个解决方案,但不能给你所有的解决方案。线性系统的解Ax=b通常通过x = b\A(其中 x 在所有解中具有最小的 L0 范数,即最少的非零分量)或x=pinv(A)*b(其中 x 在所有解中具有最小的 L2 范数)获得。请参阅pinv 文档

但是在这种特殊情况下b=0,两者都会给出简单的解决方案x=0

现在,寻找x这样的值A*x=0只不过是寻找矩阵的内核A。而 Matlabnull函数就是这样做的。


推荐阅读