|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
求解线性方程组
# Z. |- I4 o9 i' Osolve,linsolve
4 i. J: H; [" n- R例:1 H, z; o B5 [
A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];! d, I8 q) K9 Y; c1 a; Q
%矩阵的行之间用分号隔开,元素之间用逗号或空格/ Q# |2 }$ @: r8 d
B=[3;1;1;0]! o, d% w# i# |( \% g
X=zeros(4,1);%建立一个4元列向量
5 |5 X$ O. x: PX=linsolve(A,B)- f! _! g6 {! b* a4 k% l6 Q$ W2 M1 W
diff(fun,var,n):对表达式fun中的变量var求n阶导数。
0 i0 g5 \. [/ L6 j; X' n8 w' c/ u. d* J4 Y% S" x
例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式
' g2 j4 k- y' P. q8 odiff(F); %matlab区分大小写( }' @' X/ v- i4 M9 q* m: A
pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式! l) N6 x. b8 m2 @0 Y
( ]8 f% t- T; h5 _1 A, M
0 m8 O0 C1 n" F7 G7 E非线性方程求解
* J+ F9 n* A# n7 X, H p+ \3 Gfsolve(fun,x0,options)$ ]& L2 l2 o1 B( l1 Y
其中fun为待解方程或方程组的文件名;4 F/ _" n( g- f& c% |; Q/ F
x0位求解方程的初始向量或矩阵;
' _% K% g% J* I. c; v; y, ooption为设置命令参数
0 f7 H- E; h/ r建立文件fun.m:+ j7 R& c; j* u' r! `& G
function y=fun(x): F/ ?1 V& ~8 w6 z: q% O
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...
% L! T4 [4 v9 ~ B. Tx(2) - 0.5*cos(x(1))+0.3*sin(x(2))];3 ?: f* ]; D2 M% Q; z
) t! D" D X' C>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))) S3 h. D4 W! {3 n5 C
注:! `" v" t5 @' [/ k+ y
...为续行符
" i$ o& i: _( t6 m+ ]" f rm文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。
" H% d) j; T! q$ O& y2 u, q7 N y- v
& Y$ E0 A/ x$ \) j2 s4 W! ^
* G( X8 M2 B8 W N6 r" hMatlab求解线性方程组
2 F; p9 |& D- s. MAX=B或XA=B 9 ]4 b* H: z9 Q6 r h
在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: : ]; A! Y0 h# o9 r$ t
X=A\B表示求矩阵方程AX=B的解; . T, Z. H. H9 e5 l! Z5 n
X=B/A表示矩阵方程XA=B的解。 7 h: V) h. y% l- I4 E8 x4 Y
对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 : W$ q. l' L2 Y* u8 `2 E5 @
* y$ N7 R9 o0 A6 v
如果矩阵A不是方阵,其维数是m×n,则有: * ^2 t1 Z* R# e- D5 u$ q' V
m=n 恰定方程,求解精确解;
; \ R$ K w' |* N2 A8 t# Hm>n 超定方程,寻求最小二乘解;
0 w1 S3 J3 ]+ rm<n 不定方程,寻求基本解,其中至多有m个非零元素。 - L X4 D; M) o9 J9 Y( ~
针对不同的情况,MATLAB将采用不同的算法来求解。
) w1 H% j' Z! G( \8 o8 d% b" k
9 {1 e5 E" z3 A( N1 _2 U/ D7 i% h9 p* Q/ O
一.恰定方程组
?, o& R! [4 w `* ?$ J9 ~1 ` a恰定方程组由n个未知数的n个方程构成,方程有唯一的一组解,其一般形式可用矩阵,向量写成如下形式: 1 J8 p+ p7 P; d# x, [
Ax=b 其中A是方阵,b是一个列向量; ! p0 A3 Y+ Q' W$ M3 }
在线性代数教科书中,最常用的方程组解法有:
% m' j3 A/ T0 F& f! s* ~(1)利用cramer公式来求解法;
6 I7 ~( T1 X" f* L3 U(2)利用矩阵求逆解法,即x=A-1b;
9 L$ C" z9 R7 C. L ~0 }. l(3)利用gaussian消去法;
# s. l2 f% S5 w(4)利用lu法求解。 # i3 m- ]% |/ T0 g7 w
一般来说,对维数不高,条件数不大的矩阵,上面四种解法所得的结果差别不大。前三种解法的真正意义是在其理论上,而不是实际的数值计算。MATLAB中,出于对算法稳定性的考虑,行列式及逆的计算大都在lu分解的基础上进行。
, h" ^* {. j% a/ R4 [5 ~+ [7 V& M在MATLAB中,求解这类方程组的命令十分简单,直接采用表达式:x=A\b。 % d& U# b" y3 p
在MATLAB的指令解释器在确认变量A非奇异后,就对它进行lu分解,并最终给出解x;若矩阵A的条件数很大,MATLAB会提醒用户注意所得解的可靠性。 / R& f0 u8 I7 F: e, Y& p
如果矩阵A是奇异的,则Ax=b的解不存在,或者存在但不唯一;如果矩阵A接近奇异时,MATLAB将给出警告信息;如果发现A是奇异的,则计算结果为inf,并且给出警告信息;如果矩阵A是病态矩阵,也会给出警告信息。 * e2 N! R( U( F. L J
注意:在求解方程时,尽量不要用inv(A)*b命令,而应采用A\b的解法。因为后者的计算速度比前者快、精度高,尤其当矩阵A的维数比较大时。另外,除法命令的适用行较强,对于非方阵A,也能给出最小二乘解。 & B4 F0 q. i6 Q. z0 N
6 L9 u' |7 N1 Y- J. ^
二.超定方程组
/ r( L7 R2 N m* m对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快; 2 s6 Y" n$ }! J/ e& ~+ u) m2 @+ h, `9 }
【例7】 % \$ |0 Q& _- }
求解超定方程组 - X- V5 d/ D3 Q$ k
A=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] 4 _; Y! ~4 d+ B7 a
A= - b4 n, F, @$ Q, Q8 K% @' \
2 -1 3
5 g ]: E9 V, J: _ ]3 p0 C( L3 1 -5 ' [$ Y+ t& X: d' V3 e: {
4 -1 1 $ q& | Y5 ?; ~* \) Q; r" R
1 3 -13 9 V; O; S9 n a7 v, L6 b7 i9 k
b=[3 0 3 -6]’;
, l1 z6 P6 F0 O6 ~1 @$ I; Xrank(A)
9 P7 W+ o5 Q% R7 `* ~4 ]' L) Lans= ' y" w5 ^% ~- V& X3 h/ }5 T
3
: S1 X" @) X: V0 jx1=A\b
$ T/ c. N; {9 ?% B& ax1=
" r' b6 Q! i5 p2 s1.0000 / j4 M! g j3 W" z, s1 n( g3 }6 K
2.0000
; N# G7 T8 q, H$ n3 o1.0000 : }# P, q. a' a! Y& r7 \ d
x2=pinv(A)*b6 T+ ~ W7 n# L0 t0 y
x2=
! C' a7 ^; y0 L( ?, h1.0000 7 t0 U" K- G3 s9 x( h
2.0000
( Z9 C/ M" V, j1.0000
C( Y+ o# B/ M. {3 P& GA*x1-b 0 j5 N' _( n2 E& k7 y
ans=
1 h5 k8 I! T) }" K& s" `) N1.0e-014 ) x: z) Q/ I0 ] T( u7 E/ P8 _7 A0 i
-0.0888
& s% R6 d& A- q# [( A3 o-0.0888
4 w% n: u. W; G% [2 J( q-0.1332 : ?$ j8 i/ b* P
0
' e% z* A/ V( B2 ^4 i- a3 z可见x1并不是方程Ax=b的精确解,用x2=pinv(A)*b所得的解与x1相同。
4 u) p7 }) I/ K: i c1 W* M7 g$ [) O0 y: l G% k( A+ R
三.欠定方程组
1 Z. v; @( U9 z/ r9 n* p欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB将寻求一个基本解,其中最多只能有m个非零元素。特解由列主元qr分解求得。
- j6 K, i- o% O, p* d7 Y【例8】
% f# E; Q9 r2 R- @8 H2 |% w0 }解欠定方程组 . @' o1 f F @9 s# `1 ?
A=[1 -2 1 1;1 -2 1 -1;1 -2 1 5] $ m8 {% U- U! A9 B
A= , k1 T3 M2 p, t; [
1 -2 1 1 % F/ l9 B- A! q2 E3 T8 J
1 -2 1 -1
1 u0 c- }; |0 k' Y' D, h1 -2 1 -1
* I! b' L! O7 _1 -2 1 5 1 z( Z9 }; N7 C
b=[1 -1 5]’ + }6 E& o. Z$ T
x1=A\b $ ~) c. L* Q+ o
Warning:Rank deficient,rank=2 tol=4.6151e-015 3 T |6 g4 C3 Q* t; T5 {
x1= " e! ~1 I& p. w1 A& a7 g: N
0
- G6 U/ B, }6 I4 i, o" n& z-0.0000 ! K0 H9 A2 @2 N- d% \
0
7 y: b& X- W& o: s! o) z1.0000
9 q$ N* S3 d$ Q+ _) Lx2=pinv(A)*b
6 {; e. o" ]/ s( G' I0 xx2=
( j9 L. T% t9 ^4 t0 % s& M: e, L8 P7 M
-0.0000
& q6 Q& M" r* F4 w3 W0.0000 ( v( j7 s4 y9 I& H
1.0000 : d% ?* ]( p" f. A( a
1 T* Q: z5 p/ ~" g: X _四.方程组的非负最小二乘解 . |7 T6 o- p, f. T6 Z
在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程的精确解更有意义。在MATLAB中,求非负最小二乘解常用函数nnls,其调用格式为: 6 N4 f4 \) o$ e+ J
(1)X=nnls(A,b)返回方程Ax=b的最小二乘解,方程的求解过程被限制在x 的条件下; / d$ \! q5 j7 M- D
(2)X=nnls(A,b,TOL)指定误差TOL来求解,TOL的默认值为TOL=max(size(A))*norm(A,1)*eps,矩阵的-1范数越大,求解的误差越大; , b" `; Z3 z$ j- ^* Q$ D
(3)[X,W]=nnls(A,b) 当x(i)=0时,w(i)<0;当下x(i)>0时,w(i)0,同时返回一个双向量w。
$ i7 t3 M, _8 Y. g4 G. y7 I& b. ~1 Z& ]【例9】求方程组的非负最小二乘解
) [; \6 u2 a6 Z; m, [A=[3.4336 -0.5238 0.6710 " ?+ V5 h6 b$ G7 Y+ N
-0.5238 3.2833 -0.7302 , q/ c5 @" C2 D# E
0.6710 -0.7302 4.0261]; : d# d6 A2 K. f. e+ `5 h
b=[-1.000 1.5000 2.5000]; * R* X- B, k2 E Z% {* D
[X,W]=nnls(A,b) / m2 ?& w5 S6 Q2 e0 ]6 t: }
X= - {) r1 }: K% K
0 ( C2 e& [# p, V$ i
0.6563 & a6 D& m: D; Q- Y O
0.6998 * z' n, j8 r& W5 f. U% b
W=
0 d0 C. E( k2 I2 W-3.6820 9 I k6 ]- M3 S4 \ m
-0.0000
9 @1 Y6 e+ O3 u) _' r4 S-0.0000 ( E8 a6 _! Y9 X' l1 J( w* s
x1=A\b ( y7 x# N h9 R. E- H7 V% o* A
x1= ' y* n- R% a) o
-0.3569 % E4 U S& I7 Z8 ?& O. h2 ?4 m
0.5744 . t$ k- d2 E$ U- d9 Z
0.7846
! e$ V$ @; L% }5 E7 i: EA*X-b / u% e" }$ J0 ]! m# r+ z
ans=
8 O n7 k. h9 k% R6 ]: N1.1258 " M4 ~! e7 ~4 A; m5 T
0.1437
Z0 r( p% c6 v: t' T-0.1616
$ V( h8 L* Q3 k6 j8 J7 ~A*x1-b
4 g0 r% N! A! {6 xans= # j( W- R* W5 k6 [5 E
1.0e-0.15 ( n, d. a% M. S0 ?* _7 O$ B
-0.2220 " r; m3 y. [6 B- @ W r
0.4441
# M* t( H. S1 Z$ l& W6 n) ~; M/ U0 |
|