Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MATLAB';s符号引擎求解4乘4线性系统_Matlab_Linear Algebra - Fatal编程技术网

使用MATLAB';s符号引擎求解4乘4线性系统

使用MATLAB';s符号引擎求解4乘4线性系统,matlab,linear-algebra,Matlab,Linear Algebra,在我看来,这是一个非常简单的符号数学问题。我有一个由4个方程和4个未知数组成的线性系统。这些系数是非数值常数。我用MATLAB编写了这个问题。我的代码如下。它运行了几个小时,然后我关闭了它。对我来说,我应该在几分钟内得到答案。我不确定是什么问题 syms a b c d e f g h k l m n o p q r W X Y Z A B eqn1=a*W+b*X+c*Y+d*Z==A; eqn2=e*W+f*X+g*Y+h*Z==B; eqn3=k*W+l*X+m*Y+n*Z==0; eqn

在我看来,这是一个非常简单的符号数学问题。我有一个由4个方程和4个未知数组成的线性系统。这些系数是非数值常数。我用MATLAB编写了这个问题。我的代码如下。它运行了几个小时,然后我关闭了它。对我来说,我应该在几分钟内得到答案。我不确定是什么问题

syms a b c d e f g h k l m n o p q r W X Y Z A B
eqn1=a*W+b*X+c*Y+d*Z==A;
eqn2=e*W+f*X+g*Y+h*Z==B;
eqn3=k*W+l*X+m*Y+n*Z==0;
eqn4=o*W+p*X+q*Y+r*Z==0;

Soln=solve([eqn1,eqn2,eqn3,eqn4],[W,X,Y,Z],'ReturnConditions',true);
SolnW=Soln.W
SolnX=Soln.X
SolnY=Soln.Y
SolnZ=Soln.Z
Conditions=Soln.conditions
Parameters=Soln.parameters
我有两个问题

(1) 我处理这个问题的方法有效吗?例如,也许MATHEMATICA或MAPLE更适合这份工作


(2) 我期待着一个类似克拉默的解决方案,其中的术语表示扩展形式的行列式。当然,这会很难看。有没有办法让MATLAB以代数方式简化结果?

使用MATLAB和线性系统,你应该采取不同的方法,像这样处理矩阵,MATLAB非常喜欢处理矩阵,所以这是你应该使用MATLAB的方法。那么您的代码就相当快了:

>> syms a b c d e f g h k l m n o p q r W X Y Z A B
>> eqn1=a*W+b*X+c*Y+d*Z==A;
eqn2=e*W+f*X+g*Y+h*Z==B;
eqn3=k*W+l*X+m*Y+n*Z==0;
eqn4=o*W+p*X+q*Y+r*Z==0;
>> [A,B] = equationsToMatrix([eqn1, eqn2, eqn3, eqn4], [W, X, Y,Z])

A =

[ a, b, c, d]
[ e, f, g, h]
[ k, l, m, n]
[ o, p, q, r]


B =

 A
 B
 0
 0

>> linsolve(A,B)

ans =

 -(B*b*m*r - B*b*n*q - B*c*l*r + B*c*n*p + B*d*l*q - B*d*m*p - A*f*m*r + A*f*n*q + A*g*l*r - A*g*n*p - A*h*l*q + A*h*m*p)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o)
  (B*a*m*r - B*a*n*q - B*c*k*r + B*c*n*o + B*d*k*q - B*d*m*o - A*e*m*r + A*e*n*q + A*g*k*r - A*g*n*o - A*h*k*q + A*h*m*o)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o)
 -(B*a*l*r - B*a*n*p - B*b*k*r + B*b*n*o + B*d*k*p - B*d*l*o - A*e*l*r + A*e*n*p + A*f*k*r - A*f*n*o - A*h*k*p + A*h*l*o)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o)
  (B*a*l*q - B*a*m*p - B*b*k*q + B*b*m*o + B*c*k*p - B*c*l*o - A*e*l*q + A*e*m*p + A*f*k*q - A*f*m*o - A*g*k*p + A*g*l*o)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o)

我希望这有帮助。这是一个非常笼统的答案,因此您应该用

限制可能的值。请将您的代码格式化为代码并删除所有多余的白线。谢谢。这很有帮助。如果我现在想符号化地输入常数{a,b,c,…r}是什么,我怎么能让MATLAB把结果转换成最简单的代数形式呢?上面的答案形式非常不方便。您好,如果这有帮助,请将其标记为有效答案,用于简化可以使用的符号表达式,但不需要很多东西,或者最好什么都不做,因为您的系统有很多自由变量simplify()命令在这里不起任何作用。在MATLAB中还有什么可以用来简化的吗?正如我在评论中所建议的,你不能做任何事情,系统中有太多的自由变量,正如我在评论中所建议的,你应该为自由变量假设一些值的范围。如果不是,简化这个表达式就没有意义了