Diferencia entre revisiones de «Estabilidad de una presa de gravedad»

De MateWiki
Saltar a: navegación, buscar

Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/mat/public_html/w/includes/diff/DairikiDiff.php on line 434
(Programa en MATLAB)
Línea 59: Línea 59:
 
% + momento subpresion S_2
 
% + momento subpresion S_2
 
% + momento subpresion S_1
 
% + momento subpresion S_1
% + momento de la normal N_2
+
% + momento de la normal N_2 (cuando suponemos S_A=S_Amin)
% + momento de la normal N_1 (basado en la cota superior de S_B calculada anteriormente)
+
% + momento de la normal N_1 (cuando suponemos S_A=S_Amin y por tanto S_B=Cota_S_B)
 
g_rest3 = @(n) -P(n)*base(n)*2/3 ...
 
g_rest3 = @(n) -P(n)*base(n)*2/3 ...
 
     + E*h_NMN/3 ...
 
     + E*h_NMN/3 ...
Línea 68: Línea 68:
 
     + 0.5*base(n)*(Cota_S_B(n)-S_Amin*10)*(base(n)/3);
 
     + 0.5*base(n)*(Cota_S_B(n)-S_Amin*10)*(base(n)/3);
 
% la estabilidad requiere g_rest3(n) < 0
 
% la estabilidad requiere g_rest3(n) < 0
 +
% De hecho, si S_A<S_Amin, y asumimos que la distribución de tensiones crece linealmente cuando
 +
% nos movemos hacia el pie de aguas abajo, el momento de las fuerzas normales (para un mismo peso y subpresión)
 +
% sería menor que el del caso S_A=S_Amin y la restricción no se verificaría
  
 
% %% Planteamiento matemático del problema de optimización:
 
% %% Planteamiento matemático del problema de optimización:

Revisión del 13:08 8 mar 2017

En este artículo vamos a describir cómo optimizar con MATLAB el talud de aguas abajo de una presa de gravedad triangular, con talud de aguas arriba vertical, para que tenga un área mínima, manteniendo la estabilidad respecto al plano presa-cimiento y con unas restricciones respecto a la tensión de compresión mínima en el pie de aguas arriba, y a la máxima en el de aguas abajo. El caso programado se corresponde con la hipótesis accidental de drenes ineficaces, despreciando la cohesión en el plano de deslizamiento. Siguiendo las notaciones y dibujos de las transparencias que envió Rafael Morán y la metodología general expuesta en el artículo Guía de optimización en ingeniería el código sería el siguiente:

1 Programa en MATLAB

% Este programa calcula el talud óptimo de aguas abajo de una presa de gravedad 
% manteniendo la estabilidad y las condiciones de tensiones en cimentación 
% en la hipótesis de tensión plana. Supondremos que el perfil es un triángulo del cual 
% sólo podemos elegir el talud de aguas abajo que llamaremos n. El talud de 
% aguas arriba supondremos que es vertical. Buscaremos el perfil con área mínima.

% Parámetros específicos del problema
NMN       = 170;  % Nivel máximo normal de embalse (msnm)
NAP       = 174;  % Cota del vértice resistente (se considera en este caso igual al nivel de avenida de proyecto) (msnm)
Cota_cim  = 108;  % Cota de la base de cimentación, que en este caso es horizontal (msnm)
Ter_abajo = 118;  % Cota del terreno natural aguas abajo (se considera que el nivel del río aguas abajo está a esa cota) (msnm)
mu_h      = 2.4;  % peso específico del hormigón en t/m3
mu_a      = 1.0;  % peso específico del agua en t/m3
Phi       = pi/4; % ángulo de rozamiento en el contacto presa-cimiento (radianes)
F_Phi     = 1.2;  % coeficiente de seguridad al rozamiento exigido por la normativa en la hipótesis de drenes ineficaces
S_Amin    = 0.5;  % compresión mínima en el pie de aguas arriba (kp/cm2)
S_Bmax    = 8.4;  % compresión máxima en el pie de aguas abajo (kp/cm2)     

% Variables de optimización: n = pendiente aguas abajo

% variables y funciones útiles para el cálculo (las acciones se evalúan en toneladas-fuerza por metro lineal de sección)
h_NMN = NMN-Cota_cim;                       % altura de agua a embalse lleno sobre la base de cimentación (m)
H_a   = NAP-Cota_cim;                       % altura de la presa (m)
h_CE  = Ter_abajo-Cota_cim;                 % subpresión en el pie de aguas abajo (mca)
base  = @(n) H_a*n;                         % ancho de la base del triángulo (m)
P     = @(n) 0.5*base(n)*H_a*mu_h;          % peso de la sección de hormigón (t/m)
E     = 0.5*h_NMN^2*mu_a;                   % empuje hidrostático con embalse lleno (no depende de n)
S     = @(n) 0.5*(h_NMN+h_CE)*base(n)*mu_a; % empuje debido a la subpresión en cimentación (t/m)

% Función coste: área del triángulo
f_coste = @(n) 0.5*base(n)*H_a;

% Calculamos ahora las restricciones:
% %% 1. Estabilidad frente al deslizamiento: E-T<0
% donde T es la fuerza necesaria para vencer el rozamiento:
% T = (P-S)*tan(Phi)/F_Phi (despreciando la cohesión y añadiendo el coef. seg. al rozamiento)
g_rest1 = @(n) E-(P(n)-S(n))*tan(Phi)/F_Phi; 
% la estabilidad requiere g_rest1(n) < 0

% %% 2. Compresión en el pie de aguas abajo menor que el máximo admitido por el cimiento
% N=P-S=1/2*(S_A+S_B)*base(n)
% Suponiendo que al menos tenemos la compresión mínima en el pie de aguas arriba, es decir S_A >= S_Amin,
% podemos calcular una cota superior para la tensión aguas abajo
% S_B<=(P-S)/(base(n)/2)-S_Amin =Cota_S_B que en este caso no depende de n pero puede
% depender en general, así que lo definimos como función
Cota_S_B = @(n) (P(n)-S(n))/(0.5*base(n))-S_Amin*10;
g_rest2 = @(n) Cota_S_B(n)-S_Bmax*10;
% la estabilidad requiere g_rest2(n) < 0

% %% 3. El pie de aguas arriba debe mantenerse comprimido, con un valor superior a S_Amin.
% El cálculo del momento resultante permite establecer esta restricción.   
% Momento= Momento del peso 
% + momento empuje agua 
% + momento subpresion S_2
% + momento subpresion S_1
% + momento de la normal N_2 (cuando suponemos S_A=S_Amin)
% + momento de la normal N_1 (cuando suponemos S_A=S_Amin y por tanto S_B=Cota_S_B)
g_rest3 = @(n) -P(n)*base(n)*2/3 ...
    + E*h_NMN/3 ...
    + h_CE*base(n)*(base(n)/2)*mu_a ...
    + 0.5*base(n)*(h_NMN-h_CE)*2/3*base(n)...
    + S_Amin*10*base(n)*(base(n)*0.5) ...
    + 0.5*base(n)*(Cota_S_B(n)-S_Amin*10)*(base(n)/3);
% la estabilidad requiere g_rest3(n) < 0
% De hecho, si S_A<S_Amin, y asumimos que la distribución de tensiones crece linealmente cuando 
% nos movemos hacia el pie de aguas abajo, el momento de las fuerzas normales (para un mismo peso y subpresión) 
% sería menor que el del caso S_A=S_Amin y la restricción no se verificaría 

% %% Planteamiento matemático del problema de optimización:
% Buscamos n en el intervalo [0.1,80] que minimice la función coste:
% f_coste(n)
% con las restricciones:
% g_rest1(n)<0, g_rest2(n)<0, g_rest3(n)<0.

%% Optimización por fuerza bruta
% Intervalo de parámetros:
h  = 0.01;        % distancia entre dos valores del parámetro
L  = 0.1;         % extremo izquierdo
M  = 80;          % extremo derecho 
n  = L:h:M;       % vector con los parámetros
% Inicialización
Optimo = 10000;    % Inicializamos con un valor muy alto 
indice = 0;        % inicializamos el indice
% Probamos todos los valores n(i)
for i=1:length(n)
    % creamos una variable lógica que sea cierta sólo si se verifican todas las restricciones
    restriccion = (g_rest1(n(i))<0)&(g_rest2(n(i))<0)&(g_rest3(n(i))<0);
    if restriccion              % solo en este caso n(i) es un parámetro admisible
        coste = f_coste(n(i));  % Calculo el coste
        if coste<Optimo         % en este caso mejoramos!
            Optimo = coste;     % actualizo el coste con el nuevo parámetro
            indice = i;         % actualizo el índice en el que está el óptimo
        end
    end        
end
% Escribimos el resultado de la optimización por pantalla
if indice == 0
    sprintf('Ningún valor de n cumple las restricciones')
else
    sprintf('El óptimo se alcanza en n = %f',n(indice))
end


2 Observaciones:

A continuación se muestra como hacer algunas de las cuestiones que surgieron en la última reunión.

  • Funciones que dependen de varias variables. Es posible que tanto la función coste como las restricciones dependan de más de una variable. Por ejemplo, supongamos que nuestros parámetros de optimización son las coordenadas (x,y) de un punto y la función coste es la distancia a un punto (a,b). Entonces podemos escribir
a=2; b=1; 
f_coste = @(x,y) sqrt((x-a)^2+(y-b)^2);
  • Funciones que dependen de variables matriciales. Si los parámetros de optimización son coordenadas de varios puntos es mejor escribir esas coordenadas en una matriz que tenga por columnas las coordenadas de cada punto y usar una única variable para crear la función. Por ejemplo,
% Llamamos Cxy la matriz que contiene por columnas las coordenadas de varios puntos y n el número de puntos, que 
% coincidirá con el número de columnas de la matriz Cxy. La siguiente función
% devuelve el centro de masas (suponiendo que cada punto tiene masa unidad) 
c_masas = @(Cxy,n) [sum(Cxy(1,:))/n;sum(Cxy(2,:))/n];
% El argumento : se usa para seleccionar todos los posibles índices de un vector o matriz. 
% Por ejemplo, Cxy(1,:) se refiere a la primera fila de la matriz Cxy, ya que tomo la fila 1 y todas las posibles columnas.

Observamos que en este caso la función no devuelve un número sino un vector columna que contiene las coordenadas del centro de masas de los puntos.

  • Definir funciones según un parámetro. En algún momento puede que el cálculo dependa de algún parámetro y requiera funciones diferentes según el valor del parámetro. En este caso se puede usar una condición para definir una función de una manera u otra. Ejemplo:
% Vamos a definir una función dependiendo de un parámetro aleatorio 
% Elijo un número aleatorio entre 0 y 1
a = rand(1);
% Dependiendo de si a>1/2 o a<=1/2 defino la función coste
if a<=0.5
    f_coste = @(n) 2*n+4;
else
    f_coste = @(n) 2*n-4;
end

De todas formas conviene evitar este tipo situaciones ya que los métodos de optimización para problemas de esta forma son mucho menos eficientes.

  • Restricciones adicionales. Además de las restricciones impuestas por la estabilidad, las geometrías que se traten pueden requerir más restricciones. Por ejemplo, si nuestras variables de optimización son varios puntos [math] (x_i, y_i), i=1,...,n, [/math] y queremos que las coordenadas [math] y_i [/math] de estos puntos estén ordenadas, es decir [math] y_{i+1}\gty_i [/math] para [math] i=1,..,n-1[/math], esto puede imponerse añadiendo una restricción más que podríamos escribir de esta forma
% Llamamos Cxy la matriz que contiene por columnas las coordenadas de varios puntos y n el número de puntos, que 
% coincidirá con el número de columnas de la matriz Cxy. La siguiente restricción hace que 
% las coordenadas y de los puntos estén ordenadas 
g_rest4 = @(Cxy,n) -min(Cxy(2,2:n)-Cxy(2,1:n-1));
% las coordenadas y de los puntos están ordenadas si g_rest4(Cxy,n)<0


  • Funciones complejas. Algunas veces las funciones que necesitamos no pueden escribirse en una sola línea fácilmente. En este caso, podemos escribirlas en un fichero aparte como en el ejemplo que mostramos para calcular el área de un polígono a partir de las coordenadas de los vértices con la fórmula que envío Rafael Morán.
% Función para calcular el área de un polígono
function S=ar_pol(C)
% Se introduce una matriz C con las coordenadas de los vértices del polígono 
% por columnas y ordenados en sentido antihorario. 
% Se devuelve el área S
% Aplicamos la fórmula que nos envió Rafael Morán
% S = 1/2 abs(sum yi (x_(i-1)-x_(i+1)))
% teniendo en cuenta la siguiente regla: (x_0,y_0)=(x_n,y_n) y 
% (x_(n+1),y_(n+1))=(x_1,y_1)
% donde n es el número de vértices

% Primero calculamos el número de vértices nv
nv=length(C);
% Ahora definimos los vectores con las coordenadas x e y de los vértices
x=C(1,:);    % la primera fila contiene las coordenadas x de los vértices
y=C(2,:);    % la segunda fila contiene las coordenadas y de los vértices
% Calculamos S pero separamos el primer y último término de la suma
% para poder tener en cuenta la regla
S = y(1)*(x(nv)-x(2));           % primer término
for i=2:nv-1
   S = S+y(i)*(x(i-1)-x(i+1));   % términos del 2 al nv-1
end
S = S+y(nv)*(x(nv-1)-x(1));      % último término
S=0.5*abs(S);


Es importante grabar esta función en un fichero con el mismo nombre elegido para la función. En este caso: ar_pol.m. Una vez creada la función y grabada en el mismo directorio donde está nuestro programa principal, la podemos usar en nuestro programa. Por ejemplo

% Este es el programa principal
% Definimos una matriz con las coordenadas del polígono
c=[-1 0 -1 1 1;-1 0 1 1 -1];
% Calculamos su área
S=ar_pol(c)