Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.
Consideremos el problema de la electroestática de colocar 10 electrones en un cuerpo conductor. Los electrones se arreglaran de una manera que minimiza su energía potencial total, sujeto a la restricción de acostarse dentro del cuerpo. Todos los electrones están en el límite del cuerpo como mínimo. Los electrones son indistinguibles, por lo que el problema no tiene un mínimo único (permuting los electrones en una solución da otra solución válida). Este ejemplo fue inspirado por Dolan, Moré y Munson [1].
Para obtener un ejemplo basado en un solucionador equivalente mediante el cuadro de herramientas de matemática simbólica™, consulte.Calcula gradientes y hessianosSymbolic Math Toolbox
Este ejemplo implica un organismo conductor definido por las siguientes desigualdades. Para cada electrón con coordenadas
Estas restricciones forman un cuerpo que se ve como una pirámide en una esfera. Para ver el cuerpo, escriba el código siguiente.
[X,Y] = meshgrid(-1:.01:1); Z1 = -abs(X) - abs(Y); Z2 = -1 - sqrt(1 - X.^2 - Y.^2); Z2 = real(Z2); W1 = Z1; W2 = Z2; W1(Z1 < Z2) = nan; % only plot points where Z1 > Z2 W2(Z1 < Z2) = nan; % only plot points where Z1 > Z2 hand = figure; % handle to the figure, since we'll plot more later set(gcf,'Color','w') % white background surf(X,Y,W1,'LineStyle','none'); hold on surf(X,Y,W2,'LineStyle','none'); view(-44,18)
Existe una ligera brecha entre las superficies superior e inferior de la figura. Esta brecha es un artefacto de la rutina de trazado general utilizada para crear la figura. La rutina borra cualquier parche rectangular en una superficie que toque la otra superficie.
El problema tiene diez electrones. Las restricciones dan límites a cada
N = 10; x = optimvar('x',N,'LowerBound',-1,'UpperBound',1); y = optimvar('y',N,'LowerBound',-1,'UpperBound',1); z = optimvar('z',N,'LowerBound',-2,'UpperBound',0); elecprob = optimproblem;
El problema tiene dos tipos de restricciones. La primera, una restricción esférica, es una simple desigualdad polinómica para cada electrón por separado. Defina esta restricción esférica.
elecprob.Constraints.spherec = (x.^2 + y.^2 + (z+1).^2) <= 1;
El comando de restricción anterior crea un vector de diez restricciones. Ver el vector de restricción utilizando.showconstr
showconstr(elecprob.Constraints.spherec)
((x.^2 + y.^2) + (z + 1).^2) <= arg_RHS where: arg2 = 1; arg1 = arg2([1 1 1 1 1 1 1 1 1 1]); arg_RHS = arg1(:);
El segundo tipo de restricción en el problema es lineal. Puede expresar las restricciones lineales de diferentes maneras. Por ejemplo, puede utilizar la función para representar una restricción de valor absoluto.abs
Para expresar las restricciones de esta manera, escriba una función de MATLAB y conviértalo en una expresión utilizando.fcn2optimexpr
Para un enfoque diferente, escriba la restricción de valor absoluto como cuatro desigualdades lineales. Cada comando de restricción devuelve un vector de diez restricciones.
elecprob.Constraints.plane1 = z <= -x-y; elecprob.Constraints.plane2 = z <= -x+y; elecprob.Constraints.plane3 = z <= x-y; elecprob.Constraints.plane4 = z <= x+y;
La función objetiva es la energía potencial del sistema, que es una suma sobre cada par de electrones de la inversa de sus distancias:
Defina la función objetiva como una expresión de optimización.
energy = optimexpr(1); for ii = 1:(N-1) for jj = (ii+1):N tempe = (x(ii) - x(jj))^2 + (y(ii) - y(jj))^2 + (z(ii) - z(jj))^2; energy = energy + tempe^(-1/2); end end elecprob.Objective = energy;
Iniciar la optimización con los electrones distribuidos aleatoriamente en una esfera de radio 1/2 centrado en [0, 0, – 1].
rng default % For reproducibility x0 = randn(N,3); for ii=1:N x0(ii,:) = x0(ii,:)/norm(x0(ii,:))/2; x0(ii,3) = x0(ii,3) - 1; end init.x = x0(:,1); init.y = x0(:,2); init.z = x0(:,3);
Resuelva el problema llamando.solve
[sol,fval,exitflag,output] = solve(elecprob,init)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
x: [10x1 double]
y: [10x1 double]
z: [10x1 double]
fval = 34.1365
exitflag = OptimalSolution
output = struct with fields:
iterations: 95
funcCount: 2990
constrviolation: 0
stepsize: 6.4513e-07
algorithm: 'interior-point'
firstorderopt: 1.2800e-06
cgiterations: 0
message: '...'
solver: 'fmincon'
Trace la solución como puntos en el cuerpo conductor.
figure(hand) plot3(sol.x,sol.y,sol.z,'r.','MarkerSize',25) hold off
Los electrones se distribuyen de manera bastante uniforme en el contorno de la restricción. Los electrones se encuentran principalmente en los bordes y el punto piramidal.
[1] Dolan, Elizabeth D., Jorge J. Moré, y Todd S. Munson. "Benchmarking software de optimización con COPS 3,0." Informe técnico del laboratorio nacional de Argonne ANL/MCS-TM-273, febrero de 2004.