如何在MATLAB中求解方程系统?

时间:2017-03-13 14:13:40

标签: matlab

这是我解决方程式系统的代码。

我的代码有问题,但我无法解决。

D=1
E=2
F=3
syms a b c;
S= solve('a+b-c=D','2*+b-3*c=E','a-2*b=F')
S = [S.a S.b S.c]

1 个答案:

答案 0 :(得分:5)

使用符号解决方法解决问题

查看solve的文档,您可以看到如何将方程输入solve函数的示例。它们不应该是字符串(就像你已经完成的那样),而应该使用==来代替=

文档示例:

syms x
solx = solve(sin(x) == 1,x)

将此应用到您的系统:

D=1; E=2; F=3;
syms a b c;
S = solve(a+b-c==D, 2*b-3*c==E, a-2*b==F);
S = [S.a S.b S.c];

% Ouput:
% S = [5/7, -8/7, -10/7]

请注意,在上面的示例中,我已使用*+替换了第二个等式中的*。使用*+,但不能同时使用两者!我假设这是一个错字,它不是你问题的根源。

不使用符号数学的另一种选择

您也可以在没有符号数学工具箱的情况下解决此问题。你的方程式可以写成

1a + 1b - 1c = D
0a + 2b - 3c = E
1a - 2b + 0c = F

以矩阵形式,与

相同
 1  1 -1     a     D
 0  2 -3  *  b  =  E
 1 -2  0     c     F

使用矩阵运算,这可以通过将两侧乘以3x3矩阵的逆来解决。在MATLAB中,获得这个结果很简单:

% Set up 3x3 matrix of coefficients
coeffs =  [1  1 -1; 0  2 -3; 1 -2  0];
% Set up left hand side vector
DEF = [1; 2; 3];
% Solve
S = coeffs\DEF;
% Ouput
% S = [0.7143, -1.1429, -1.4286]

此输出与以前相同,但显然不是精确的小数形式,因为它继承自abc是符号。

编辑: 关于在MATLAB中求解矩阵方程的一些事情,正如Dev-iL的评论所提示......

  • 我上面使用的反斜杠\运算符是MATLAB's mldivide function
  • 的简写
  • 如上述链接文档所述,它们可以互换:
      

    x = mldivide(A,B)是执行x = A\B

    的另一种方法
  • 在文档中还有关于\如何工作的说明:
      

    如果A是方阵,A\B大致等于inv(A)*B,但MATLAB以不同的方式处理A\B,并且更加健壮。

  • 特别是,MATLAB自动选择最有效的算法来求解系统。示例决策流程可以在文档中看到,我不会在这里复制,因为它超出了问题的范围。
      

    mldivide在求解线性系统中的多功能性源于它能够通过调度到适当的求解器来利用问题中的对称性。

总结:

虽然在数学上"预先乘以coeffs矩阵的倒数"给出系统的解决方案,使用反斜杠运算符(a.k.a mldivide)是解决此问题的MATLAB方式。

此扩展如何与您的原始问题相关?希望您能更好地了解哪些方法可用于此问题。特别是,要知道(除非您的特定情况需要),您可以轻松地(更少行,更快)完成此任务,而无需依赖MAT​​LAB的符号数学工具箱。