How to use ~= operator as constraint function?
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have a function called "error" that I want to minimize with initial X0 = 1.34. The definition is:
function error = objectiveFcn(X,F)
D = 1.33;
M = 0.2;
error = (abs((((F)*(X/((F)*(1/M-1)+X))+(1-(X/((F)*(1/M-1)+X)))*X)-D)/D))*100;
end
The most straightforward answer is X=F=1.33 for which Error = 0 but I want X~=F.
I don't seem to be able to correctly include this under constraintFcn... Any suggestions?
UPDATE:
I have actually solved this in Excel, but I want to automate the process. This is how it looks like:
The exact solution is X=F=1.33 but this is not an accpetable result for me because X and F in reality can never be equal. The next best answer is X=1.265 and F=1.675 with an error of 0.01%.
F can be further defined as
F = (D-(1-V)*X)/V;
V=0.158;
Update 2: I realized this can be reduced to a single-variable problem. Here: but how do I extract the X for which X~=F. Is there a function for this?
D = 1.33;
M = 0.2;
V = 0.158;
err = @(X) (abs((((((D-(1-V)*X)/V))*(X/((((D-(1-V)*X)/V))*(1/M-1)+X))+(1-(X/((((D-(1-V)*X)/V))*(1/M-1)+X)))*X)-D)/D))*100;
fplot(err,[1.22,1.36])
3 commentaires
Jan
le 7 Sep 2021
Do not call a function "error", because error() is a very important built-in function. Shadowing it will cause serious troubles. By the way, your function is not called "error", but "objectiveFunction".
A nicer version of the formula:
err = 100 * abs((X / (1 / M - 1 + X / F) + (1 - X / (F / M - F + X)) * X - D) / D)
How do you search for a solution? With a local or global optimizer?
Réponse acceptée
Matt J
le 7 Sep 2021
Modifié(e) : Matt J
le 7 Sep 2021
Here: but how do I extract the X for which X~=F. Is there a function for this?
Yes, but clearly you are not doing continuous optimization, so you should use min() rather than fmincon().
D = 1.33;
M = 0.2;
V = 0.158;
X=setdiff( 1.24:0.005:1.34 ,D);
err = (abs((((((D-(1-V).*X)./V)).*(X./((((D-(1-V).*X)./V)).*(1./M-1)+X))+(1-(X./((((D-(1-V).*X)./V)).*(1./M-1)+X))).*X)-D)./D)).*100;
[~,imin]=min(err);
X(imin)
5 commentaires
Matt J
le 7 Sep 2021
Modifié(e) : Matt J
le 7 Sep 2021
Never mind. I fixed my original answer. It now gives X=1.265
D = 1.33;
M = 0.2;
V = 0.158;
X=setdiff( 1.24:0.005:1.34 ,D);
err = (abs((((((D-(1-V).*X)./V)).*(X./((((D-(1-V).*X)./V)).*(1./M-1)+X))+(1-(X./((((D-(1-V).*X)./V)).*(1./M-1)+X))).*X)-D)./D)).*100;
[~,imin]=min(err);
X(imin)
Plus de réponses (2)
John D'Errico
le 7 Sep 2021
For which solver? This is a 1-variable problem. If you want help, it does help if you explain more than you have done.
Note that ~= is not something you can specify for ANY solver, since that allows your solution to be infinitely close to equality, yet not exactly equal. And that makes your problem ill-posed.
Anyway, is this problem even meaningful?
D = 1.33;
M = 0.2;
F = 1.33;
err = @(X) (abs((((F)*(X/((F).*(1/M-1)+X))+(1-(X./((F)*(1/M-1)+X))).*X)-D)/D))*100;
fplot(err,[-3,50])
It looks like I missed a dot in there to vectorize it. Regardless, there seems to be only a single minimizer, at X == F. We can probably prove that to be the case with a little effort, merely by showing the behavior of this simple function as X grows large in both directions, that there are no points where the function has a zero derivative.
syms x
err(x)
We could play with that and now look at the derivatives.
Or, is F also an unknown? If it is, then your objective is not formulated in a form that any solver in MATLAB will directly take. You seem to be treating F as a constant.
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!