2010-08-27 4 views

Répondre

2

Pas directement, mais une solution à ce problème est d'ajouter un terme à votre équation qui limite votre problème.

Je n'ai pas la boîte à outils d'optimisation, donc je ne peux pas vous donner un exemple spécifique en utilisant fsolve, mais voici comment je le ferais avec fminsearch, qui a le même problème.

myFun = @(args) abs(sin(args(1)) + cos(args(2))) 
fminsearch(myFun, [0, 0]) 
ans = 

    -0.8520 0.7188 

Mais si je veux limiter mon problème à des solutions positives

myFun = @(args) abs(sin(args(1)) + cos(args(2))) + (args(1)<0) + (args(2)<0) 
fminsearch(myFun, [0, 0]) 
ans = 

    0.0000 1.5708 

Il devrait y avoir un moyen de modifier votre équation de la même pour résoudre votre problème.

0

Non. Cependant, au lieu de résoudre pour F(x)=0, vous pouvez réduire abs(F(x)) en utilisant par exemple. FMINBND.

EDIT

Malheureusement, fminbnd ne semble pas soutenir les arguments d'une valeur-tableau (que je suppose, est ce que vous voulez). Pour que cela fonctionne, vous devez passer à FMINCON dans la boîte à outils d'optimisation.

1

Vous devriez utiliser lsqnonlin, qui ressemble beaucoup à fsolve, mais vous permet de spécifier des contraintes liées.

Une autre approche consiste à utiliser une transformation de variables. Par exemple, pour appliquer x> = 0, alors au lieu de résoudre F (x) = 0 w.r.t. x, résolvez F (z.^2) = 0 w.r.t. z puis utilisez x = z.^2 comme solution. Cela a quelques dangers subtils. Par exemple, vous devez éviter d'utiliser z (i) = 0 comme estimation initiale, mais cela fonctionne souvent.

Questions connexes