📄 matlab5.htm
字号:
<html>
<head>
<title>学用MatLab</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
body { font-family: "宋体"; font-size: 9pt; text-decoration: none}
h2 { font-family: "楷体_GB2312"; font-size: 18pt; text-decoration: underline; color: #FF9999}
h1 { font-family: "隶书"; font-size: 24pt; font-style: italic; font-weight: bolder; color: #CC66CC; text-decoration: blink}
.explain { border-color: black black #00FF00; font-weight: bold; color: #333333}
.code { font-family: "Arial", "Helvetica", "sans-serif"; font-size: 12pt; background-color: #FFFFFF; line-height: 24pt}
h3 { font-size: 12pt; font-style: italic; font-weight: bold; color: #9999FF}
-->
</style>
</head>
<body bgcolor="#CCFFCC" text="#666600" link="#009900" alink="#00FF00" vlink="#006600">
<h1 align="center">矩阵和线性代数</h1>
<h2>MatLab中的矩阵</h2>
<p>MatLab中有好多函数可以产生不同的矩阵,下面就让我们产生两个3*3的矩阵,这一章中,我们的学习就靠她们了!!!</p>
<p class="code">A = pascal(3) <br>
A = <br>
1 1 1 <br>
1 2 3 <br>
1 3 6 <br>
B = magic(3) <br>
B = <br>
8 1 6 <br>
3 5 7 <br>
4 9 2 </p>
<p>还有一个3*2的随机矩阵:</p>
<p class="code">C = fix(10*rand(3,2)) <br>
C = <br>
9 4 <br>
2 8 <br>
6 7</p>
<h3>看看列矩阵,行矩阵,以及常数的表达:</h3>
<p class="code">u = [3; 1; 4] <br>
v = [2 0 —1] <br>
s = 7</p>
<p>产生的矩阵是:</p>
<p class="code">u = <br>
3 <br>
1 <br>
4 <br>
v = <br>
2 0 —1 <br>
s = <br>
7</p>
<h3>加减法</h3>
<p class="code">X = A + B <br>
X = <br>
9 2 7 <br>
4 7 10 <br>
5 12 8 <br>
Y = X –A <br>
Y = <br>
8 1 6 <br>
3 5 7 <br>
4 9 2 </p>
<p>若二矩阵维数不统一,则会出错!</p>
<p class="code">X = A + C <br>
<br>
Error using ==> + <br>
Matrix dimensions must agree.</p>
<p>向量的乘积与转置</p>
<p class="code">x = v*u <br>
x = <br>
2 <br>
X = u*v <br>
X = <br>
6 0 —3 <br>
2 0 —1 <br>
8 0 —4 <br>
X = B' <br>
X = <br>
8 3 4 <br>
1 5 9 <br>
6 7 2 </p>
<p>如x与y均是列向量,则x*y无解,但下二表达式却可以:</p>
<p class="code">x'*y<br>
y'*x</p>
<p>称<span class="explain">内积</span>或<span class="explain">点积</span>.</p>
<p>下面的语句产生<span class="explain">单位矩阵</span> </p>
<p class="code">eye(m,n)</p>
<p>若用eye(n)则产生n*n的方阵</p>
<h2>解线性方程</h2>
<p>情况一:</p>
<p class="code">x = A\u <br>
x = <br>
10 <br>
—12 <br>
5</p>
<p>又如:</p>
<p class="code">X = A\B <br>
X = <br>
19 –3 —1 <br>
—17 4 13 <br>
6 0 —6</p>
<p>情况二;y是不同时刻t时的观测值:</p>
<p class="code">t = [0 .3 .8 1.1 1.6 2.3]'; <br>
y = [.82 .72 .63 .60 .55 .50]';</p>
<p>若函数形式是:y(t)=c1+c2*exp(t);<br>
构造矩阵:</p>
<p class="code">E = [ones(size(t)) exp(–t)] <br>
E = <br>
1.0000 1.0000 <br>
1.0000 0.7408 <br>
1.0000 0.4493 <br>
1.0000 0.3329 <br>
1.0000 0.2019 <br>
1.0000 0.1003 </p>
<p>则可求得系数c1及c2</p>
<p class="code">c = E\y <br>
c = <br>
0.4760 0.3413</p>
<p>表明:y(t)=0.4760+0.3413*exp(t)<br>
画图如下:</p>
<p class="code">T = (0:0.1:2.5)'; <br>
Y = [ones(size(T)) exp(–T)]*c; <br>
plot(T,Y,'–',t,y,'o') </p>
<p><img src="image/algebra1.jpg" width="538" height="407"></p>
<h2>转置与行列式</h2>
<p>若A是方阵,且是非奇异的,则:</p>
<p class="code">d = det(A) <br>
X = inv(A) <br>
d = <br>
1 <br>
X = <br>
3 —3 1 <br>
—3 5 —2 <br>
1 —2 1 </p>
<p>若c不是方阵,则用pinv:</p>
<p class="code">X = pinv(C) <br>
X = <br>
0.1159 —0.0729 0.0171 <br>
—0.0534 0.1152 0.0418</p>
<p>那么我们可以发现,下面3个命令具有同样的功效(A是m*n的矩阵,m>n):</p>
<p>x = A\b <br>
x = pinv(A)*b <br>
x = inv(A’*A)*A’*b</p>
<h2>LU.RQ.及Cholesky分解</h2>
<p>MatLab求解线性方程建立在以下三个分解之上:<br>
Cholesky分解<br>
Guass(高斯)分解<br>
正交分解</p>
<h3>Cholesky分解</h3>
<p class="explain">A=p*p'</p>
<p>让我们临时把A变一变:</p>
<p class="code">A = pascal(6) <br>
A = <br>
1 1 1 1 1 1 <br>
1 2 3 4 5 6 <br>
1 3 6 10 15 21 <br>
1 4 10 20 35 56 <br>
1 5 15 35 70 126 <br>
1 6 21 56 126 252 </p>
<p>A是二项式系数,每一项是其左方与上方系数之和,求其Cholesky分解系数有:</p>
<p class="code">R = chol(A) <br>
R = <br>
1 1 1 1 1 1 <br>
0 1 2 3 4 5 <br>
0 0 1 3 6 10 <br>
0 0 0 1 4 10 <br>
0 0 0 0 1 5 <br>
0 0 0 0 0 1</p>
<p>R认识二项式系数.<br>
这样对于线性方程便可化简:<br>
A*x = b<br>
R'*R*x = b<br>
x = R\(R'\b) <br>
复杂度由O(n^3)变为O(n^2);</p>
<h3>LU分解 </h3>
<p class="explain">A = L U</p>
<p>其中,L时下三角阵,U是上三角阵,如:</p>
<p class="code">[L,U] = lu(B) <br>
L = <br>
1.0000 0 0 <br>
0.3750 0.5441 1.0000 <br>
0.5000 1.0000 0 <br>
U = <br>
8.0000 1.0000 6.0000 <br>
0 8.5000 —1.0000 <br>
0 0 5.2941</p>
<p>同样:</p>
<p>A*x = b可以解为<br>
x = U\(L\b)</p>
<h3>QR分解 </h3>
<p>正交阵有如下性质:</p>
<p>Q'Q = I</p>
<p>正交阵的好处在于,她保持了原阵的长度,角度,并且在计算的过程中不会扩大误差.</p>
<p>RQ分解如下:</p>
<p><span class="explain">A = Q R</span> 或 <span class="explain">A P =
Q R</span></p>
<p>其中,Q是正交阵,R是上三角阵.</p>
<h2>矩阵的幂与指数</h2>
<p>若A是方阵,p是正数,则</p>
<p class="code">X = A^2 <br>
X = <br>
3 6 10 <br>
6 14 25 <br>
10 25 46</p>
<p>若A是方阵,且是非奇异的,则X=A^(-P)将inv(A) P次方,如:</p>
<p class="code">Y = B^(–3) <br>
Y = <br>
0.0053 —0.0068 0.0018 <br>
—0.0034 0.0001 0.0036 <br>
—0.0016 0.0070 —0.0051</p>
<p>分数词幂将由A的特征值决定.</p>
<p>若是对矩阵的每个元素进行幂,用<span class="explain">.^</span>,如</p>
<p class="code">X = A.^2 <br>
A = <br>
1 1 1 <br>
1 4 9 <br>
1 9 36</p>
<p><span class="explain">sqrtm(A)</span>计算A^(1/2),但要更精确,而<br>
<span class="explain">sqrt(A)</span>则计算A.^(1/2),是一个元素一个元素的算.</p>
<p>dx/dt=Ax,可以表示为<span class="explain">x(t)=exp(tA)*x(0)</span>;<br>
下面来看看如何计算:--expm(A) </p>
<p class="code">A = <br>
0 —6 —1 <br>
6 2 —16 <br>
—5 20 —10<br>
x0 = <br>
1 <br>
1 <br>
1</p>
<p>计算如下:</p>
<p class="code">X = []; <br>
for t = 0:.01:1 <br>
X = [X expm(t*A)*x0]; <br>
end</p>
<p>作图有:</p>
<p class="code">plot3(X(1,:),X(2,:),X(3,:),'–o')</p>
<p><img src="image/algebra2.jpg" width="582" height="330"></p>
<h2>特征值</h2>
<p class="explain">Av=λv</p>
<p>若L是特阵值矩阵,则特征向量是V: </p>
<p>AV=VL;</p>
<p>如下:</p>
<p class="code">A = <br>
0 —6 —1 <br>
6 2 —16<br>
—5 20 —10 <br>
lambda = eig(A)<br>
lambda = <br>
—3.0710 <br>
—2.4645+17.6008i <br>
—2.4645-17.6008i </p>
<p>由exp(λt)可以看出exp(At)(见上小节)</p>
<p>若用二参数调用函数eig(),则返回特征向量及特征值矩阵:</p>
<p class="code">[V,D] = eig(A) <br>
V = <br>
—0.8326 —0.1203+ 0.2123i —0.1203– 0.2123i <br>
—0.3553 0.4691+ 0.4901i 0.4691– 0.4901i <br>
—0.4248 0.6249– 0.2997i 0.6249+ 0.2997i <br>
D = <br>
—3.0710 0 0 <br>
0 —2.4645+17.6008i 0 <br>
0 0 —2.4645—17.6008i</p>
<p>对于下面的矩阵:</p>
<p class="code">A = <br>
6 12 19 <br>
—9 —20 —33 <br>
4 9 15 <br>
V = <br>
0.4741 0.4082 —0.4082 <br>
—0.8127 —0.8165 0.8165 <br>
0.3386 0.4082 —0.4082 <br>
D = <br>
—1.0000 0 0 <br>
0 1.0000 0 <br>
0 0 1.0000</p>
<p>可以看出,有二特征值是一样的,其特征向量仅差一个符号,在Symbolic Math Toolbox中提供了Jordan标准型的函数,如下:</p>
<p class="code">[X,J] = jordan(A) <br>
X = <br>
—1.7500 1.5000 2.7500 <br>
3.0000 —3.0000 —3.0000 <br>
—1.2500 1.5000 1.2500 <br>
J = <br>
—1 0 0 <br>
0 1 1 <br>
0 0 1</p>
<p><font size="6"><a href="index.htm">back</a></font></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -