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

Roa*_*man 0 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]
Run Code Online (Sandbox Code Playgroud)

Wol*_*fie 5

通过符号解决来解决您的问题

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

文档示例:

syms x
solx = solve(sin(x) == 1,x)
Run Code Online (Sandbox Code Playgroud)

将此应用到您的系统:

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]
Run Code Online (Sandbox Code Playgroud)

注意,在上面的例子中,我用*+你的第二个等式代替了*.使用*或者+,但不是两者都使用!我假设这是一个错字,它不是你问题的根源.


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

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

1a + 1b - 1c = D
0a + 2b - 3c = E
1a - 2b + 0c = F
Run Code Online (Sandbox Code Playgroud)

以矩阵形式,与...相同

 1  1 -1     a     D
 0  2 -3  *  b  =  E
 1 -2  0     c     F
Run Code Online (Sandbox Code Playgroud)

使用矩阵运算,这可以通过将两侧预乘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]
Run Code Online (Sandbox Code Playgroud)

此输出与以前相同,但显然不是精确的分数形式,因为它是继承的a,b并且c是符号的.


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

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

    x = mldivide(A,B) 是另一种执行方式 x = A\B

  • 另外在文档中有关于如何\工作的注释:

    如果A是一个方阵,A\B大致相等inv(A)*B,但MATLAB的处理方式A\B不同且更稳健.

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

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

综上所述:

虽然在数学上"通过coeffs矩阵的逆运算进行预乘"给出了系统的解决方案,但使用反斜杠运算符(aka mldivide)是解决此问题的MATLAB方式.

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