使用Matlab解决线性方程
在数学中,形式为Ax=b 的方程是线性代数方程。在这种方程中,A 是一个矩阵,而x 和b 是列向量。矩阵是一个二维的数字排列。
这种方程在工程和科学学科中很常见。因此,理解这些方程的设置并找到问题的解决方案是一项基本技能。
Matlab给出了一个强大而可靠的方法来寻找这些问题的解决方案。但是,我们也会意识到,所提供的解决方案并不总是表面上的那样。
在这篇文章中,我们将学习如何使用Matlab来解决这些问题。它是一个矩阵实验室,因此是解决矩阵问题的最佳环境。
前提条件
要跟上本教程,你需要。
- 安装了[MATLAB]。
- 对[MATLAB]基础知识的正确理解。
- 对矩阵的基本了解。
解决同位素方程
我们将看看如何用MATLAB解决同位素方程。同位素方程是有限的方程组,对于这些方程组有共同的解。
我们的意思是,它们是通过相等数量的方程定义两个未知数之间的关系的条件。
我们将使用矩阵法。矩阵是一个二维的数字排列。比如说。

定义矩阵的维度是m x n ,其中m 是行的数量,而n 是列的数量。一行是水平排列,而一列是数字的垂直排列。
如果我们有一个3x2的矩阵,那么这意味着它有3行和2列。这些矩阵被紧凑地用于处理线性方程。矩阵的不同形式是。
- 行向量是具有单行的矩阵。
- 列向量是具有单列的矩阵。
- 方形矩阵是指
m=n,即列数等于行数的矩阵。线性方程的基本形式是。

其中A_ij 是MxN 矩阵的元素,X_j 是Nx1矩阵列向量的元素,b_i 是Mx1 行向量的元素。例如,给定一个如下所示的同时性方程。

这个方程的简化是。

要想用矩阵法解决这些同时进行的方程,第二个矩阵的m 必须等于第一个矩阵的n ,经过上面的简化。这是因为使用Matlab解决同调方程涉及到矩阵的乘法。
这些方程是同时存在的,因为一组x_i 必须满足M 的所有方程。假设你有A 和x 的值,可以找到b ,那么这个方程就很容易解决。你应用矩阵乘法。最大的问题是在给定的A 和b 中找到x ;关注此类问题,我们将看到如何处理这些问题。
Matlab的解决方案
你在Matlab中用于解决这些方程的基本操作取决于所提供的变量。当。
A和 ,解决方案是 。 的 必须等于 的 ,这个操作才有效。xb = A*xAnxmA和 ,解决方案是 。这里, 的 必须等于 的 。 示例。bA/bAmbm

下面是第一个矩阵,A 。

下面是第二个矩阵b 。

现在你有了A 和b ,我们应该找到x 。
当你有A 和b ,我们就用x =A\b 。所以要完成这个任务,在命令窗口中执行以下命令。
A = [4 5; 3 -2];
b = [6; 14];
x = A\b
我们已经将我们的矩阵分配给了变量A 和b ,然后给出了用于解决问题的公式。在Matlab中,行与行之间是用分号分隔的。当你执行该命令时,结果显示如下。
x =
3.5652
-1.6522
Matlab提供了一个线性代数的解决方案。但是,在某些时候,它并没有产生解决方案,或者提供的解决方案不太值得信任。所以,Matlab会在某些时候给用户一个警告,但这发生在极少数情况下。
现在,这里的错误可能不是由于语法不完善或Matlab的错误,但可能是由于用户没有理解线性代数。但是不要担心。我在这里向你展示此类问题的原因以及Matlab给出的输出的意义。
我们之前解决的问题有两个未知数,x 和y ,由于有两个未知数,所以输出的长度为2(列向量)。有各种类型的同调方程。
- 不一致的方程。
- 未确定的方程。
- 过度确定的方程。
不一致方程
不一致方程是指m=n (行数等于列数)的方程,但解不存在。在这些类型的方程中,左边是相等的,但右边却不相等,例如

我们的意思是,对于左边的方程式1和2,我们有4x+y ,而对于右边的方程式1和2,我们分别有6和14。这说明方程是不一致的。
求解同时性就是找到两个方程在绘制时的交点。当你绘制这两个方程时,线是平行的。
让我们做一个图来直观地了解我们在上面的陈述中所说的内容。由于我们要将x 与y 绘制成图,我们首先将y 作为每个方程的主语,然后再绘制。如下图所示。

为了绘制,我们先给出x 的变量
x = [-10:10]; % x ranges from -10 to 10
y1 = (6 -4*x)/5; %y variables
y2 = (14 -4*x)/5;
plot(x, y1, x, y2) %plotting the two equations
legend('y1', 'y2') %Adding legends to the plot

这两条线是平行的。这意味着这两条线在无限远处相交。因此,当你试图用Matlab得到这个问题的解决方案时,给未知数的输出是inf ,这意味着无穷大。
x =
-Inf
Inf
未确定的方程
这些是方程,其中m>n 。这意味着所提供的信息不足以给出问题的解决方案,例如。
4x + 5y =6
在数学上,解决方案是y = (6-4x)/5 。这意味着x 的值可以从-inf 到inf ,只要它与提供的y 。如果用Matlab来解决这样的方程,它将只给出一个值,另一个值设置为0。
A = [4 5];
b = 6;
x = A\b
输出结果将是。
x =
0
1.2000
信息不充分不仅发生在m=n ,而且也可能发生在m>n 的问题上。这可能是由于其他方程的冗余造成的。例如

在上述方程中,由于方程(i)和(ii)可以由方程(i)生成,所以信息是不充分的。如果你把方程(i)乘以2,我们就得到方程(ii)。如果你也拿方程(一)除以-2,我们得到方程(三)。
过度确定的方程
这类方程主要发生在m>n 。
在这里,方程所提供的信息太多。方程Ax=b ,不能同时满足向量的任何值x 。
当你用Matlab解决这个方程时,它会给出一个输出,但它并不满足矩阵规则a*x=b 。为了理解这一点,我们先把下面的方程画出来。

对于第一个方程,y1 = -(4x - 6)/5 ,将y2 和y1 与x 绘制成图。
x = [-10;10];
y1 = (-4*x + 6)/5;
y2 = (3*x -14)/2;
plot(x, y1, x, y2);
grid on
xlabel('x');
ylabel('y');
legend('y1', 'y2')

我们将使用intersect function ,找到直线相交的点。相交函数使用梯度和常数作为输入,如下所示。
function [x0, y0] = intersectPoints(m1,m2,b1,b2) %m is the gradient while b is the constant.
x0 = (b2-b1)/(m1-m2); %find the x point
y0 = m1*x0+b1;
end
在命令窗口中调用这个函数。
intersectPoints(-4/5, 3/2, 6/5, -14/2)
输出将是。
ans =
3.5652
这个函数给出一个对应于交点的x 值的单一输出。要找到y ,你可以在方程中替换x ,得到你的y 。
从图中可以看出,该解与我们之前找到的(3.5652,-1.6522)相似。这说明解法是正确的。现在假设我们有下面这个方程。

让我们来绘制三个方程的直线。要做到这一点,我们要添加下面的代码。
y3 = 7*x - 25;
hold on
plot(x, y1, x,y2, x, y3)

当你执行上述命令时,我们会得到第三条线(绿色线),这是第三条方程的线。
观察这些图,你可能认为这三条线相交于一个共同点,但事实并非如此。要看到这一点,可以通过点击放大镜图标(里面有+ )来放大图。
点击后,移动到这些线似乎相交的点上几次,结果会是。

这表明,这些问题没有完美的解决方案。让我们试着用matlab来解决它,并绘制这个输出,看看matlab给出的位置作为输出。这可以通过下面的代码来完成。
A = [4 5; 3 -2; 7 -1];
b = [6; 14;25];
x = A\b;
hold on
plot(x(1),x(2),'k*')
plot(x(1),x(2),'r*')

正如你所看到的,Matlab正试图找到一个接近所有三条线的点,而这是一个近似值。你可以通过以下方式找到解决方案的误差。
error = A*x -b
Matlab通过寻找输入矢量元素平方之和的平方根来定位这个最接近的点。定位这个点是通过使用norm 函数。
norm(error)
其输出为0.7941 ,称为optimum solution in the least square sense 。它是norm(error) 尽可能小的那个点。如果我们尝试其他点,我们会得到norm(error) ,高于0.7941 。
结论
在Matlab中解决同调方程取决于你所处理的问题的类型。
作为一个用户,你应该知道你所要解决的方程或问题的类型。此外,这将有助于你知道你期望从Matlab得到的输出。你必须知道的是,Matlab将为所有这些问题提供一个解决方案。另外,知道方程的类型有助于你避免线性方程的错误。