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.

cómo generar una función aleatoria convexa de piezas lineales

Quiero generar un ejemplo de juguete para ilustrar una función lineal a trozos convexa en python, pero no pude encontrar la mejor manera de hacerlo. Lo que quiero hacer es indicar el número de líneas y generar la función aleatoriamente.

Una función lineal a trozos convexa se define como:

![1]

Por ejemplo, si quiero tener cuatro líneas lineales, entonces quiero generar algo como se muestra a continuación.

enter image description here

Dado que hay cuatro líneas, necesito generar cuatro números enteros aleatorios crecientes para determinar los intervalos en el eje x.

import random 
import numpy as np
random.seed(1)

x_points = np.array(random.sample(range(1, 20), 4))
x_points.sort()
x_points = np.append(0, x_points)

x_points
[0 3 4 5 9]

Ahora puedo usar los dos primeros puntos y crear una función lineal aleatoria, pero no sé cómo debo continuar desde allí para preservar la convexidad. Tenga en cuenta que una función se llama convexa si el segmento de línea entre dos puntos en el gráfico de la función no se encuentra por debajo del gráfico entre los dos puntos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de generar un ejemplo ficticio de una función convexa linealmente por partes en Python es usando las bibliotecas random y numpy. Aquí hay un ejemplo de código que genera una función convexa linealmente por partes aleatoria con un número especificado de líneas:

    import random
    import numpy as np
    import matplotlib.pyplot as plt
    
    def generar_funcion_convexa(num_lineas):
        random.seed(1)
    
        # generar puntos x para los segmentos lineales
        x_puntos = np.array(random.sample(range(1, 20), num_lineas))
        x_puntos.sort()
        x_puntos = np.append(0, x_puntos)
    
        # generar coordenadas y para los segmentos lineales
        valores_y = [random.uniform(0, 100) for i in range(num_lineas)]
        valores_y[0] = 0.0
        valores_y[num_lineas-1] = 100.0
    
        # generar la función linealmente por partes
        x = np.linspace(0, 20, 1000)
        y = np.piecewise(x, [(x >= x_puntos[i]) & (x < x_puntos[i+1]) for i in range(num_lineas)], valores_y)
    
        # trazar la función
        plt.plot(x, y)
        for i in range(num_lineas):
            plt.plot(x_puntos[i:i+2], valores_y[i:i+2], ':', color='k')
        plt.xlabel('x')
        plt.ylabel('f(x)')
        plt.title('Función Convexa Linealmente por Partes con {} Líneas'.format(num_lineas))
        plt.show()
    
    # generar un ejemplo ficticio de una función convexa linealmente por partes con cuatro líneas
    generar_funcion_convexa(4)
    

    En este ejemplo, usamos la función random.sample para generar aleatoriamente un conjunto de valores enteros distintos entre 1 y 20 (inclusive) para usar como coordenadas x de los segmentos lineales. También usamos la función random.uniform para generar un conjunto de valores aleatorios entre 0 y 100 (inclusive) para usar como coordenadas y de los segmentos lineales. Aseguramos que el primer y último valor y sean 0 y 100, respectivamente, para garantizar que la función sea convexa.

    Luego, usamos la función piecewise de numpy para generar la función linealmente por partes para un rango de valores x de 0 a 20. Finalmente, trazamos la función usando matplotlib. El gráfico resultante debería mostrar una función convexa linealmente por partes con cuatro líneas, similar al ejemplo mostrado en el enunciado de la pregunta.

Comments are closed.