VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx

上传人:b****7 文档编号:21828368 上传时间:2023-02-01 格式:DOCX 页数:17 大小:546.48KB
下载 相关 举报
VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx_第1页
第1页 / 共17页
VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx_第2页
第2页 / 共17页
VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx_第3页
第3页 / 共17页
VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx_第4页
第4页 / 共17页
VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx

《VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

VS调用Matlab的m文件所生产的dll实现二次规划算法Word文件下载.docx

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.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1