参考:
https://blog.csdn.net/mikasa3/article/details/89341993
第一种engine:
//Engine *ep;
//// open engine
//if (!(ep = engOpen("\0")))
//{
// fprintf(stderr, "\nCan't start MATLAB engine\n");
// return EXIT_FAILURE;
//}
//mxArray* maArrayData = mxCreateDoubleMatrix(1, 4, mxREAL);
for (int i = 1; i < 3; i++) {
// double step = 0.5 * i;
// std::array<double, 4> para;
// engEvalString(ep, "f1 = (cos(x(4)) + (x(1)) ^ 2 * (1 - cos(x(4))))*config_.needleNormInTool[0] + ((x(1))*(x(2))*(1 - cos(x(4))) - x(3)*sin(x(4)))*config_.needleNormInTool[1] + (x(2)*sin(x(4)) + (x(1))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[2] - needleNorm[0];");
// engEvalString(ep, "f2 = ((x(1))*(x(2))*(1 - cos(x(4))) +x(3)*sin(x(4)))*config_.needleNormInTool[0] + (cos(x(4)) + (x(2)) ^ 2 * (1 - cos(x(4))))*config_.needleNormInTool[1]+ (-x(1)*sin(x(4)) + (x(2))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[2] - needleNorm[1];");
// engEvalString(ep, "f3 =(- x(2)*sin(x(4)) + (x(1))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[0] + (x(1)*sin(x(4))+ (x(2))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[1] - needleNorm[2];");
// engEvalString(ep, "f4 = x(1) ^ 2 + x(2) ^ 2 + x(3) ^ 2 - 1;");
// engEvalString(ep, "f5 = cos(x(4)) + (x(3)) ^ 2 * (1 - cos(x(4)));");
// /*engEvalString(ep,
// "fs=@(x)([(cos(x(4)) + (x(1)) ^ 2 * (1 - cos(x(4))))*config_.needleNormInTool[0] + "
// "((x(1))*(x(2))*(1 - cos(x(4))) - x(3)*sin(x(4)))*config_.needleNormInTool[1] + (x(2)*sin(x(4)) + "
// "(x(1))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[1] - needleNorm[0];((x(1))*(x(2))*(1 - cos(x(4))) +"
// " x(3)*sin(x(4)))*config_.needleNormInTool[0] + (cos(x(4)) + (x(2)) ^ 2 * (1 - cos(x(4))))*config_.needleNormInTool[1] "
// "+ (-x(1)*sin(x(4)) + (x(2))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[1] - needleNorm[1];"
// "(- x(2)*sin(x(4)) + (x(1))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[0] + (x(1)*sin(x(4))"
// "+ (x(2))*(x(3))*(1 - cos(x(4))))*config_.needleNormInTool[1] - needleNorm[2];"
// " x(1) ^ 2 + x(2) ^ 2 + x(3) ^ 2 - 1; cos(x(4)) + (x(3)) ^ 2 * (1 - cos(x(4)))]);");*/
// engEvalString(ep, "fs=@(x)[f1;f2;f3;f4;f5];");
// engEvalString(ep,"x=fsolve(fs,[0; 0; pi*i; pi*i])");
//
// maArrayData = engGetVariable(ep, "x");
// double* result = mxGetPr(maArrayData);
}
//mxDestroyArray(maArrayData);
//engEvalString(ep, "close;");
// close engine
//engClose(ep);
第二种:生成dll
if (!solveNOZInitialize())
{
std::cout << "Could not initialize !" << std::endl;
return 0;
}
solveNOZInitialize();
for (int k = 0; k < 6; ) {
double i = 0.5 + double(k) / 10;
double _x[7] = { config_.needleNormInTool[0], config_.needleNormInTool[1], config_.needleNormInTool[2],needleNorm[0], needleNorm[1], needleNorm[2], i };
double result[4];
mxArray* x = mxCreateDoubleMatrix(1, 7, mxREAL);
memcpy(mxGetPr(x), (void*)_x, sizeof(_x));
mxArray *input[1] = { x };
mxArray *output[1];
mlxSolveNOZ(1, output, 1, input);
mxArray *nozPara;
nozPara = output[0];
memcpy(result, mxGetPr(nozPara), sizeof(result));
std::array<double, 4> resultArray = { result[0],result[1],result[2],result[3] };
if (result[3] > 0) {
continue;
}
if (is_element_in_vector(xyzT, resultArray))
{
xyzT.push_back(resultArray);
}
}
solveNOZTerminate();

本文介绍两种使用MATLAB求解非线性方程组的方法:一种是通过MATLAB引擎接口进行编程求解;另一种是通过创建DLL并调用其函数求解。这两种方法均适用于寻找特定数学问题的数值解。
3654

被折叠的 条评论
为什么被折叠?



