vs2017调用matlab fsolve函数解方程组

it2023-02-14  89

参考:

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();

 

最新回复(0)