图像放大算法总结及MATLAB源程序(精选2篇)
1.图像放大算法总结及MATLAB源程序 篇一
桥式吊车运动控制系统的建模及MATLAB仿真(附程序)
简介
桥式起重机是横架于车间、仓库及露天堆场的上方,用来吊运各种物体的机械设备,通常称为“天车”或
“吊车”。它是机械工业、冶金工业和化学工业中应用最广泛的一种起重机械。实际生产中的桥式吊车(天车)类似,是一个MIMO复杂控制系统。
桥式吊车系统由三部分组成:桥架驱动系统,车体驱动系统和重物装吊系统。其工作流程为:先将重物起吊至预先设定好的高度,然后吊车运动将重物运到想要放置的位置上方,最后把重物下放到想要放置的位置上。
确定要研究的系统为桥式吊车运动控制系统
桥式吊车系统工作示意图见下图1:
p
M
m
x
z
F
θ
mg
图1
桥式吊车工作示意图
对于如上桥式吊车控制系统,首先做如下假设:
1)
吊车的行走运动仅限于吊车一个自由度,即假设桥架不运动,只有吊车在桥架上行走。
2)
吊车行走时吊装重物的绳索长度不变。
图中,x坐标为水平方向,z坐标为垂直方向。重物的摆动是由吊车与重物的运动产生的,可以根据动力学有关规律建立吊车及重物的运动方程式。
1)
在水平方向,吊车和重物整体受力为F(t),由牛顿第二定律得
(1)
2)
在垂直于绳索方向,重物受力为,由牛顿第二定律得
(2)
由吊车在行走时吊装重物的绳索长度不变的假设可得出下面两个关系式:
(3)
(4)
式中,为绳索长度。
由(3)可得
(5)
(5)代入(1)得:
(6)
同样由式(4)可得:
(7)
将(5)(7)代入(2)得
(8)
又尽量小,所以有如下近似式:,将(6),(8)线性化可得:
(9)
(10)
由(9)和(10)计算得
(11)
和
(12)
3)
吊车驱动装置的方程式。吊车由电动机驱动,简化的认为电动机是一个时间常数为的一阶惯性环节,即它产生的驱动力F(t)与其控制电压v(t)之间满足方程式:
(13)
其中K为放大系数。
选择系统的输入、输出变量和状态变量
选择5个状态变量分别为:,,;
输入变量为:;
两个输出变量为:。
建立状态空间描述
根据(11)(12)(13)式可得出描述吊车运动系统的状态空间表达式为:
选取适当参数:对一个实际的桥式吊车吊车运动系统,假定具有如下各具体参数:M=1000kg,m=4000kg,l=10m,K=100N/V。将它们代入上面的状态空间表达式得:
分析系统的稳定性
用特征值法。在MATLAB中输入以下程序:
eig(A)
ans
=
0
0
0
+
2.2136i
0
2.2136i
系统的5个开环特征值不全位于S左平面上,有4个位于虚轴上,所以系统为临界不稳定。
系统输出仿真波形如下图所示:
判断系统的能控性
使用MATLAB判断系统的能控性,输入以下程序:
A=[0
0
0
0;0
0
-39.2
0
0.001;0
0
0
0;0
0
-4.9
0
0.0001;0
0
0
0
-1];
B=[0;0;0;0;100];
C=[1
0
0
0
0;0
0
0
0];
rct=rank(ctrb(A,B))
rct
=
根据判别系统能控性的定理,该系统的能控性矩阵满秩,所以该系统是能控的。
采用状态反馈进行系统综合因为系统是能控的,所以,可以通过状态反馈来任意配置极点。例如将极点配置在:s1=-0.16-j0.16
s2=-0.16+j0.16
s3,s4,s5=-1。
在MATLAB中输入:
P=[-0.16+0.16i,-0.16-0.16i,-1,-1,-1];
K=acker(A,B,P)
求出状态反馈矩阵K:
K
=
0.52245
4.8327
-1420.7
-137.21
0.0232
在MATLAB中输入
A-B*K
ans
=
0
0
0
0
0
0
-39.2
0
0.001
0
0
0
0
0
0
-4.9
0
0.0001
-52.245
-483.27
1.4207e+005
13721
-3.32
因此综合后系统的状态空间描述为:
采用MATLAB编写m文件进行仿真。
运行仿真程序,得到仿真曲线如下图:
将极点配置在:s1=-0.2
s2=-0.2
s3,s4,s5=-1。计算出K=[0.40816
5.3061
-1438.1
-119.06
0.024]此时输出y的仿真曲线如下:
将极点配置在:s1=-0.16+0.16i
s2=-0.16-0.16i
s3=-1
s4=-2
s5=-3。计算出K=[3.1347
25.339
-2145.4
553.73
0.0532]此时输出y的仿真曲线如下:
实验结论
通过比较3组不同的极点配置下状态反馈系统的输出响应曲线和原系统的输出响应曲线可以看出,不同的极点配置对系统性能有一定的影响,但只要极点都配置在S左平面,就可以保证系统具有一定的动态和稳态性能。
附录:程序
%*******************************************
%桥是吊车运动控制系统极点配置设计及仿真
2015.12.30
lwd
%*******************************************
%建立状态空间表达式
A
=
[0,1,0,0,0;0,0,-39.2,0,10^(-3);0,0,0,1,0;0,0,-4.9,0,10^(-4);0,0,0,0,-1]
B
=
[0;0;0;0;100]
C
=
[1,0,0,0,0;0,0,1,0,0]
D
=
[0;0]
%分析系统稳定性
eig(A)
%求A的特征值,通过特征值在S平面分布判断系统稳定性
%系统仿真输出波形
[num,den]
=
ss2tf(A,B,C,D);
sys1
=
tf(num(1,:),den);
sys2
=
tf(num(2,:),den);
figure
step(sys1)
figure
step(sys2)
%判断系统的能控性
rct
=
rank(ctrb(A,B))
obs
=
rank(obsv(A,C))
%如果能空则进行极点配置设计
if
==
rct
%第一次极点配置设计
P
=
[-0.16+0.16*i,-0.16-0.16*i,-1,-1,-1];
K
=
acker(A,B,P)
A1
=
A-B*K
[num,den]
=
ss2tf(A1,B,C,D);
sys1
=
tf(num(1,:),den);
sys2
=
tf(num(2,:),den);
figure
step(sys1)
figure
step(sys2)
%第二次极点配置设计
P
=
[-0.2,-0.2,-1,-1,-1];
K
=
acker(A,B,P)
A1
=
A-B*K
[num,den]
=
ss2tf(A1,B,C,D);
sys1
=
tf(num(1,:),den);
sys2
=
tf(num(2,:),den);
figure
step(sys1)
figure
step(sys2)
%第三次极点配置设计
P
=
[-0.16+0.16*i,-0.16-0.16*i,-1,-2,-3];
K
=
acker(A,B,P)
A1
=
A-B*K
[num,den]
=
ss2tf(A1,B,C,D);
sys1
=
tf(num(1,:),den);
sys2
=
tf(num(2,:),den);
figure
step(sys1)
figure
step(sys2)
end
2.LU分解MatLab算法分析 篇二
先来解读下题目,寥寥几句话,里面囊括的信息量却不少,然后这些都得自己去琢磨。首先对A矩阵能做LU分解,即能把A分解成这种形式A=L*U(U是上三角矩阵,是由A矩阵经过高斯消元后得到的,L是下三角矩阵,其对角线全为1,其他非零元素为在消去(i,j)位置元素过程中主元所乘的系数),条件有3,一是矩阵A必须为方阵,A如果不是方阵,就不要想着对它做LU分解啦,这是基本条件,牢记啊!二是矩阵A必须可逆,换种说法就是A必须为非奇异矩阵,这两种说法是等价的,而这又等价于A是满秩的,A是满秩又等价于A的行列式值非0,好绕,矩阵就是这样,很多定理其实是等价的,但是你得记住,不然在推导一些定理或公式的时候会犯一些基本的常识性错误。三是矩阵A在高斯消元过程中必须没有出现0主元,也就是说只有在对A进行高斯消元过程中没有出现进行交换这种情况下,A才能分解成L*U这种形式,如果对A进行高斯消元,中间某一步出现0主元,需要进行行交换了,这种情况下就不要想对A进行LU分解啦,因为不满足条件3啊!那么问题来了,假如出现了有0主元这种情况,我又想对A进行LU分解,那应该怎么办?
这就引出了带行变换的LU分解,也就是本文的主题。根据书上的定理,对任意一个非奇异矩阵(等价于可逆矩阵)都存在一个置换矩阵P使得P*A可以分解成L*U这种形式,即PA=LU。想想其实这定理也是不言自明的,刚才A不是要进行行变换才能继续高斯消元吗?而LU分解前提又是高斯消元过程中不能出现行交换,那好,我事先对A矩阵在高斯消元过程中需要交换的行给交换掉,形成一个新的矩阵B,那我对B高斯消元那肯定就不会出现需要行交换的情况,这就满足了LU分解第三个条件了,这样B不就可以进行LU分解了吗?是的,PA=LU这种形式的LU分解采用的就是这种思想。那么现在的问题是,怎么在代码中实现对A矩阵的LU分解,并输出P,L,U矩阵呢?我在网上搜了一下,发现结果大都不尽如人意,大多数程序吧只能说做A=LU这种形式的分解,一旦说A不满足条件3,那就死翘翘了,这种程序先不论其能否运行成功,结果是否正确,其鲁棒性也太差了!用个时髦点的词来说就是太low了!通用性太差了!不光如此,代码也没什么注释,可读性很差,让人怀疑是不是写给别人看的,尤其像我这种编程渣渣,看个代码费老半天劲都看不懂说什么。于是,我决定按自己的想法来走。
首先从最简单的情况考虑,这也是我们做研究、做学术、做工程必须要时刻牢记心中的一点,很多人喜欢一上来就把所有问题、把最复杂的情况、把方方面面都给考虑到,然后再开始实现他的想法,我自己也有这个习惯,但是,这并不是一个好习惯,一上来就好高骛远、就想着高大上这本质上是一种急功近利的表现,那样的话你会陷入到各种各样的技术细节当中,你会想半天却仍然写不出半点实质性的东西出来,所以最好的办法是,先考虑最简单、最核心的情况,这样不仅大大降低问题的复杂度,同时也为将来进一步扩展程序、解决更复杂的情况打下了一个坚实的基础。
在这个例子中,最简单的情况就是矩阵A在高斯消元过程中不需要进行行交换,也就是说A可以分解成A=L*U这种形式。这种情况下,代码如下。
function LUDecomposition(A,n)%A is the square matrix,n is the order of A
L=eye(n);%Let the L matrix be an identity matrix at first for i=1:n-1
for j=i+1:n
L(j,i)=A(j,i)/A(i,i);
A(j,:)=A(j,:)-(A(j,i)/A(i,i))*A(i,:);end end
U=A %A becomes U matrix after Gauss elimination L
可以试着令A=[2 2 2;4 7 7;6 18 22],调用函数获得L矩阵为[1 0 0;2 1 0;3 4 1],U矩阵为[2 2 2;0 3 3;0 4 4],用笔验算下,这个结果是正确的。代码运行结果如图所示:
这部分代码的主要思想是这样的,矩阵A的阶次为n的话,A在高斯消元后有n个非零主元。在消元过程中,A共需要消掉n-1个主元下面所有的元素,注意,第n个主元已经是矩阵的最后一个元素了,它的下面和右边都没有其他元素了,所以不存在说对第n个主元下面所有元素消去的情况。这就获得了我们代码的第一个for循环,从第1行主元开始消元,一直到第n-1行主元。而在获得每一行主元过程中,需要对该行主元下面所有元素都消去,假如现在要获得第i行主元的话,就是说要对该主元所在列的第i+1行到第n行元素都消掉,那么这就获得了我们代码的第二个for循环,从消去第i+1个元素开始一直到第n个元素。前文说过,消掉第(j,i)个位置元素过程中,主元所乘系数就是L矩阵第(j,i)位置的元素,所以有L(j,i)=A(j,i)/A(i,i)。然后的话,就是把A矩阵第j行减去第j行乘以L(j,i),这样就可以消掉第(j,i)个元素了,就是这行代码A(j,:)=A(j,:)-(A(j,i)/A(i,i))*A(i,:)。最后,执行完两层for循环后,A矩阵就成为了U矩阵,L矩阵也从最初的单位阵成了L矩阵。
好了,我们已经实现了最简单的情况了,下面考虑复杂点的情况,就是说对A进行PA=LU这种形式的分解。假如A在消元过程中出现0主元了,那么怎么办?很简单,只需要从该0主元下面所有元素中找到一个非0元素,然后将其所在的行与该0主元所在的行进行交换就行了,不要忘了,对A矩阵两行进行了交换,对应到P矩阵中的操作是相应的两行也要进行交换,因为我们是通过P矩阵两行交换后然后左乘A矩阵使得A矩阵两行进行交换的。A矩阵交换第i行和第k行元素对应到L矩阵中相应两行的消元系数也应该交换位置,就是说L矩阵的第i行和第k行元素也要交换位置,当然,主对角线上的1是不需要交换的,因为他们并不是消元系数。交换完成后,继续执行消元操作,其步骤和上面考虑的最简单的情况就是一样的了。就这样,我们就实现了PA=LU这种形式的分解。令A=[1 2-3 4;4 8 12-8;2 3 2 1;-3-1 1-4],代入函数运算得L矩阵为[1 0 0 0;-3 1 0 0;2-0.2 1 0;2-0.2 1 0;4 0 3.75 1],U矩阵为[1 2-3 4;0 5-8 8;0 0 6.4-5.4;0 0 0-3.75],P矩阵为[1 0 0 0;0 0 0 1;0 0 1 0;0 1 0 0],用笔验算下,结果与函数运行结果是一致的,当然了,这个函数我只是代了3,4个不同的A矩阵进去而已,可能样本数量不够多,但目前来说我觉得应该没什么问题了,如果有问题欢迎反馈给我。这部分代码如下:
function AdvanceLUDecomposition(A,n)%A is the square matrix,n is the order of A,A must be invertible
D=A;%Store matrix A in D,for later use
L=zeros(n);%Let the L matrix be an zero matrix at first
P=eye(n);%Let the permutation matrix be a identity matrix at first for i=1:n-1 for j=i+1:n
if A(i,i)==0 %A zero pivot appears on(i,i)position,we need to find a nonzero entry below it to be the new pivot,with row exchange for k=n:-1:i+1 %find a nonzero entry below the(i,i)entry in the i column,start from the last row
if A(k,i)~=0 %We have found a nonzero entry,to choose it as the new pivot,we need row exchange k<-->i
L([i k],:)=L([k i],:);%Permute i and k row in L matrix A([i k],:)=A([k i],:);%Permute i and k row in A matrix P([i k],:)=P([k i],:);%Permute i and k row in P matrix break;end end end
L(j,i)=A(j,i)/A(i,i);
A(j,:)=A(j,:)-(A(j,i)/A(i,i))*A(i,:);end end
U=A %A becomes U matrix after Gauss elimination
L=L+eye(n)%All entries on the diagonal of L matrix must be 1 P %output the permutation matrix
B=L*U %verify if the product of L and U equals to P*A
C=P*D %D is the original A matrix,check it out in row 2 %If B equals C,then it means the algorithm works correctly
%some key points and theroms about LU factorization
%Theorem 1 A nonsigular matrix Anxn possesses an LU factorization if and %only if a nonzero pivot does not emerge during row reduction to upper %triangular form with type III operations.%Theorem 2 For each nonsigular matrix A,there exist a permutation matrix P
%such that PA possesses an LU factorization PA=LU
%Remember,the concept of nonsingular matrix is for square matrix,it means %that the determinant is nonzero,and this is equivalent that the matrix has %full-rank
%Based on these conditions,the first thing about the matrix A on which we
%conduct LU factorization is that A must be a square matrix.The second %thing is A must be invertible,which is equal to the statement that A is %non-singular
代码运行结果如图所示:
最后补充一点,为什么要进行LU分解呢?这个问题很关键,很多人也许并不关注这个问题,我们学习很多时候都是只关注实现方法,却并不关心它存在的意义,这种学习是永远无法深入的,只能是停留在表面上,学习就应该多问为什么,多质疑这个东西存在的价值,存在的意义有多大,这样才能促使你去深入了解这个方法的优点和缺点,从而改进、完善它。简单点来说就是LU分解大大降低了算法复杂度,我们求解一个方程组Ax=b的时候,一般来说无非就两种方法,要么是高斯消元法,要么是先求A的逆矩阵,然后再乘以b获得x,而第二种方法比第一种方法要复杂并且限制更多,所以一般是用高斯消元法。高斯消元法解一个方程组算法复杂度是(n^3)/3,并且每获得一个新的b,要接x,都得执行复杂度为(n^3)/3的操作。而LU分解有什么好处呢?在第一次LU分解的时候,也就是说获得L和U的时候,其算法复杂度其实也是n^3,但是,一旦我们获得了L和U矩阵后,每次我们获得一个新的b要求对应的解x,算法复杂度就会大大降低,粗略来说就是n^2,把复杂度降低了一个级别,对于大型系统来说,这是非常了不起的一个改进,运算性能会大大提升。而实际应用中,这样的方法也是非常有意义的,实际系统中,A矩阵相当于系统里的各种滤波和变换操作,x相当于系统的输入,b相当与系统的输出,我们一般是获得了输出b,然后想求得输入x,只要系统不变,那么知道b,又知道了L和U矩阵,我们只需要对每一个新的b执行n^2次乘法/除法和n^2-n次加法/减法就可以获得b对应的输入x了,这是多么了不起的一个性能改进!正因为这样,LU分解在实际应用中用的也是非常广泛。
【图像放大算法总结及MATLAB源程序】推荐阅读:
图像算法工程师岗位的基本职责范围07-19
数字图像处理期末总结10-31
生产放大人员组织10-22
小人物放大爱散文07-08
别放大痛苦的人生哲理07-31
教学反思:图形的放大缩小11-25
放大镜下的晶体教案07-03
用放大镜看孩子的优点11-15
物理教案-幻灯机放大镜12-19
冀教版数学六年级上册《放大与缩小》教案08-15