找回密码
 注册
关于网站域名变更的通知
查看: 1882|回复: 1
打印 上一主题 下一主题

Matlab求解线性方程组、非线性方程组

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-24 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
求解线性方程组4 G  _( Z/ y0 J& {9 m% P3 j3 E
solve,linsolve7 n6 ?9 D; {3 p5 C  p
例:
: Y9 k6 x* w% R9 e* w; SA=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];
+ M3 q" k6 y0 X! B; ~%矩阵的行之间用分号隔开,元素之间用逗号或空格
% F; G+ N9 ?4 c; |% p# l2 @6 iB=[3;1;1;0]
- b- j$ n2 X7 j' T. N* ~" ]X=zeros(4,1);%建立一个4元列向量
7 g* |7 D" L5 _X=linsolve(A,B)
7 ~* I! D8 I3 M9 tdiff(fun,var,n):对表达式fun中的变量var求n阶导数。
( k/ q+ z$ A- M; P' S' j. n4 W/ y' l3 F: w7 h' w
例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式$ z+ n8 c+ E' c1 Y
diff(F); %matlab区分大小写0 r% `4 r- T- V1 C- \5 c6 e
pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式8 Q$ k  T, ]9 Z7 D

9 H% B& O! c# F6 w
( B$ a7 x: \! i' l7 {; @非线性方程求解 ) s" t& j0 G) _2 t4 A$ n* w
fsolve(fun,x0,options)* r3 ?. ^* H6 M5 `, T
其中fun为待解方程或方程组的文件名;. @6 `- n8 ?0 e3 w, y
x0位求解方程的初始向量或矩阵;5 V3 f- E3 M/ H& G- }& U' |6 ^. X
option为设置命令参数) w) e. f9 T1 o4 |" V( M/ ~8 s
建立文件fun.m:  H3 ?: F1 W# Z' f& \6 T
function y=fun(x). l, H9 w" m$ `3 u4 h8 u' {2 S; \
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...
$ G& f* l6 s% e: z- x' ux(2) - 0.5*cos(x(1))+0.3*sin(x(2))];
6 \/ H* t" J2 ~4 v! |
% z" @8 {& a6 p>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))9 S0 j/ M& n. t+ i3 N9 `
注:
7 |! L* i- w0 a+ ]7 J' I...为续行符
. g: L8 L/ R  ]4 S2 }6 `m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程* w  I( b9 U+ C  G4 v. u

. [* ~; b, ^! s% \% u: L0 _7 E! M: R, B5 O. r8 J" C
Matlab求解线性方程组: v2 |- ]8 C8 w! n
AX=B或XA=B
$ s7 q2 W& Q9 c3 A6 `在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: ' v/ T/ n( B0 l8 v5 W# C
X=A\B表示求矩阵方程AX=B的解; & F, J  R5 k! e3 Q
X=B/A表示矩阵方程XA=B的解。 8 J0 j% H; ~- v7 K  i. e
对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 6 }6 \$ t1 `& v& g( H
! E+ B5 C8 p5 j* b. g% n& a/ r
如果矩阵A不是方阵,其维数是m×n,则有: * M+ t! n8 V" Y0 N) x- B8 r
m=n 恰定方程,求解精确解;
% I; b* G% e2 V# j) ~6 nm>n 超定方程,寻求最小二乘解;
5 I: q. R7 ~5 t3 ?) im<n 不定方程,寻求基本解,其中至多有m个非零元素。 : S0 U8 s! b8 y
针对不同的情况,MATLAB将采用不同的算法来求解。 ; l! D* O, C# U7 m  w

7 q6 n& L" D: r. D. x) T% Q2 p
0 P; t6 G. \) p5 h. c一.恰定方程组
4 k" s$ P" N  Y3 r1 X  j恰定方程组由n个未知数的n个方程构成,方程有唯一的一组解,其一般形式可用矩阵,向量写成如下形式: * D$ v  p* Z0 S% ~
Ax=b 其中A是方阵,b是一个列向量; ; y( w8 I' F6 v2 z6 p: l4 E
在线性代数教科书中,最常用的方程组解法有: # w0 y2 J* e0 t0 x" t
(1)利用cramer公式来求解法; * ^& I5 z! L* t3 A) M
(2)利用矩阵求逆解法,即x=A-1b;
- u  F1 c8 t, H! u0 ]  E(3)利用gaussian消去法;
4 v# r) A. H) F' U7 f(4)利用lu法求解。
* l& G2 K4 v# w8 F9 F$ \一般来说,对维数不高,条件数不大的矩阵,上面四种解法所得的结果差别不大。前三种解法的真正意义是在其理论上,而不是实际的数值计算。MATLAB中,出于对算法稳定性的考虑,行列式及逆的计算大都在lu分解的基础上进行。
9 c4 A4 _8 w3 b: \1 C" ]在MATLAB中,求解这类方程组的命令十分简单,直接采用表达式:x=A\b。
( ]  \2 V) d6 k3 {& y在MATLAB的指令解释器在确认变量A非奇异后,就对它进行lu分解,并最终给出解x;若矩阵A的条件数很大,MATLAB会提醒用户注意所得解的可靠性。
  P6 Q  ?( T( v# v2 r4 E5 B# I: f如果矩阵A是奇异的,则Ax=b的解不存在,或者存在但不唯一;如果矩阵A接近奇异时,MATLAB将给出警告信息;如果发现A是奇异的,则计算结果为inf,并且给出警告信息;如果矩阵A是病态矩阵,也会给出警告信息。 7 F/ ^# R. r; C
注意:在求解方程时,尽量不要用inv(A)*b命令,而应采用A\b的解法。因为后者的计算速度比前者快、精度高,尤其当矩阵A的维数比较大时。另外,除法命令的适用行较强,对于非方阵A,也能给出最小二乘解。
9 a1 K6 r/ j: ^$ `7 @9 H7 L5 Z+ E, _, c! l
二.超定方程组 + ~4 s% S5 C' H' q
对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快; 5 a! Z- j  R- b* e" o* p
【例7】
7 k% |( R% y4 Z3 g求解超定方程组
- `6 T: L5 e2 u3 @. IA=[2 -1 3;3 1 -5;4 -1 1;1 3 -13]
  ~/ c& X+ x& v# `- W8 }A=
( [- k# j8 m8 H* r! t2 -1 3
3 ~* l. R7 a7 ]4 n6 W4 `. [: j3 1 -5 + w: W/ Q& r0 E8 f# U" e+ H
4 -1 1 & ^& c# j/ F' N; }4 W: A! l
1 3 -13 5 `9 k6 t* w/ W: C9 q5 R( C
b=[3 0 3 -6]’; $ E0 ]( e2 u& Y' p4 I2 J
rank(A) ' x  i3 B4 V! U# H0 M. d
ans= - `. S, A' p/ }  V7 n4 Y
3 1 f: T7 Y2 M4 L
x1=A\b # e9 z! t5 f% U- q9 _( O/ B9 I1 p# {
x1=
4 Z9 a) e$ X0 A7 j1.0000
3 |2 J! f, d% H- g- Z- Q. R- j2.0000 5 C1 J2 ]5 `3 H+ B* p6 g" A
1.0000 & r' |! M& k# ^
x2=pinv(A)*b2 Y3 A7 R3 S4 R) D
x2=   \! I' y7 Y2 Z( _
1.0000
, y* _2 c- Y# G5 F& z: [0 m5 @2.0000
% Q. C5 V, u; D, O2 X( e; e1.0000
- V! n, e* r, sA*x1-b
7 L7 H4 J5 p& c  u3 qans=
& ^8 U0 d" d1 N, J! X1.0e-014
& x% E5 V1 X2 K& I& B2 l-0.0888
7 }/ l) V* u& `; L-0.0888 4 U; s; A. l! _9 S& g9 h( |
-0.1332
/ S6 Z6 ~% u% p0 |% Y9 ]0 3 f) R/ G* q4 M" |5 C
可见x1并不是方程Ax=b的精确解,用x2=pinv(A)*b所得的解与x1相同。 * n6 ]( z; c) B7 ^

) u) q8 R/ S% N! n: ^) {) V三.欠定方程组
8 v: u; H% t6 g, B% [欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB将寻求一个基本解,其中最多只能有m个非零元素。特解由列主元qr分解求得。 3 c. R( [% H& k6 S! p  O, t$ m
【例8】 : l( n, D# G  w! P3 z! \
解欠定方程组 ; H3 h! k; ^# z$ X9 }- a* q$ |' q' C! ~
A=[1 -2 1 1;1 -2 1 -1;1 -2 1 5]
8 r' Z$ ^- L- f3 q; E* vA=   }3 b( }, {5 Q9 C( u: I% y$ w
1 -2 1 1
; R) H3 G8 R# T/ P- m- c& f* T1 -2 1 -1 5 ~! P/ ~% D; |* N% \
1 -2 1 -1
1 y8 m, D- Z6 P# q2 A+ g/ Z1 -2 1 5
: r. E% L! t# [$ y5 Hb=[1 -1 5]’
* C3 u4 J, i' X+ R% [+ K6 j9 c! yx1=A\b
$ [% D: E) Z2 FWarning:Rank deficient,rank=2 tol=4.6151e-015 ; c9 S/ W8 J8 M# D8 J3 C
x1= 3 v" s) T0 Y* h5 l* o0 H2 ^
0
- b6 P% h$ [% N6 a% F# U' Y-0.0000 2 p: F, W0 g# c) p) z1 V
0
  H6 A  F( i  U1 j1.0000
1 v3 \& p+ ~+ ]# cx2=pinv(A)*b
0 o: ^& l% G5 B0 E, G; r8 K* gx2=
  `# X0 f) J" }; P- u0 : m4 ?7 ^, _0 J- ]
-0.0000 8 a1 l, M1 e" x) I7 r5 W$ Q, v% m" ?" m" ?
0.0000
$ w! O5 v2 n0 R5 t1.0000
) G5 k: \+ H" L% v- x
' I) B- t9 v( `7 M# g四.方程组的非负最小二乘解 5 k7 W4 s: y, i* J: j6 K5 W5 j
在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程的精确解更有意义。在MATLAB中,求非负最小二乘解常用函数nnls,其调用格式为:
+ a# ^5 u" d0 r1 ~. X(1)X=nnls(A,b)返回方程Ax=b的最小二乘解,方程的求解过程被限制在x 的条件下; * G/ @, q( i7 [/ X  ?! Y
(2)X=nnls(A,b,TOL)指定误差TOL来求解,TOL的默认值为TOL=max(size(A))*norm(A,1)*eps,矩阵的-1范数越大,求解的误差越大; ! C3 p: J) H7 V) ]
(3)[X,W]=nnls(A,b) 当x(i)=0时,w(i)<0;当下x(i)>0时,w(i)0,同时返回一个双向量w。 # u8 M6 G5 N1 l* W- ]# L* }$ c
【例9】求方程组的非负最小二乘解 ! Z9 W( z! J0 {3 ]  z* f, v
A=[3.4336 -0.5238 0.6710
* {) f$ I5 S! j$ _-0.5238 3.2833 -0.7302 - o! ~: R& ?6 l% ~+ C" a
0.6710 -0.7302 4.0261];
7 p5 D* ]  i; zb=[-1.000 1.5000 2.5000]; % f4 J1 o% W' C8 f
[X,W]=nnls(A,b) * H$ Y3 T' l1 ?+ Y& U+ q$ D$ F
X= ; Z1 z4 H# R# t
0
- t7 ^6 W' C! Y! N1 Q) k; D; l1 s0.6563
9 U0 b% n& N7 W0.6998
6 }3 E7 J! S0 c: ~8 ?W=
' \4 p; w3 ]1 p: s-3.6820
0 V2 O7 S! k7 m1 @! W-0.0000
% w1 n5 q) s: Y2 V" q. {. K* J0 y. X-0.0000
; ~, o$ Q" m6 e* U% Wx1=A\b
- V2 d% Q+ E- q8 A: k6 {" lx1= : r6 H7 f, I% f5 e; A9 a' O# n
-0.3569   T8 }8 f: o0 ?/ w8 e9 f4 x% g
0.5744 * {6 G, v; z- S* o" y8 C
0.7846 7 A! w( ?7 t+ _' B2 i
A*X-b
; F6 M- b+ [; h+ s! X8 ]( S9 ~) _ans= 0 |' ~5 J; ~0 Q
1.1258
; T% L: M5 }1 _0.1437
7 _1 ]/ a& D. l4 ?7 j4 p" T8 l-0.1616
' w% Y0 p9 F  b7 G0 ^0 \1 }3 Z* vA*x1-b
1 |- z' n6 p5 [& v+ `3 n6 c0 u3 pans=
( ]% S- U. P( G4 _9 L1.0e-0.15 1 i3 W- D; l$ y. C$ Q
-0.2220 2 P3 o* W; x+ T5 Z' D& Y2 T5 u
0.4441 " [0 }0 J0 Y+ R3 m7 n
0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 14:05 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表