es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Optimización de la planta de turbinas eólicas en Scipy

Estoy trabajando en un proyecto (usando la biblioteca definida por el usuario pywake) y he escrito el siguiente código:

enter code here
import numpy as np

from py_wake.examples.data.hornsrev1 import V80
from py_wake.examples.data.hornsrev1 import Hornsrev1Site # Trabajamos con el sitio Horns Rev 1, que ya viene configurado con PyWake.
from py_wake.examples.data.hornsrev1 import wt_x, wt_y # Las coordenadas de diseño existentes también están disponibles en PyWake.
from py_wake import BastankhahGaussian
import function

site = Hornsrev1Site()
x, y = site.initial_position.T
windTurbines = V80()
wf_model = BastankhahGaussian(site, windTurbines)
c=np.random.randint(0,2,size=len(x))

c=np.random.randint(0,2,size=len(x)) # Interruptor de WT apagado/encendido

print(c)

x_new,y_new=function.funC(x, y, c)

print(wf_model)

Ejecutar simulación de parque eólico

sim_res = wf_model(x_new, y_new, # Posiciones de la turbina eólica
h=None, # Alturas de la turbina eólica (por defecto definidas en windTurbines)
type=0, # Tipos de turbina eólica
wd=None, # Dirección del viento (por defecto site.default_wd (0,1,…,360 si no se ha sobreescrito))
ws=None, # Velocidad del viento (por defecto site.default_ws (3,4,…,25m/s si no se ha sobreescrito))
)

print(sim_res.aep().sum())

Solo para aclarar un poco el código, ingresamos datos sobre un parque eólico y luego realizamos la simulación y obtenemos la salida de energía de la turbina eólica (print(sim_res.aep().sum())).

Ahora he definido una nueva variable (c) en la que tenemos dos valores 0 y 1. Si c = 1, decimos que esa turbina eólica está encendida, de lo contrario estará apagada y la producción de energía disminuirá.

Ahora, usando los scripts definidos, quiero hacer una optimización en Scipy mediante el uso de la función de penalización: quiero maximizar la producción de energía cambiando los valores de c. Es decir, queremos encender y apagar diferentes turbinas eólicas y ver la producción de energía de salida. Sé que el valor optimizado es cuando todos los parámetros en c son uno, pero hay algunos límites, por lo que necesito usar la función de penalización. ¿Podría ayudarme a optimizar la producción de energía mediante el uso de c y la función de penalización?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para optimizar la producción de energía cambiando los valores de la variable “c” usando la función de penalización en Scipy, podemos seguir los siguientes pasos:

    1. Definir la función objetivo: la función objetivo tendrá la variable de entrada “c” y devolverá la suma negativa de la producción de energía de la simulación de la granja eólica. Necesitamos devolver la suma negativa para maximizar la producción de energía.
    def objetivo(c):
        x_new, y_new = function.funC(x, y, c)
        sim_res = wf_model(x_new, y_new)
        return -sim_res.aep().sum()
    
    1. Definir la función de restricción: la función de restricción comprobará si la suma de valores en la variable “c” es menor o igual a un cierto límite. Si la suma es mayor que el límite, la función devuelve un valor positivo (penalización). Si la suma es menor o igual al límite, devuelve un valor negativo (sin penalización).
    def restriccion(c):
        límite = 5   # definir el límite para la suma de "c"
        if c.sum() <= límite:
            return -1*(c.sum() - límite)   # sin penalización
        else:
            return 1e6   # agregar un valor de penalización grande
    
    1. Establecer los límites de “c”: podemos establecer los límites para cada valor en “c” como (0, 1) para indicar que cada valor puede ser 0 (apagado) o 1 (encendido).
    límites = [(0, 1)] * len(c)
    
    1. Usar la función minimize en Scipy para minimizar la función objetivo con la función de restricción y los límites definidos.
    from scipy.optimize import minimize
    
    solución = minimize(objetivo, c, límites=límites, restricciones={'type': 'ineq', 'fun': restricción})
    

    La variable solución contendrá el valor optimizado para “c” que maximiza la producción de energía mientras satisface la restricción impuesta. Podemos acceder al valor optimizado utilizando “solución.x”. Tenga en cuenta que la función de restricción puede necesitar ajustarse en función del problema y las restricciones específicas.

Comments are closed.