VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx
- 文档编号:21828368
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:17
- 大小:546.48KB
VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx
《VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
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;
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)<
epsilon)
break;
end
A=JacobiH(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk);
b=beta(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk,gamma)*u0-dh;
dz=A\b;
if(l>
0&
&
m>
0)
de=dz
(1);
dd=dz(2:
n+1);
du=dz(n+2:
n+l+1);
dl=dz(n+l+2:
n+l+m+1);
if(l==0)
dl=dz(n+2:
n+m+1);
if(m==0)
i=0;
while(i<
=20)
dh1=dah(ep+rho^i*de,d+rho^i*dd,mu+rho^i*du,lam+rho^i*dl,...
dfk,Bk,Ae,hk,Ai,gk);
dh1=dah(ep+rho^i*de,d+rho^i*dd,mu,lam+rho^i*dl,...
dh1=dah(ep+rho^i*de,d+rho^i*dd,mu+rho^i*du,lam,...
if(norm(dh1)<
=(1-sigma*(1-gamma*ep0)*rho^i)*norm(dh))
mk=i;
i=i+1;
if(i==20)
mk=10;
alpha=rho^mk;
ep=ep+alpha*de;
d=d+alpha*dd;
mu=mu+alpha*du;
lam=lam+alpha*dl;
k=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*ep^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=zeros(m,m);
v1=zeros(m,1);
for(i=1:
m)
fm=sqrt(lam(i)^2+(gk(i)+Ai(i,:
)*d)^2+2*ep^2);
dd1(i,i)=1-lam(i)/fm;
dd2(i,i)=1-(gk(i)+Ai(i,:
)*d)/fm;
v1(i)=-2*ep/fm;
functionA=JacobiH(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk)
A=zeros(n+l+m+1,n+l+m+1);
[dd1,dd2,v1]=ddv(ep,d,lam,Ai,gk);
if(l>
A=[1,zeros(1,n),zeros(1,l),zeros(1,m);
zeros(n,1),Bk,-Ae'
-Ai'
;
zeros(l,l),Ae,zeros(l,l),zeros(l,m);
v1,dd2*Ai,zeros(m,l),dd1];
if(l==0)
A=[1,zeros(1,n),zeros(1,m);
zeros(n,1),Bk,-Ai'
v1,dd2*Ai,dd1];
if(m==0)
A=[1,zeros(1,n),zeros(1,l);
zeros(l,1),Ae,zeros(l,l)];
functiondh=dah(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk)
dh=zeros(n+l+m+1,1);
dh
(1)=ep;
dh(2:
n+1)=Bk*d-Ae'
*mu-Ai'
*lam+dfk;
dh(n+2:
n+l+1)=hk+Ae*d;
for(i=1:
dh(n+l+1+i)=phi(ep,lam(i),gk(i)+Ai(i,:
)*d);
n+1)=Bk*d-Ai'
dh(n+1+i)=phi(ep,lam(i),gk(i)+Ai(i,:
*mu+dfk;
dh=dh(:
);
2.3m文件测试
使用2.2中的程序求解如下二次规划问题:
该问题的极小值点为
。
在Matlab命令窗口中输入如下命令:
dfk=[-6-2-12]’;
Bk=[210;
140;
000];
Ae=[111];
hk=[-2]’;
Ai=[1-20;
100;
010;
001];
gk=[3000]’;
[d,mu,lam]=qpsubp(dfk,Bk,Ae,hk,Ai,gk)
输出结果如下:
d=
-0.0000
2.0000
mu=
-12.0000
lam=
6.0000
10.0000
2.4m文件编译
在Matlab命令行中输入编译命令:
mcc-Bcpplib:
qpsubpqpsubp.m。
第一次运行该命令是,Matlab会在本机上搜索可用的编译器,并列于命令窗口内,如下图所示:
选择输入1回车,等待编译结果,编译时间较长,编译后的输出提示如下图所示:
编译完成后,在\QPMAT文件夹下生成如下文件:
其中对于VS调用dll有用的文件包括qpsubp.h、qpsubp.lib与qpsubp.dll。
3VS2010下测试dll
3.1VS工程设置
启动VS2010,新建项目,项目目录选择\QPTEST,项目名称填QPVS,项目类型为win32下的控制台程序,如下图所示:
将文件\QPMAT文件夹下的qpsubp.h、qpsubp.lib与qpsubp.dll文件拷贝到文件夹\QPVS\QPVS下。
由于操作系统和Matlab为64位,所以在VS下只能编译成64位程序才能正常链接到Matlab中的函数,需要在VS中新建一个64位的编译平台,步骤如下:
(1)进入“配置管理器”
通过项目属性进入。
或者直接从工具栏平台的下拉箭头下进入:
(2)增加x64平台
确定,得到如下结果。
为工程添加Matlab的头文件和库文件路径,步骤如下:
项目属性——》VC++目录,如图:
包含目录增加:
\ProgramFiles\MATLAB\R2012b\extern\include
库目录增加:
\ProgramFiles\MATLAB\R2012b\extern\lib\win64\microsoft
3.2代码编辑
编辑文件SQVS.cpp。
编辑内容如下:
(1)添加头文件与作用域声明
#include<
iostream>
#include"
qpsubp.h"
usingnamespacestd;
iostream为C++输入输出流类的头文件,与usingnamespacestd配合后可调用cin、cout,qpsubp.h是调用二次规划dll的头文件。
(2)链接库文件
#pragmacomment(lib,"
qpsubp.lib"
)
mclmcrrt.lib"
Qpsubp.lib为调用二次规划dll的库文件,mclmcrrt.lib是调用Matlab相关函数的库文件。
(3)初始化库文件
if(!
qpsubpInitializeWithHandlers(NULL,0))
{
std:
:
cout<
<
"
Couldnotinitializetheapplication!
"
<
std:
endl;
return-1;
}
if(!
qpsubpInitialize())
else
{
cout<
Applicationisinitializedsuccessfully!
}
(4)定义输入输出变量并城市化(根据m文件测试所用例子)
mwArraymwdfk(3,1,mxDOUBLE_CLASS);
mwArraymwBk(3,3,mxDOUBLE_CLASS);
mwArraymwAe(1,3,mxDOUBLE_CLASS);
mwArraymwhk(1,1,mxDOUBLE_CLASS);
mwArraymwAi(4,3,mxDOUBLE_CLASS);
mwArraymwgk(4,1,mxDOUBLE_CLASS);
mwArraymwd;
mwArraymwmu;
mwArraymwlam;
mwdfk(1,1)=-6;
mwdfk(2,1)=-2;
mwdfk(3,1)=-12;
mwBk(1,1)=2;
mwBk(1,2)=1;
mwBk(1,3)=0;
mwBk(2,1)=1;
mwBk(2,2)=4;
mwBk(2,3)=0;
mwBk(3,1)=0;
mwBk(3,2)=0;
mwBk(3,3)=0;
mwAe(1,1)=1;
mwAe(1,2)=1;
mwAe(1,3)=1;
mwhk(1,1)=-2;
mwAi(1,1)=1;
mwAi(1,2)=-2;
mwAi(1,3)=0;
mwAi(2,1)=1;
mwAi(2,2)=0;
mwAi(2,3)=0;
mwAi(3,1)=0;
mwAi(3,2)=1;
mwAi(3,3)=0;
mwAi(4,1)=0;
mwAi(4,2)=0;
mwAi(4,3)=1;
mwgk(1,1)=3;
mwgk(2,1)=0;
mwgk(3,1)=0;
mwgk(4,1)=0;
(5)地用二次规划函数
qpsubp(3,mwd,mwmu,mwlam,mwdfk,mwBk,mwAe,mwhk,mwAi,mwgk);
(6)输出计算结果
cout<
d=["
mwd(1,1)<
"
mwd(2,1)<
mwd(3,1)<
]"
mu=["
mwmu(1,1)<
lam=["
mwlam(1,1)<
mwlam(2,1)<
mwlam(3,1)<
mwlam(4,1)<
(7)屏幕停留、终止动态链接库与退出程序
cout<
Pressanykeytoexit!
cin.get();
qpsubpTerminate();
3.3完整代码
stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
if(!
}
return0;
3.4运行结果
4参考文献
[1]马昌凤.最优化方法及其Matlab程序设计.北京:
科学出版社,2010.
[2]刘维.精通Matlab与C/C++混合程序设计.北京:
北京航空航天大学出版社,2007.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS 调用 Matlab 文件 生产 dll 实现 二次 规划 算法