## Solve overspecified equation system

### Nikolas Haimerl (view profile)

on 28 Oct 2019
Latest activity Edited by Stephan

on 29 Oct 2019

### Stephan (view profile)

I am trying to solve a set of equations where I have 3 variables and 4 equations which are not linearly dependent.
Is there a way to solve this numerically in matlab since it is not possible to do it analytically.
Thanks for any help!

Stephan

### Stephan (view profile)

on 28 Oct 2019
Please provide the code or at least the system.
Nikolas Haimerl

### Nikolas Haimerl (view profile)

on 28 Oct 2019
syms u1 u2 up2
eqns= [cos(u1)*l1 + cos(u2)*l2 == xa,...
sin(u1)*l1 + sin(u2)*l2 == ya,...
ap0==(xpa*cos(u2))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1))) +...
(ypa*sin(u2))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1))),...
up2 == - (xpa*cos(u1))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1))) -...
(ypa*sin(u1))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1)))];
S=fsolve(eqns,[u1 u2 up2])
This is what I have tried to do so far. u1 u2 up2 are the variables. xpa,ypa,xa,ya,l1,l2 and ap0 are constants.

R2019b

### Stephan (view profile)

on 28 Oct 2019
Edited by Stephan

### Stephan (view profile)

on 28 Oct 2019

If you have symbolic toolbox, use:
% This part builds a system to solve with fsolve
syms u1 u2 up2 l1 l2 xa ya xpa ypa ap0
x = sym('x', [1 3]);
eqns(1) = cos(u1)*l1 + cos(u2)*l2 - xa;
eqns(2) = sin(u1)*l1 + sin(u2)*l2 - ya;
eqns(3) = ap0 -(xpa*cos(u2))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1))) +...
(ypa*sin(u2))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1)));
eqns(4) = up2 + (xpa*cos(u1))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1))) -...
(ypa*sin(u1))/(4*(cos(u1)*sin(u2) - cos(u2)*sin(u1)));
eqns = subs(eqns,[u1, u2, up2],[x(1), x(2), x(3)]);
fun = matlabFunction(eqns,'vars',{x,'l1','l2','xa','ya','xpa','ypa'...
'ap0'});
fun = str2func(replace(func2str(fun),"in1","x"));
Then fun is a function handle that you can work with:
% solve the system with fantasy values - use your values
l1 = 3;
l2 = 2;
xa = 3;
ya = 6;
xpa = 0.5;
ypa = -1;
ap0 = 5.7;
% solve the system using fsolve
opts = optimoptions('fsolve','Algorithm','Levenberg-Marquardt');
sol = fsolve(@(x)fun(x,l1,l2,xa,ya,xpa,ypa,ap0),rand(1,3),opts)
% look at the results using the solution fsolve calculated
% ideally there should be 4 zeros, if it worked good - ohterwise
% your system may have a problem
test_results = fun(sol,l1,l2,xa,ya,xpa,ypa,ap0)
For my fantasy values there was not a good result - you have to check using your values and also have a look at the correct implementation of the equations in the first part. They should all be formulated as F = 0, to work with them using fsolve.

Nikolas Haimerl

### Nikolas Haimerl (view profile)

on 29 Oct 2019
Thank you for your help. Using the code you provided I get the following error:
Error using optimoptions
Invalid solver specified. Provide a solver name or handle (such as 'fmincon' or @fminunc).
Type DOC OPTIMOPTIONS for a list of solvers.
opts = optimoptions('fsolve','Algorithm','Levenberg-Marquardt');
Line 100 is the following: opts = optimoptions('fsolve','Algorithm','Levenberg-Marquardt');
Stephan

### Stephan (view profile)

on 29 Oct 2019
For me this works without any errors on R20129b - I wonder why.
But you could leave the options away also, fsolve will switch the algorithm automatically, if it detects a non square system. You will just get a warning, that algorithm is changed.
% opts = optimoptions('fsolve','Algorithm','Levenberg-Marquardt');
sol = fsolve(@(x)fun(x,l1,l2,xa,ya,xpa,ypa,ap0),rand(1,3))
Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems;