How to use ~= operator as constraint function?
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Pelajar UM
el 7 de Sept. de 2021
Comentada: Pelajar UM
el 7 de Sept. de 2021
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 comentarios
Jan
el 7 de Sept. de 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?
Respuesta aceptada
Matt J
el 7 de Sept. de 2021
Editada: Matt J
el 7 de Sept. de 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 comentarios
Matt J
el 7 de Sept. de 2021
Editada: Matt J
el 7 de Sept. de 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)
Más respuestas (2)
John D'Errico
el 7 de Sept. de 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.
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!