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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求解线性方程组! f0 @8 y$ M0 O9 S
solve,linsolve
  Y1 E- |3 O- a6 c- w6 ^1 _例:2 X% i2 L* r7 O3 e* ^7 x6 l3 b
A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];
6 U) T  J, L% L( b8 y) d) o%矩阵的行之间用分号隔开,元素之间用逗号或空格$ q4 I$ e0 N, V# Y: j7 F7 @
B=[3;1;1;0]
0 A1 t0 E0 w! VX=zeros(4,1);%建立一个4元列向量. G- c: u: ~7 E( J
X=linsolve(A,B)
% \) v1 r& `: N: ~* r) q+ vdiff(fun,var,n):对表达式fun中的变量var求n阶导数。
, G2 y$ |* Y/ h9 N5 R7 Q) p8 `4 K1 h% {3 ~* c8 |0 Q5 A/ p) w& R
例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式
8 t- ?4 ~) T, |, A3 vdiff(F); %matlab区分大小写
8 j3 E1 }- ?3 Wpretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式
1 @6 e1 e3 R% c% y+ g3 @9 z9 d- f2 k1 c  X0 k7 ~- F

* \$ g8 q1 v% o# q8 d3 ~非线性方程求解 ' G5 B8 D! T: r
fsolve(fun,x0,options)
0 i! o" H4 {! U  B; |其中fun为待解方程或方程组的文件名;
3 x. P6 X. c" e& ]- Fx0位求解方程的初始向量或矩阵;+ \+ b9 {- U7 ~/ C$ c. `' x, z4 _; \
option为设置命令参数
. A! W+ j. G) B; G6 x建立文件fun.m:
6 I% J. Z0 f1 y- |, ]function y=fun(x), a" c; \7 U6 _
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...
+ w4 o. O) Q( P% ^8 n5 y5 ~x(2) - 0.5*cos(x(1))+0.3*sin(x(2))];
: H1 }  e3 l  |7 X
/ c* W) m% q& m4 T>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))
2 ^# h9 h! X7 R% I4 T注:, ?& O2 m! I. b. |8 e
...为续行符9 y" }9 w9 t8 n$ f. U+ c
m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程) b$ [$ j& V& v  V" f

  @7 v! s# Q, l  }; Z3 e7 ~  O
Matlab求解线性方程组
; d& t6 u  h) X3 j: [AX=B或XA=B 4 Z4 P: w. Z8 y3 r3 L5 f  M$ O
在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如:
" i0 Z% M  P1 ~: [# w2 a, oX=A\B表示求矩阵方程AX=B的解;
: Y+ ?; K+ l  f+ JX=B/A表示矩阵方程XA=B的解。
0 Z% ?+ l# U) V对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 6 P/ P6 s* w7 T  i+ E
. e% G5 _+ }% I5 r) a6 e5 o0 C
如果矩阵A不是方阵,其维数是m×n,则有:
/ r5 s2 E( I9 z* o; V  ]m=n 恰定方程,求解精确解;
4 O, Q3 t( [& e, }. V3 }' z! ^' km>n 超定方程,寻求最小二乘解; : o* I9 Y' i9 N8 y
m<n 不定方程,寻求基本解,其中至多有m个非零元素。
1 z+ s2 @( Y* _针对不同的情况,MATLAB将采用不同的算法来求解。 5 V! D# n+ y8 s& m6 s

, M4 j3 F( Z* d9 C$ Q# }- _/ }, d& ?7 c" P8 o, p
一.恰定方程组
( C0 ^# m! n: L0 S7 K% X6 t恰定方程组由n个未知数的n个方程构成,方程有唯一的一组解,其一般形式可用矩阵,向量写成如下形式:
) J  ]2 \' c6 ], o8 g( W% MAx=b 其中A是方阵,b是一个列向量;
! N, R" x. c8 a, t3 ?+ D$ l7 e4 }在线性代数教科书中,最常用的方程组解法有:
& X& k$ c3 m" m(1)利用cramer公式来求解法; 4 A9 {6 }4 j; h- h- Q
(2)利用矩阵求逆解法,即x=A-1b;
; {( t" U& o& S1 f9 b# r. \(3)利用gaussian消去法;
+ M+ H0 y! R3 D. c(4)利用lu法求解。   O$ [2 `; u0 q+ I8 C, k0 [
一般来说,对维数不高,条件数不大的矩阵,上面四种解法所得的结果差别不大。前三种解法的真正意义是在其理论上,而不是实际的数值计算。MATLAB中,出于对算法稳定性的考虑,行列式及逆的计算大都在lu分解的基础上进行。
: X/ k' w% t  o2 B- w% ^9 B% q! H在MATLAB中,求解这类方程组的命令十分简单,直接采用表达式:x=A\b。
5 D' G2 X6 o: r; _, B3 F在MATLAB的指令解释器在确认变量A非奇异后,就对它进行lu分解,并最终给出解x;若矩阵A的条件数很大,MATLAB会提醒用户注意所得解的可靠性。 ' q" h; E7 ~( g8 {; A
如果矩阵A是奇异的,则Ax=b的解不存在,或者存在但不唯一;如果矩阵A接近奇异时,MATLAB将给出警告信息;如果发现A是奇异的,则计算结果为inf,并且给出警告信息;如果矩阵A是病态矩阵,也会给出警告信息。 ( {' P- K, g& W/ F
注意:在求解方程时,尽量不要用inv(A)*b命令,而应采用A\b的解法。因为后者的计算速度比前者快、精度高,尤其当矩阵A的维数比较大时。另外,除法命令的适用行较强,对于非方阵A,也能给出最小二乘解。 $ R1 `7 [7 S- O

! k) v) f  B- e: x0 O# i8 Z7 `9 w二.超定方程组
9 I% g# ?, N& K6 f4 K1 v对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快;
" {% {& S5 |7 J% ?: \【例7】 , w5 F8 I% A* f" B- N
求解超定方程组 + V. r- `3 q+ T1 v* e
A=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] 2 c) Z8 ~" S5 g" G
A=
* c% }2 u  |# Q6 n- I4 ~- P- }8 b2 -1 3
- a. s# a% ?4 q3 1 -5
+ g0 T* X/ R9 [4 T8 J+ I' S2 z4 -1 1
/ v) v8 k9 [. l/ M1 3 -13 + s, k" l/ V% h% ?5 D
b=[3 0 3 -6]’; 0 o+ p; N& m" ?; O
rank(A) * |2 }1 D) l( Q% U$ j6 Z7 o: D
ans= 5 G! v7 y7 K3 `/ F9 J
3 , n0 H3 L! T1 U
x1=A\b
4 d. }' y' D" N6 B: j/ N) j& Fx1= ) e  T7 r: _$ R3 h9 ?9 f
1.0000
, c3 A* v- p8 T( t+ S) K2.0000
0 I; c: N, H2 Z$ V8 o3 x1.0000 9 K! C0 l) l( q& H% `
x2=pinv(A)*b+ [: A1 |2 ~: _/ b( l: O5 t
x2= & r* x( u8 I1 ?$ e8 M
1.0000 , b4 `& z5 s7 Q( C$ s4 n2 x
2.0000
. o  L: _- H2 K8 v/ ]( N9 y9 T1.0000
+ i3 w* z: J$ n: d* v" B% g+ R+ [A*x1-b / r  ?4 C3 e- x& |4 z. [
ans=
& E3 {, ~5 `5 l- b6 q1.0e-014
6 a. o$ N% ]. L* e& N- U6 z( ]! j  h-0.0888
. y7 t& h, u: Q6 i1 h" o-0.0888
5 X3 ~$ C0 Z9 m4 l& a-0.1332 $ E( v; i8 F: \  u5 A: L- q
0
( O7 r# O1 }- C可见x1并不是方程Ax=b的精确解,用x2=pinv(A)*b所得的解与x1相同。
! q2 i% n& |0 e& }: V- j, q2 c/ \6 ]3 {( z! ^5 K) p
三.欠定方程组 ' ~0 h6 D6 I6 s9 R9 r& ~
欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB将寻求一个基本解,其中最多只能有m个非零元素。特解由列主元qr分解求得。 * T- ]+ O% ?7 _% S
【例8】 # ^  G" Y( \! y6 u# Z+ y, {
解欠定方程组 ( M+ g& N5 k5 _, w$ S' J
A=[1 -2 1 1;1 -2 1 -1;1 -2 1 5] . e5 ]3 E  V8 u, @
A=
+ u. r6 H+ \. Z/ l' M9 {1 -2 1 1 # \% _$ {1 X5 N" q6 u0 w
1 -2 1 -1
' B/ [. ~5 E( K1 -2 1 -1 ! K2 f3 D8 W/ d0 s
1 -2 1 5 0 k* h+ j+ ?* q$ @- ?
b=[1 -1 5]’ 0 @# D+ `: j+ v$ j% u
x1=A\b 1 \4 [5 f# F8 @: A5 t
Warning:Rank deficient,rank=2 tol=4.6151e-015 3 d6 l4 A6 `4 I& k/ e
x1=
/ _" G- b. z9 x3 v% S9 ~$ p5 h0
5 X5 B% S4 I1 h7 W2 p-0.0000 ) ^, h* |- W1 Y+ ]+ b
0 + v$ V0 r8 A5 r2 T7 F
1.0000 % c: W+ x, g% V! B: B
x2=pinv(A)*b
: I6 J! Q! V9 l. Fx2=
. w8 z" v* z- N! [& T  u, @! ]0 / n0 b. X# l" g& M) j
-0.0000
) }% g, a9 B9 u5 l0.0000
7 T4 R, w: S( T3 }, j1.0000
7 r3 U4 C7 K" Z, O- b
" Z* |& s; r. F, i  S/ f& C4 W7 P. \四.方程组的非负最小二乘解 : k* t% s; ?; @$ |6 j
在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程的精确解更有意义。在MATLAB中,求非负最小二乘解常用函数nnls,其调用格式为:
# Z2 s, [3 W/ m; I(1)X=nnls(A,b)返回方程Ax=b的最小二乘解,方程的求解过程被限制在x 的条件下;
1 t& u9 U$ Z& m: S$ W, W& c" t1 Q(2)X=nnls(A,b,TOL)指定误差TOL来求解,TOL的默认值为TOL=max(size(A))*norm(A,1)*eps,矩阵的-1范数越大,求解的误差越大;
" }8 {4 H; c& K+ l(3)[X,W]=nnls(A,b) 当x(i)=0时,w(i)<0;当下x(i)>0时,w(i)0,同时返回一个双向量w。
. F0 j9 _7 P% D1 n" w5 ~$ A【例9】求方程组的非负最小二乘解
* y& o; [  o0 w- K( q" hA=[3.4336 -0.5238 0.6710 . t6 G( _" y. @1 a$ S' M
-0.5238 3.2833 -0.7302
, O3 l: s/ s/ v/ p0.6710 -0.7302 4.0261]; 4 ]3 d2 ]( \3 n7 ]) e# h: c
b=[-1.000 1.5000 2.5000]; # ]  i( w9 N* z
[X,W]=nnls(A,b) - e" ?9 A0 G; X8 |+ w: n$ Z
X= 1 P, ~6 {, }3 N
0 5 [. @+ Q; f* e; U5 U7 f
0.6563 9 M( ?2 ^7 p- P2 N
0.6998
8 \3 b9 z4 l+ v: lW=
& H. S9 V: G6 N3 b$ g6 T-3.6820
# x9 O; i2 Q  X  r-0.0000 % B' G0 d" l. |3 H: ]
-0.0000 2 O. a, K' d) }5 h7 A3 ]
x1=A\b ) q* T5 @$ R1 y2 Z' Z4 V. K8 O. L
x1=
$ j& \& G6 k, g" {- e% Q+ f: |-0.3569 7 w1 A0 q4 q: ?1 }3 S8 f' g
0.5744
& U  t! g5 C+ h- @. w0.7846
# \& \% O& b% F2 I! w6 `A*X-b 6 b: \/ V- e" d- f1 B$ F
ans=
2 |3 R- r! ~% ?1.1258 ) ]( Z$ Z! @6 M; Z3 n9 X. z0 F' U8 P
0.1437
% s7 D. k& k1 s9 t7 y. E- Q4 y-0.1616
/ e9 ~. U/ Z8 w, t/ Z# qA*x1-b 7 h. _: y# z% x7 U3 U5 f+ @* [
ans=   C5 y  A) y, }9 [; m5 b$ Z0 @
1.0e-0.15 % z/ S9 q+ @2 ?# N! P4 r& M7 Q8 c
-0.2220 9 u$ j+ T3 Z& x: B/ O3 ~
0.4441 . v5 Y" y% `& W7 H* T9 R
0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-2 21:45 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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