Solving constrained non linear system using fmincon doesn't work

3 views (last 30 days)
Hi all,
I have a non linear differential equation:
dm(1) = f1(m(1),m(2),m(3))
dm(2) = f2(m(1),m(2),m(3))
dm(3) = f3(m(1),m(2),m(3))
whose solutions must lie on the unit sphere. I'm trying to compute the fixed points of the system so I have to solve the system:
f1(m(1),m(2),m(3)) = 0
f2(m(1),m(2),m(3)) = 0
f3(m(1),m(2),m(3)) = 0
I first tried to use fsolve but this gave irrelevant solutions, not even lying on the unit sphere. I then tried to use fmincon by squaring my dm-vector so that it becomes positive. Here is what my code looks like:
Differential equation:
function dm = llgfix(t,m,param)
dm = zeros(3,1);
dm(1) = f1(m(1),m(2),m(3));
dm(2) = f2(m(1),m(2),m(3));
dm(3) = f3(m(1),m(2),m(3));
dm = dm.^2;
end
Constraints:
function [c, ceq] = unitsphere(x)
c = [];
ceq = x(1)^2 + x(2)^2 + x(3)^2 - 1;
Minimisation:
m0 = rand(1,3);
options = optimset('Display','iter','Algorithm','active-set');
fix = fmincon(@llgfix,m0./norm(m0),[],[],[],[],[],[],@unitsphere,options)
However, when running the code, I always get the same error:
Error using fmincon (line 674)
User supplied objective function must return a scalar value.
and I can't figure out why, does anybody have an idea?
Thanks in advance!

Accepted Answer

Alan Weiss
Alan Weiss on 13 Feb 2013
This question was answered (satisfactorily, I believe) on comp.soft-sys.matlab.
Alan Weiss
MATLAB mathematical toolbox documentation

More Answers (2)

Sven
Sven on 13 Feb 2013
Hi Pi Pi,
Two things. Firstly, your specific error:
User supplied objective function must return a scalar value.
comes because the "objective" function you are providing to fmincon (ie, the function llgfix) is returning a 1-by-3 matrix in the output variable dm. Instead, try:
function dm_sum = llgfix(t,m,param)
dm = zeros(3,1);
dm(1) = f1(m(1),m(2),m(3));
dm(2) = f2(m(1),m(2),m(3));
dm(3) = f3(m(1),m(2),m(3));
dm_sum = sum(dm.^2);
end
Next, when you call fmincon, you use the syntax:
fix = fmincon(@llgfix,...)
fmincon will, by default (ie, with just the @ symbol), only provide one input variable - that's the variable you are trying to modify.
However, your actual llgfix function takes three input variables. I think that this isn't what you intend. Note that you can use syntax like:
fix = fmincon(@(m)llgfix(otherVar,m,otherVar2),...)
To get fmincon to basically call a function with a different set of inputs. Or, you can modify llgfix to only take one input.
Did this get you on the right track?
Thanks, Sven.

Pl Pl
Pl Pl on 13 Feb 2013
Thanks to Sven and my apologies to Alan for not having indicated before that the problem was solved, I completely forgot this discussion.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!