【MPC】⑤Win平台下二次规划求解器quadprog-MATLAB与C++求解结果对比

之前已经介绍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++动态库均能有效求解二次规划问题

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后厂村路蔡徐坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值