title: Finding all solutions to a non-linear equation system with MuPAD
body: <p>My question is if there is a good way to use MuPAD functions in a Matlab script. The background is that I have a problem where I need to find all solutions to a set of non-linear equations. The previous solution was to use <code>solve</code> in Matlab, which works for some of my simulations (i.e., some of the sets of input <code>T</code>) but not always. So instead I'm using MuPAD in the following way:</p>
  
  <pre><code>function ut1 = testMupadSolver(T)
  % # Input T should be a vector of 15 elements
  
  mupadCommand = ['numeric::polysysroots({' eq1(T) ' = 0,' ...
      eq2(T) '= 0},[u, v])'];
  allSolutions = evalin(symengine, mupadCommand);
  ut1 = allSolutions;
  
  end
  
  function strEq = eq1(T)
  sT = @(x) ['(' num2str(T(x)) ')'];
  
  strEq = [ '-' sT(13) '*u^4 + (4*' sT(15) '-2*' sT(10) '-' sT(11) '*v)*u^3 + (3*' ...
      sT(13) '-3*' sT(6) '+v*(3*' sT(14) '-2*' sT(7) ')-' sT(8) '*v^2)*u^2 + (2*' ...
      sT(10) '-4*' sT(1) '+v*(2*' sT(11) '-3*' sT(2) ')+v^2*(2*' sT(12) ' - 2*' ...
      sT(3) ')-' sT(4) '*v^3)*u + v*(' sT(7) '+' sT(8) '*v+' sT(9) '*v^2)+' sT(6)];
  
  end
  
  function strEq = eq2(T)
  sT = @(x) ['(' num2str(T(x)) ')'];
  strEq = ['(' sT(14) '-' sT(13) '*v)*u^3 + u^2*' '(' sT(11) '+(2*' sT(12) '-2*' sT(10) ...
      ')*v-' sT(11) '*v^2) + u*(' sT(7) '+v*(2*' sT(8) '-3*' sT(6) ')+v^2*(3*' sT(9) ...
      '-2*' sT(7) ') - ' sT(8) '*v^3) + v*(2*' sT(3) '-4*' sT(1) '+v*(3*' sT(4) ...
      '-3*' sT(2) ')+v^2*(4*' sT(5) ' - 2*' sT(3) ')-' sT(4) '*v^3)+' sT(2)];
  
  end
  </code></pre>
  
  <p>I have two queries:</p>
  
  <p>1) In order to use MuPAD I need to rewrite my two equations for the equation-system as strings, as you can see above. Is there a better way to do this, preferably without the string step?</p>
  
  <p>2) And regarding the format output; when</p>
  
  <pre><code>T = [0 0 0 0 0 0 0 0 0 0 1 0 1 0 1];
  </code></pre>
  
  <p>the output is:</p>
  
  <pre><code>testMupadSolver(T)
  
  ans =
  
  matrix([[u], [v]]) in {matrix([[4.4780323328249527319374854327354], [0.21316518769990291263811232040432]]), matrix([[- 0.31088044854742790561428736573347 - 0.67937835289645431373983117422178*i], [1.1103383836576028262792542770062 + 0.39498445715599777249947213893789*i]]), matrix([[- 0.31088044854742790561428736573347 + 0.67937835289645431373983117422178*i], [1.1103383836576028262792542770062 - 0.39498445715599777249947213893789*i]]), matrix([[0.47897094942962218512261248590261], [-1.26776233072168360314707025141]]), matrix([[-0.83524238515971910583152318717102], [-0.66607962429342496204955062300669]])} union solvelib::VectorImageSet(matrix([[0], [z]]), z, C_)
  </code></pre>
  
  <p>Can MuPAD give the solutions as a set of vectors or similarly? In order to use the answer above I need to sort out the solutions from that string-set of solutions. Is there a clever way to do this? My solution so far is to find the signs I know will be present in the solution, such as <code>'([['</code> and pick the numbers following, which is really ugly, and if the solution for some reason looks a little bit different than the cases I've covered it doesn't work.</p>
  
  <h1>EDIT</h1>
  
  <p>When I'm using the solution suggested in the answer below by @horchler, I get the same solution as with my previous implementation. But for some cases (not all) it takes much longer time. Eg. for the T below the solution suggested below takes more than a minute whilst using evalin (my previous implementation) takes one second. </p>
  
  <pre><code>T = [2.4336 1.4309 0.5471 0.0934 9.5838 -0.1013 -0.2573 2.4830 ...
       36.5464 0.4898 -0.5383 61.5723 1.7637 36.0816 11.8262]
  </code></pre>
  
  <p>The new function:</p>
  
  <pre><code>function ut1 = testMupadSolver(T)
  % # Input T should be a vector of 15 elements
  allSolutions = feval(symengine,'numeric::polysysroots', ...
      [eq1(T),eq2(T)],'[u,v]');
  end
  function eq = eq1(T)
  syms u v
  eq = -T(13)*u^4 + (4*T(15) - 2*T(10) - T(11)*v)*u^3 + (3*T(13) - 3*T(6) ...
      + v*(3*T(14) -2*T(7)) - T(8)*v^2)*u^2 + (2*T(10) - 4*T(1) + v*(2*T(11) ...
      - 3*T(2)) + v^2*(2*T(12) - 2*T(3)) - T(4)*v^3)*u + v*(T(7) + T(8)*v ...
      + T(9)*v^2) + T(6);
  end
  
  
  function eq = eq2(T)
  syms u v
  eq = (T(14) - T(13)*v)*u^3 + u^2*(T(11) + (2*T(12) - 2*T(10))*v ...
      - T(11)*v^2) + u*(T(7) + v*(2*T(8) - 3*T(6) ) + v^2*(3*T(9) - 2*T(7)) ...
      - T(8)*v^3) + v*(2*T(3) - 4*T(1) + v*(3*T(4) - 3*T(2)) + v^2*(4*T(5) ...
      - 2*T(3)) - T(4)*v^3) + T(2);
  end
  </code></pre>
  
  <p>Is there a good reason to why it takes so much longer time? </p>