资源描述:
《vs2010调用matlab的m文件所生产的dll实现二次规划算法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、VS2010调用Matlab的m文件所生产的dll实现二次规划算法引言二次规划算法可在SQP算法中成为通用的二次规划子问题程序。二次规划算法设计到众多的矩阵运算,用C++代码编程需要较大工作量,而矩阵运算在Matlab下则相当方便。但SQP多用于非线性系统的优化,如航空发动机的优化,航空发动机模型通常在C代码下更为方便。所以本文采用的策略是在Matlab下编写实现二次规划算法的m文件,使用Matlab编译器将m文件编译成dll动态链接库,然后在VS下调用dll来实现二次规划算法。1系统环境说明操作系统:Wi
2、ndow8X64.Matlab版本:Matlab2012b(Matlab8.0).VS版本:VS2010.添加系统环境变量:Path变量中增加:C:ProgramFilesMATLABR2012bbinwin64;重启电脑。2二次规划算法的Matlab实现2.1编程准备工作首先为本文建立一个单独的文件夹QPTEST,再在该文件夹下建立子文件夹QPMAT。然后启动Matlab并将工作目录指定到QPMAT下。2.2m文件编程新建m文件并保存文件名为qpsubp.m,编辑内容如下,代码分析参考文献
3、[1]程序12.1:function[d,mu,lam]=qpsubp(dfk,Bk,Ae,hk,Ai,gk)n=length(dfk);l=length(hk);m=length(gk);gamma=0.05;epsilon=1.0e-6;rho=0.5;sigma=0.2;ep0=0.05;mu0=0.05*zeros(l,1);lam0=0.05*zeros(m,1);d0=ones(n,1);u0=[ep0;zeros(n+l+m,1)];z0=[ep0;d0;mu0;lam0];k=0;z=z0;
4、ep=ep0;d=d0;mu=mu0;lam=lam0;while(k<=150)dh=dah(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk);if(norm(dh)0&&m>0)de=dz(1);dd=dz(2:n+1);du=dz(n+2:n+l
5、+1);dl=dz(n+l+2:n+l+m+1);endif(l==0)de=dz(1);dd=dz(2:n+1);dl=dz(n+2:n+m+1);endif(m==0)de=dz(1);dd=dz(2:n+1);du=dz(n+2:n+l+1);endi=0;while(i<=20)if(l>0&&m>0)dh1=dah(ep+rho^i*de,d+rho^i*dd,mu+rho^i*du,lam+rho^i*dl,...dfk,Bk,Ae,hk,Ai,gk);endif(l==0)dh1=dah(ep
6、+rho^i*de,d+rho^i*dd,mu,lam+rho^i*dl,...dfk,Bk,Ae,hk,Ai,gk);endif(m==0)dh1=dah(ep+rho^i*de,d+rho^i*dd,mu+rho^i*du,lam,...dfk,Bk,Ae,hk,Ai,gk);endif(norm(dh1)<=(1-sigma*(1-gamma*ep0)*rho^i)*norm(dh))mk=i;break;endi=i+1;if(i==20)mk=10;endendalpha=rho^mk;if(l>
7、0&&m>0)ep=ep+alpha*de;d=d+alpha*dd;mu=mu+alpha*du;lam=lam+alpha*dl;endif(l==0)ep=ep+alpha*de;d=d+alpha*dd;lam=lam+alpha*dl;endif(m==0)ep=ep+alpha*de;d=d+alpha*dd;mu=mu+alpha*du;endk=k+1;end%val=0.5*d'*Bk*d+dfk'*d;functionp=phi(ep,a,b)p=a+b-sqrt(a^2+b^2+2*e
8、p^2);functionbet=beta(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk,gamma)dh=dah(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk);bet=gamma*norm(dh)*min(1,norm(dh));function[dd1,dd2,v1]=ddv(ep,d,lam,Ai,gk)m=length(gk);dd1=zeros(m,m);dd2=zer