Effacer les filtres
Effacer les filtres

Solving constrained non linear system using fmincon doesn't work

1 vue (au cours des 30 derniers jours)
Pl Pl
Pl Pl le 12 Fév 2013
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!

Réponse acceptée

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

Plus de réponses (2)

Sven
Sven le 13 Fév 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 le 13 Fév 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!

Translated by