在MATLAB中,方程Ax=B的解可以用哪个命令求得?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在MATLAB中,方程Ax=B的解可以用哪个命令求得?相关的知识,希望对你有一定的参考价值。

参考技术A matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB中有两种方法:
(1)x=inv(A)*b

采用求逆运算解方程组;
(2)x=A\B

采用左除运算解方程组
PS:使用左除的运算效率要比求逆矩阵的效率高很多~
例:
x1+2x2=8
2x1+3x2=13
>>A=[1,2;2,3];b=[8;13];
>>x=inv(A)*b
x
=
2.00
3.00
>>x=A\B
x
=
2.00
3.00;
即二元一次方程组的解x1和x2分别是2和3。
对于同学问到的用matlab解多次的方程组,有符号解法,方法是:先解出符号解,然后用vpa(F,n)求出n位有效数字的数值解.具体步骤如下:
第一步:定义变量syms
x
y
z
...;
第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN');
第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。
如:解二(多)元二(高)次方程组:
x^2+3*y+1=0
y^2+4*x+1=0
解法如下:
>>syms
x
y;
>>[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0');
>>x=vpa(x,4);
>>y=vpa(y,4);
结果是:
x
=
1.635+3.029*i
1.635-3.029*i
-.283
-2.987
y
=
1.834-3.301*i
1.834+3.301*i
-.3600
-3.307。
二元二次方程组,共4个实数根;
解答如下:
基本方法是:solve(s1,s2,…,sn,v1,v2,…,vn),即求表达式s1,s2,…,sn组成的方程组,求解变量分别v1,v2,…,vn。
具体例子如下:
x^2
+
x*y
+
y
=
3
x^2
-
4*x
+
3
=
0
解法:
>>
[x,y]
=
solve('x^2
+
x*y
+
y
=
3','x^2
-
4*x
+
3
=
0')
运行结果为
x
=
1
3
y
=
1
-3/2
即x等于1和3;y等于1和-1.5

>>[x,y]
=
solve('x^2
+
x*y
+
y
=
3','x^2
-
4*x
+
3=
0','x','y')
x
=
1
3
y
=
1
-3/2
结果一样,二元二方程都是4个实根。
通过这三个例子可以看出,用matlab解各类方程组都是可以的,方法也有多种,只是用到解方程组的函数,注意正确书写参数就可以了,非常方便。
2、变参数非线性方程组的求解
对于求解非线性方程组一般用fsolve命令就可以了,但是对于方程组中某一系数是变化的,该怎么求呢?
%定义方程组如下,其中k为变量
function
F
=
myfun(x,k)
H=0.32;
Pc0=0.23;W=0.18;
F=[Pc0+H*(1+1.5*(x(1)/W-1)-0.5*(x(1)/W-1)^3)-x(2);
x(1)-k*sqrt(x(2))];
%求解过程
H=0.32;
Pc0=0.23;W=0.18;
x0
=
[2*W;
Pc0+2*H];
%
取初值
options
=
optimset('Display','off');
k=0:0.01:1;
%
变量取值范围[0
1]
for
i=1:1:length(k)
kk=k(i);
x
=
fsolve(@(x)
myfun(x,kk),
x0,
options);%求解非线性方程组
x1(i)=x(1);
x2(i)=x(2);
end
plot(k,x1,'-b',k,x2,'-r');
xlabel('k')
legend('x1','x2')
参考技术B 这个问题俺也感兴趣,提供一种方法,仅供参考。
clc;clear
p=sym('[p11
p12
p13;p21
p22
p23;p31
p32
p33]')
a=rand(3,3)
at=a'
q=diag(diag(a))
f=at*p+p*a+q
结果:
p
=
[
p11,
p12,
p13]
[
p21,
p22,
p23]
[
p31,
p32,
p33]
a
=
0.3311
0.5676
0.1526
0.6586
0.9805
0.8330
0.8636
0.7918
0.1919
at
=
0.3311
0.6586
0.8636
0.5676
0.9805
0.7918
0.1526
0.8330
0.1919
q
=
0.3311
0
0
0
0.9805
0
0
0
0.1919
f
=
[
.6622*p11+.6586*p21+.8636*p31+.6586*p12+.8636*p13+.3311,
1.312*p12+.6586*p22+.8636*p32+.5676*p11+.7918*p13,
.5230*p13+.6586*p23+.8636*p33+.1526*p11+.8330*p12]
[
.5676*p11+1.312*p21+.7918*p31+.6586*p22+.8636*p23,
.5676*p12+1.961*p22+.7918*p32+.5676*p21+.7918*p23+.9805,
.5676*p13+1.172*p23+.7918*p33+.1526*p21+.8330*p22]
[
.1526*p11+.8330*p21+.5230*p31+.6586*p32+.8636*p33,
.1526*p12+.8330*p22+1.172*p32+.5676*p31+.7918*p33,
.1526*p13+.8330*p23+.3837*p33+.1526*p31+.8330*p32+.1919]
然后用solve解9个方程组,求得p,不过,俺觉着,这方法太笨。

[Matlab]求解线性方程组

转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/

AX=B或XA=B
在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\\”。如:

  • X=A\\B表示求矩阵方程AX=B的解;
  • X=B/A表示矩阵方程XA=B的解。

对方程组X=A\\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。

如果矩阵A不是方阵,其维数是m×n,则有:

  • m=n 恰定方程,求解精确解;
  • m>n 超定方程,寻求最小二乘解;
  • m<n 不定方程,寻求基本解,其中至多有m个非零元素。

针对不同的情况,MATLAB将采用不同的算法来求解。

恰定方程组

恰定方程组由n个未知数的n个方程构成,方程有唯一的一组解,其一般形式可用矩阵,向量写成如下形式:

Ax=b

其中A是方阵,b是一个列向量;

在线性代数教科书中,最常用的方程组解法有:

  • 利用cramer公式来求解法;
  • 利用矩阵求逆解法,即x=A-1b;
  • 利用gaussian消去法;
  • 利用lu法求解。

一般来说,对维数不高,条件数不大的矩阵,上面四种解法所得的结果差别不大。前三种解法的真正意义是在其理论上,而不是实际的数值计算。MATLAB中,出于对算法稳定性的考虑,行列式及逆的计算大都在lu分解的基础上进行。
在MATLAB中,求解这类方程组的命令十分简单,直接采用表达式:x=A\\b。
在MATLAB的指令解释器在确认变量A非奇异后,就对它进行lu分解,并最终给出解x;若矩阵A的条件数很大,MATLAB会提醒用户注意所得解的可靠性。
如果矩阵A是奇异的,则Ax=b的解不存在,或者存在但不唯一;如果矩阵A接近奇异时,MATLAB将给出警告信息;如果发现A是奇异的,则计算结果为inf,并且给出警告信息;如果矩阵A是病态矩阵,也会给出警告信息。
注意:在求解方程时,尽量不要用inv(A)*b命令,而应采用A\\b的解法。因为后者的计算速度比前者快、精度高,尤其当矩阵A的维数比较大时。另外,除法命令的适用行较强,对于非方阵A,也能给出最小二乘解。

超定方程组

对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快;

例 求解超定方程组


A=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] 
A= 
2 -1 3 
3 1 -5 
4 -1 1 
1 3 -13 
b=[3 0 3 -6]’; 
rank(A) 
ans= 
3 
x1=A\\b 
x1= 
1.0000 
2.0000 
1.0000 
x2=pinv(A)*b
x2= 
1.0000 
2.0000 
1.0000 
A*x1-b 
ans= 
1.0e-014 
-0.0888 
-0.0888 
-0.1332 
0

可见x1并不是方程Ax=b的精确解,用x2=pinv(A)*b所得的解与x1相同。

欠定方程组

欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB将寻求一个基本解,其中最多只能有m个非零元素。特解由列主元qr分解求得。

例 解欠定方程组


A=[1 -2 1 1;1 -2 1 -1;1 -2 1 5] 
A= 
1 -2 1 1 
1 -2 1 -1 
1 -2 1 -1 
1 -2 1 5 
b=[1 -1 5]’ 
x1=A\\b 
Warning:Rank deficient,rank=2 tol=4.6151e-015 
x1= 
0 
-0.0000 
0 
1.0000 
x2=pinv(A)*b 
x2= 
0 
-0.0000 
0.0000 
1.0000

方程组的非负最小二乘解

在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程的精确解更有意义。在MATLAB中,求非负最小二乘解常用函数nnls,其调用格式为:

  • X=nnls(A,b)返回方程Ax=b的最小二乘解,方程的求解过程被限制在x 的条件下;
  • X=nnls(A,b,TOL)指定误差TOL来求解,TOL的默认值为TOL=max(size(A))norm(A,1)eps,矩阵的-1范数越大,求解的误差越大;
  • [X,W]=nnls(A,b) 当x(i)=0时,w(i)<0;当下x(i)>0时,w(i)0,同时返回一个双向量w。

例 求方程组的非负最小二乘解

A=[3.4336 -0.5238 0.6710 
-0.5238 3.2833 -0.7302 
0.6710 -0.7302 4.0261]; 
b=[-1.000 1.5000 2.5000]; 
[X,W]=nnls(A,b) 
X= 
0 
0.6563 
0.6998 
W= 
-3.6820 
-0.0000 
-0.0000 
x1=A\\b 
x1= 
-0.3569 
0.5744 
0.7846 
A*X-b 
ans= 
1.1258 
0.1437 
-0.1616 
A*x1-b 
ans= 
1.0e-0.15 
-0.2220 
0.4441 
0

以上是关于在MATLAB中,方程Ax=B的解可以用哪个命令求得?的主要内容,如果未能解决你的问题,请参考以下文章

[Matlab]求解线性方程组

matlab解方程组Ax=b

MATLAB求解AX=b

如何用matlab解方程组

用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

matlab求AX=B