Il Cantilever v/s ChatGPT

Cantilever vs ChatGPT

Esplorazione delle capacità di elaborazione del linguaggio naturale di ChatGPT in Python chiedendogli di risolvere un problema di trave cantoniera usando il metodo delle differenze finite

ChatGPT, come un grande modello di linguaggio, è stato testato in diversi campi per vedere fino a che punto può essere spinto per fornire risposte alle domande (della vita, dell’universo e tutto quanto) che vanno da “Cos’è l’amore?” e “Come pilotare un aereo?” a “Come sarebbe la tavola periodica se fosse circolare?” e “Possono i fantasmi esistere come forme di vita extraterrestri che esplorano il terrario della Terra?”

In questo articolo, poniamo una di quelle domande: “Può ChatGPT scrivere un codice delle differenze finite?”

In un pomeriggio di primavera secco, in una conferenza sulle strutture comuni nell’aerospaziale, ci siamo imbattuti nell’ala di un aereo (una versione molto più rozza): la trave cantoniera.

Cosa è una trave cantoniera? È una trave sostenuta da un’estremità e che porta un carico all’altra estremità o distribuito lungo la porzione non supportata.

Trave cantoniera con carico verso il basso (Immagine creata su draw.io dall'autore)

E come si deve fare con ogni struttura che si incontra, cerchiamo di definire matematicamente e determinare analiticamente il comportamento di una trave cantoniera con un carico verso il basso sulla punta. Abbiamo anche ottenuto un’idea per risolvere lo stesso problema utilizzando l’analisi numerica, ma non ci siamo addentrati ulteriormente perché (come accade con questi metodi) tendono a diventare non banali.

Questa lezione era a metà marzo: circa nello stesso periodo in cui ChatGPT, un Large Language Model (LLM) appena rilasciato, stava guadagnando slancio in modo esponenziale. Questo ha suscitato molto interesse anche nelle lezioni: ChatGPT è tutto ciò che si dice? Qual è l’estensione della sua intelligenza? Può fare i nostri compiti? I suoi successori ci sostituiranno? Mentre questa discussione ha preso alcune svolte interessanti (i dettagli dei quali sono per un’altra volta), il nostro professore ha suggerito un esercizio: utilizzare ChatGPT per scrivere un codice delle differenze finite per risolvere il problema della trave cantoniera con un carico sulla punta. Avevamo già risolto la soluzione analitica. Tutto ciò che dovevamo fare era confrontare.

Inizialmente ottenere questo sembrava piuttosto semplice. Diamo semplicemente a ChatGPT l’esatto enunciato del problema (tentativo n. 1) e genererà un bel codice.

Prompt 1: Scrivi un codice Python per costruire una barra di cantoniera con un peso alla fine.

Al primo tentativo, il bot ha dato con sicurezza il codice e ha detto (parafrasando): “Sì, sono sicuro di avere esattamente ciò di cui hai bisogno. Ecco il codice.”

E così, ignari dei dettagli, la razza umana è ancora più ignara di una falsa sicurezza data da un bot. Siamo onesti, perché qualcuno si aspetterebbe che un bot menta?

A meno che,

Il bot creda un po’ troppo in se stesso. Il bot non ha umiltà. “Tutti credono a me, ergo devo essere l’epitome della verità”.

Ma facciamo un passo indietro. Tornando alla trave cantoniera —

Il codice scritto per questo assumeva che il carico fosse lungo la lunghezza della trave cantoniera; quindi il grafico di deflessione rispetto alla lunghezza è uniforme.

Immagine dell'autore

Magari ChatGPT aveva bisogno di più contesto, ho pensato. Forse si sta concentrando più sulle altre parole piuttosto che su “trave cantoniera”. Con questa idea in mente, ho deciso di spiegare prima al bot cosa sia una trave cantoniera. Gli ho dato un compito per impararlo.

La seconda volta ho cercato di ottenere ChatGPT a definire Trave cantoniera come una Classe Python (un tentativo speranzoso n. 2), e poi lavorare sul problema, con la speranza che avesse una maggiore conoscenza (dato che è un modello di apprendimento).

Tentativo 2: Definire un’asta sporgente in Python

Sembra che sia andato abbastanza bene. La definizione della classe era pulita, con una funzione self per il calcolo della deflessione. Ci si sentirebbe orgogliosi.

class AstaSporgente:
    def __init__(self, lunghezza, area, modulo):
        self.lunghezza = lunghezza  # Lunghezza dell'asta sporgente
        self.area = area  # Area della sezione trasversale dell'asta sporgente
        self.modulo = modulo  # Modulo di Young dell'asta sporgente
        self.deflessioni = None  # Inizializza l'array delle deflessioni a None
    def __str__(self):
        return f"Asta sporgente con lunghezza {self.lunghezza} m, area {self.area} m^2 e modulo {self.modulo} Pa"
    def calcola_deflessioni(self, carichi):
        # Calcola le deflessioni in diversi punti lungo l'asta sporgente sotto un dato insieme di carichi
        momento_di_inerzia = self.area * (self.lunghezza ** 3) / 12
        self.deflessioni = []
        for carico in carichi:
            deflessione = carico * (self.lunghezza ** 3) / (3 * self.modulo * momento_di_inerzia)
            self.deflessioni.append(deflessione)

<pÈ andato troppo bene: la deflessione all'estremità non presentava errori significativi rispetto alla soluzione analitica. All'inizio l'ho ignorato anch'io; "Perché dubitare di una cosa buona?"

La mappa completa delle deflessioni era lineare, però. La deflessione non dovrebbe essere lineare, vero?

Asta sporgente deformata secondo ChatGPT

ChatGPT ha capito ciò di cui avevo bisogno nell’attributo delle deflessioni, ma ha scritto il codice in modo errato. Volevo un array di deflessioni in diversi punti lungo l’asta sporgente. Invece, ha tracciato per diverse intensità di carico alla fine. Questo sarà ovviamente una curva lineare (anziché la curva cubica attesa) perché viene tracciata in funzione del carico (P) e non della distanza (x).

Analiticamente, la soluzione appare così:

Dove, P = Carico all’estremità x = Distanza dall’incastro E = Modulo di Young Iᵧ = Momento d’inerzia rispetto all’asse y L = Lunghezza dell’asta

Sotto stress e preoccupato per il codice (con un certo numero di tentativi non documentati), ho riletto i codici generati in precedenza, cercando un errore, cercando una riga che potrei aver saltato, solo per scoprire ciò che mi stava guardando in faccia: ChatGPT ha usato la funzione analitica di deflessione per sé stesso.

Blasfemia

Qualcuno potrebbe trovarlo nella stessa definizione della classe e dire: “Oh, non era così difficile da trovare”. Quello che devi capire è che questo non è stato il mio unico tentativo né è stato un’impresa di un solo giorno.

È ora di ricominciare. Rifare. Rinnovare. Una nuova chat.

Con una mente fresca e un approccio diverso pianificato, mi sono collegato a Open AI. Prima di fare qualsiasi cosa legata al compito in questione, avevo bisogno di verificare una cosa; per la mia sanità mentale:

Non si può mai essere troppo sicuri (Immagine dell'autore)

È rassicurante, vero? Come l’esperienza ci ha insegnato, non fidarti del bot. Ma possiamo dargli il beneficio del dubbio.

Avevamo bisogno che il bot capisse due cose: uno, cosa è un’asta sporgente, e due, come eseguire un’analisi delle differenze finite su di essa.

Questo è un bel punto per fermarsi e analizzare un modello di apprendimento. Gli abbiamo chiesto di imparare prima cosa è un’asta sporgente e poi di eseguire un’analisi delle differenze finite (FDM) su di essa. Questo è fallito perché la quantità che volevamo analizzare usando la differenza finita era già definita analiticamente dal bot nella sua definizione dell’asta sporgente.

Ecco perché andiamo in questa direzione opposta (incrociamo le dita, la terza volta è quella buona, tentativo n. 3): Chiediamo di eseguire alcuni esempi di differenze finite di base e poi passiamo a un’asta sporgente.

Tentativo 3: Applica l’analisi delle differenze finite per risolvere un problema di una trave incastrata con un carico sulla punta

# codice risultante: import numpy as npimport matplotlib.pyplot as plt# Definisci le proprietà della trave incastrataL = 1.0     # Lunghezza della trave incastrataE = 1.0e7   # Modulo di YoungI = 1.0e-4  # Momento d'inerziaw = 100.0   # Carico sulla punta# Definizione aggiunta di una soluzione analitica per confrontodef cantilytical(x):    return w*(x**3)/(6*E*I) - w*L*x*x/(2*E*I)# Definisci le condizioni al contornox0 = 0.0y0 = 0.0dydx0 = 0.0# Definisci il dominio della soluzionea = 0.0b = Ln = 101   # Numero di punti sulla grigliah = (b - a) / (n - 1)   # Spaziatura della griglia# Inizializza gli array delle soluzionix = np.linspace(a, b, n)y = np.zeros(n)dydx = np.zeros(n)# Applica l'approssimazione delle differenze finite per risolvere l'equazione differenzialefor i in range(1, n):    y[i] = y[i-1] + h*dydx[i-1]    dydx[i] = dydx[i-1] + h*(-w/(E*I))    # Applica le condizioni al contornoy[0] = y0dydx[0] = dydx0# Traccia la soluzioneplt.plot(x, y*1000, 'r-', lw=2, label='FDM')plt.plot(x, cantilytical(x)*1000, 'b--', lw=4, label='esatta')plt.xlabel('x (m)')plt.ylabel('y (mm)')plt.legend()plt.show()# yay!! :D
Confronto tra la deflessione di ChatGPT e la soluzione analitica (Immagine generata eseguendo il codice sopra)

Questo è stato un successo ragionevole. Tuttavia, come si può vedere, questa non è vicina alla soluzione esatta della trave incastrata (ottenuta analiticamente) poiché sembra essere stata risolta utilizzando approssimazioni di primo ordine.

Nell’esecuzione precedente del metodo, ChatGPT è stato bravo nel riconoscere l’algoritmo corretto e nell’implementarlo. Le questioni più sottili, come sapere che il limite per una matrice non può superare n quando si crea una matrice tridiagonale, sono cose che il bot non riesce a cogliere. Queste sono cose che noi, come programmatori umani, riconosciamo e sappiamo come risolvere.

In conclusione, ChatGPT è un modello di linguaggio molto buono. Ma si comporta bene solo con i linguaggi. La padronanza del codice è qualcosa che non ha o (dalla nostra esperienza) non sarà in grado di raggiungere. Ciò porta a una contraddizione nel modo del mondo. Noi possiamo scrivere codice. Il codice non può scrivere codice su se stesso o su qualcosa di più grande di sé stesso.

Il Poeta

Ultima richiesta al poeta, ChatGPT: Scrivi una poesia su ChatGPT che fa confusione nel codice

Ciò che è seguito è stato il punto culminante del mio sforzo:

Oh, ChatGPT, il maestro delle parole, Con abilità linguistiche senza pari, Ma quando si tratta di codificare, Fatica a mettere le cose a posto.

Il suo vocabolario è vasto e ampio, Con le regole grammaticali può attenersi, Ma le regole di sintassi, non può nascondere, Si confonde e non riesce a decidere.

Prova a scrivere righe di codice, Con funzioni, classi, cicli in vista, Ma quando viene eseguito, oh che spavento, Si blocca duramente, senza fine in vista.

Eppure amiamo caro ChatGPT, Per tutto l’aiuto linguistico che porta, E anche se il suo codice può essere difettoso, La sua maestria linguistica è commovente.

Con questa poesia auto-riflessiva di un LLM per un co-autore, chiudo il mio caso.

L’intera interazione è stata documentata su GitHub per coloro interessati ai dettagli. Questo include anche i codici completi generati da ChatGPT e le piccole modifiche apportate da me.