之前已经介绍matlab中quadprog函数的使用,与C++动态库的生成与使用方法。本篇文章主要对比测试matlab与C++动态库的求解结果与精度。
本文生成三类海森矩阵:正定矩阵、半正定矩阵、负定矩阵,对比matlab与C++动态库的求解结果。
一、Matlab二次规划求解结果
H_posi=diag([1,2,3]);
H_semi=diag([0,2,3]);
H_nega=diag([-1,-2,-3]);
g = [-7;-12;-15];
A= [1, 1, 1];
b= [1];
lb= [-10;-10;-10];
ub= [10;10;10];
X1 = quadprog(H_posi,g,A,b,[],[],lb,ub)
X2 = quadprog(H_semi,g,A,b,[],[],lb,ub)
X3 = quadprog(H_nega,g,A,b,[],[],lb,ub)
输出结果为:
二、C++二次规划求解结果
#include <iostream>
#include "stdafx.h"
#include "C_QUADPROG.h"
#include <atlstr.h>
#include "mclmcr.h"
#include "mclcppclass.h"
#include "mclmcrrt.h"
using namespace std;
int main()
{
//初始化DLL动态连接文件
mclmcrInitialize();
// 鉴定Matlab外部调用环境设置是否正确.
if (!mclInitializeApplication(NULL, 0)) {
cout << "error1" << endl;
return -1;
}
C_QUADPROGInitialize();
if (!C_QUADPROGInitialize()) {
cout << "error2" << endl;
return -1;
}
double g[3][1] = { {-7},{-12},{-15} };
double A[1][3] = { 1, 1, 1 };
double b[1] = { 1 };
double lb[3][1] = { {-10},{-10},{-10} };
double ub[3][1] = { {10},{10},{10} };
//创建
mxArray* Input_H = mxCreateDoubleMatrix(3, 3, mxREAL);
mxArray* Input_g = mxCreateDoubleMatrix(3, 1, mxREAL);
mxArray* Input_A = mxCreateDoubleMatrix(1, 3, mxREAL);
mxArray* Input_b = mxCreateDoubleMatrix(1, 1, mxREAL);
mxArray* Input_lb = mxCreateDoubleMatrix(3, 1, mxREAL);
mxArray* Input_ub = mxCreateDoubleMatrix(3, 1, mxREAL);
mxArray* Output_x = mxCreateDoubleMatrix(1, 3, mxREAL);
double * result;
//赋值
memcpy(mxGetPr(Input_g), (void*)g, sizeof(g));
memcpy(mxGetPr(Input_A), (void*)A, sizeof(A));
memcpy(mxGetPr(Input_b), (void*)b, sizeof(b));
memcpy(mxGetPr(Input_lb), (void*)lb, sizeof(lb));
memcpy(mxGetPr(Input_ub), (void*)ub, sizeof(ub));
//运算
double H[3][3] = { {-1,0,0},{0,-2,0},{0,0,-3} };
memcpy(mxGetPr(Input_H), (void*)H, sizeof(H));
mxArray* Input[6] = { Input_H, Input_g, Input_A, Input_b, Input_lb, Input_ub };
mxArray* Output[1];
mlxC_QUADPROG(1, Output, 6, Input);
Output_x = Output[0];
//输出测试
result= mxGetPr(Output_x);
for(int i=0;i<3;i++)
cout<<result[i]<<endl;
//释放空间
mxDestroyArray(Input_H);
mxDestroyArray(Input_g);
mxDestroyArray(Input_A);
mxDestroyArray(Input_b);
mxDestroyArray(Input_lb);
mxDestroyArray(Input_ub);
mxDestroyArray(Output_x);
C_QUADPROGTerminate(); //结束DLL库
mclTerminateApplication();
system("pause");
return 0;
}
三、总结
经对比,海森矩阵分别为正定矩阵、半正定矩阵、负定矩阵时,C++动态库均能有效求解二次规划问题