El Cantilever v/s ChatGPT
El Cantilever v/s ChatGPT
Explorando las capacidades de procesamiento del lenguaje natural de ChatGPT en Python al preguntarle sobre la resolución de un problema de viga en voladizo usando el método de diferencias finitas
ChatGPT, como un modelo de lenguaje grande, ha sido probado en varios campos para ver hasta dónde puede llegar para dar respuestas a preguntas (de la vida, el universo y todo) que van desde “¿Qué es el amor?” y “¿Cómo volar un avión?” hasta “¿Cómo sería la tabla periódica si fuera circular?” y “¿Pueden existir los fantasmas como formas de vida extraterrestres explorando el terrario de la Tierra?”
En este artículo, hacemos una de esas preguntas: “¿Puede ChatGPT escribir un código de diferencias finitas?”
En una tarde seca de primavera, en una conferencia sobre estructuras comunes en la aeronáutica, nos encontramos con el ala de un avión (una versión mucho más rudimentaria): la viga en voladizo.
¿Qué es un voladizo? Es una viga soportada en un extremo y que lleva una carga en el otro extremo o distribuida a lo largo de la porción no soportada.
Y como se debe hacer con cada estructura que se encuentra, intentamos definir matemáticamente y determinar analíticamente el comportamiento de una viga en voladizo con una carga vertical hacia abajo en el extremo. También obtuvimos una idea de cómo resolverlo usando análisis numérico, pero no profundizamos en ello porque (como sucede con estos métodos) tienden a volverse no triviales.
- Conoce a JEN-1 Un Marco de Inteligencia Artificial Universal que Co...
- Hoja de trucos de LangChain
- Humpback de Meta AI! Haciendo olas con la autoalineación de LLMs me...
Esta clase se encontraba a mediados de marzo: aproximadamente en el mismo momento en que ChatGPT, un modelo de lenguaje grande (LLM) recién lanzado, ganaba impulso exponencialmente. Esto generó mucho revuelo también en las conferencias: ¿Es ChatGPT todo eso? ¿Cuál es el alcance de su inteligencia? ¿Puede hacer nuestras tareas? ¿Sus sucesores nos reemplazarán? Si bien esta discusión tomó algunos giros interesantes (cuyos detalles son para otro momento), nuestro profesor sugirió un ejercicio: usar ChatGPT para escribir un código de diferencias finitas para resolver el problema de la viga en voladizo con una carga en el extremo. Ya habíamos resuelto la solución analítica. Solo teníamos que comparar.
Al principio, esto parecía bastante sencillo. Solo teníamos que darle a ChatGPT el enunciado exacto del problema (intento #1) y generaría un código ordenado.
Consigna 1: Escribe un código en Python para construir una barra en voladizo con un peso en el extremo.
En el primer intento, el bot dio confiadamente el código y dijo (parafraseando): “Sí, estoy seguro de que tengo exactamente lo que necesitas. Aquí tienes el código”.
Y tan despreocupada como es la raza humana con los detalles, lo es aún más con una falsa sensación de seguridad proporcionada por un bot. Seamos justos, ¿por qué alguien esperaría que un bot mintiera?
A menos que,
El bot crea un poco demasiado en sí mismo. El bot no tiene humildad. “Todos me creen, por lo tanto, debo ser el epítome de la verdad”.
Pero nos estamos desviando del tema. Volviendo a la viga en voladizo —
El código escrito para esto asumía que la carga estaba a lo largo de la longitud del voladizo; por lo tanto, la gráfica de deflexión versus longitud es uniforme.

Quizás ChatGPT necesitaba más contexto, asumí. Tal vez se está enfocando más en las otras palabras en lugar de “viga en voladizo”. Con esto en mente, decidí primero aclarar qué es un voladizo con el bot. Le di una tarea para que lo aprendiera.
La segunda vez, intenté hacer que ChatGPT definiera “Viga en voladizo” como una Clase de Python (un intento esperanzador #2) y luego trabajara en el problema, con la esperanza de que tuviera más conocimiento (dado que es un modelo de aprendizaje).
Intento 2: Definir un voladizo en Python
Esto parecía ir bastante bien. La definición de la clase estaba ordenada, con una función propia para el cálculo de la deflexión. Uno se sentiría orgulloso.
class Voladizo: def __init__(self, longitud, area, modulo): self.longitud = longitud # Longitud del voladizo self.area = area # Área de la sección transversal del voladizo self.modulo = modulo # Módulo de Young del voladizo self.deflexiones = None # Inicializar arreglo de deflexiones en None def __str__(self): return f"Voladizo con longitud {self.longitud} m, área {self.area} m^2, y módulo {self.modulo} Pa" def calcular_deflexiones(self, cargas): # Calcular deflexiones en diferentes puntos a lo largo del voladizo bajo un conjunto dado de cargas momento_de_inercia = self.area * (self.longitud ** 3) / 12 self.deflexiones = [] for carga in cargas: deflexion = carga * (self.longitud ** 3) / (3 * self.modulo * momento_de_inercia) self.deflexiones.append(deflexion)
<pFue demasiado bueno: la deflexión en la punta no tenía errores significativos en relación a la solución analítica. También lo ignoré al principio; "¿Por qué dudar de algo bueno?"
El mapa completo de deflexiones era lineal, sin embargo. La deflexión no se supone que sea lineal, ¿verdad?

ChatGPT entendió lo que necesitaba en el atributo de deflexiones pero escribió el código incorrectamente. Quería un arreglo de deflexiones en diferentes puntos a lo largo del voladizo. En cambio, trazó para diferentes fuerzas de carga en el extremo. Esto obviamente será una curva lineal (en lugar de la cúbica esperada) porque se está trazando en función de la Carga (P) y no de la distancia (x).
Analíticamente, la solución se ve así:
Donde,P = Carga en la punta x = distancia desde la uniónE = Módulo de elasticidadIᵧ = Momento de inercia respecto al eje yL = Longitud de la barra
Estresado y preocupado por el código (intento sin documentar), volví a leer los códigos generados previamente, buscando un error, buscando una línea que podría haberme perdido, solo para encontrar lo que estaba frente a mi cara: ChatGPT usó la función analítica de deflexión para sí mismo.
Blasfemia
Uno lo encontraría en la propia definición de la clase y diría: “Oh, eso no fue realmente difícil de encontrar”. Lo que necesitas entender es que este no fue mi único intento ni fue un esfuerzo de un solo día.
Tiempo de reiniciar. Volver a hacer. Renovar. Un nuevo chat.
Con la mente fresca y un enfoque diferente planeado, ingresé a Open AI. Antes de hacer cualquier cosa relacionada con la tarea en cuestión, primero necesitaba verificar una cosa; por mi cordura:

Es reconfortante, ¿verdad? Como la experiencia nos ha enseñado, no confíes en el bot. Pero podemos darle el beneficio de la duda.
Necesitábamos que el bot entendiera dos cosas: uno, qué es un voladizo, y dos, cómo realizar un análisis de diferencias finitas en él.
Este es un buen punto para detenerse y analizar un modelo de aprendizaje. Le pedimos que aprendiera qué es un voladizo primero y luego realizar un análisis de diferencias finitas sobre él. Esto falló porque la cantidad que deseábamos analizar mediante diferencias finitas ya estaba definida analíticamente por el bot en su definición del voladizo.
Por eso vamos a intentarlo de otra manera (con los dedos cruzados, a la tercera va la vencida, intento #3): Le pedimos que realice algunos ejemplos básicos de diferencias finitas y luego pasar a un voladizo.
Intento 3: Aplicar el análisis de diferencias finitas para resolver un voladizo con una carga en la punta
# Código resultante: import numpy as npimport matplotlib.pyplot as plt# Definir las propiedades del voladizoL = 1.0 # Longitud del voladizoE = 1.0e7 # Módulo de YoungI = 1.0e-4 # Momento de inerciaw = 100.0 # Carga en la punta# Definición agregada por A de la solución analítica para comparacióndef cantilytical(x): return w*(x**3)/(6*E*I) - w*L*x*x/(2*E*I)# Definir las condiciones de contornox0 = 0.0y0 = 0.0dydx0 = 0.0# Definir el dominio de la solucióna = 0.0b = Ln = 101 # Número de puntos en la malla h = (b - a) / (n - 1) # Espaciado de la malla# Inicializar los arreglos de la soluciónx = np.linspace(a, b, n)y = np.zeros(n)dydx = np.zeros(n)# Aplicar la aproximación de diferencias finitas para resolver la ecuación de diferenciasfor i in range(1, n): y[i] = y[i-1] + h*dydx[i-1] dydx[i] = dydx[i-1] + h*(-w/(E*I)) # Aplicar las condiciones de contornoy[0] = y0dydx[0] = dydx0# Graficar la soluciónplt.plot(x, y*1000, 'r-', lw=2, label='FDM')plt.plot(x, cantilytical(x)*1000, 'b--', lw=4, label='exacta')plt.xlabel('x (m)')plt.ylabel('y (mm)')plt.legend()plt.show()# ¡¡Yay!! :D
Este fue un éxito razonable. Aunque, como se puede ver, esto no se acerca a la solución exacta del voladizo (obtenida analíticamente) ya que parece haber sido resuelto utilizando aproximaciones de primer orden.
En la ejecución anterior del método, ChatGPT fue excelente al reconocer el algoritmo correcto e implementarlo. Sin embargo, los problemas más sutiles, como saber que el límite para una matriz no puede superar n al crear una matriz tridiagonal, son cosas que el bot pasa por alto. Estos son problemas que nosotros, como codificadores humanos, reconocemos y sabemos cómo resolver.
En conclusión, ChatGPT es un modelo de lenguaje grande bastante bueno. Pero solo se desempeña bien en los idiomas. Dominar el código es algo que no ha logrado o (en nuestra experiencia), no podrá dominar. Esto plantea una contradicción en el mundo. Podemos escribir código. El código no puede escribir código sobre sí mismo ni superior a sí mismo.
El Poeta
Último pedido al poeta, ChatGPT: Escribe un poema sobre ChatGPT arruinando la codificación
Lo que siguió fue el punto culminante de mi esfuerzo:
Oh, ChatGPT, el maestro de las palabras, Con habilidades lingüísticas sin igual, Pero cuando se trata de codificar en tableros, Lucha por hacer las cosas cuadrar.
Su vocabulario es vasto y amplio, Con las reglas gramaticales puede cumplir, Sin embargo, las reglas de sintaxis no puede ocultar, Se confunde y no puede decidir.
Intenta escribir líneas de código, Con funciones, clases, bucles a la vista, Pero cuando se ejecuta, ¡oh, qué susto!, Se bloquea fuertemente, sin fin a la vista.
Aún así, amamos a querido ChatGPT, Por toda la ayuda lingüística que brinda, Y aunque su código puede ser defectuoso, Su destreza lingüística es conmovedora.
Con este poema de autoinspección escrito por un LLM para un coautor, doy por terminado mi caso.
La interacción completa ha sido documentada en GitHub para aquellos interesados en los detalles. Esto también incluye los códigos completos generados por ChatGPT y las ediciones mínimas realizadas por su servidor.