悬臂式 vs ChatGPT

使用Python探索ChatGPT在自然语言处理方面的能力,通过询问它使用有限差分法解决悬臂梁问题。

ChatGPT作为一个大型语言模型,在许多领域进行了测试,以测试它能够给出的关于生活、宇宙和一切的问题的答案。这些问题包括“什么是爱?”和“如何驾驶飞机?”以及“如果元素周期表是圆形的,它会是什么样子?”和“幽灵是否可以作为外星生命形式探索地球的生态环境?”

在这篇文章中,我们提出了一个问题:“ChatGPT能否写一段有限差分代码?”

在一个干燥的春天午后,在一堂关于航空航天常见结构的讲座中,我们遇到了一架飞机(更加原始粗糙的版本)的机翼:悬臂式结构。

什么是悬臂梁?它是一种在一端支撑并在另一端或无支撑部分上承载负荷的梁。

ChatGPT中文站
Cantilever beam with downward load (Image created on draw.io by Author)

并且,像对待每个遇到的结构一样,我们尝试在数学上定义并分析确定一个在尖端承受垂直向下载荷的悬臂梁的行为。我们还通过数值分析来解决相同的问题,但没有进一步探究,因为(正如这些方法所示),它们往往变得非平凡。

这个班是在三月中旬进行的:正好是最近发布的大型语言模型(LLM)ChatGPT开始迅速崛起的时候。这也引发了很多课堂上的讨论:ChatGPT到底有多出色?它的智能程度如何?它能否帮我们完成作业?它的后继者会取代我们吗?虽然这些讨论有一些有趣的转折(细节留待以后讨论),但我们的教授提出了一个练习:使用ChatGPT编写一个有限差分代码来解决带有尖端载荷问题的悬臂梁。我们已经解决了解析解,现在只需进行比较即可。

起初对此感觉相当直接。让我们把准确的问题陈述给ChatGPT(初试,尝试#1),它会生成一段整洁的代码。

提示1:编写Python代码构造一个带有物体末端重量的悬臂杆。

在第一次尝试中,机器人自信地给出了代码并说道(换句话说):“是的,我确定我有你需要的东西。这是代码。”

并且就像人类对细节一无所知一样,对于机器人而言,往往更加具有一种虚假的安全感。让我们公平一点,为什么有人会期望机器人撒谎呢?

除非

该机器人对自己的信心过于自负。该机器人没有谦卑之心。“每个人都相信我,所以我必定是真理的典范”。

然而我们现在离题了。让我们回到悬臂梁-

代码的编写假设了负载沿悬臂的长度方向分布;因此挠曲与长度的图形是均匀的。

ChatGPT中文站
Image by Author

也许ChatGPT需要更多的上下文,这是我假设的。也许它更关注其他词汇而不是“悬臂”。有了这个想法,我决定先向机器人解释什么是悬臂。给它一个任务,让它学习。

第二次尝试,我尝试让ChatGPT定义悬臂作为一个Python类(希望的尝试 #2),然后解决这个问题,希望它能更有深度的洞察力(因为它是一个学习模型)。

尝试2:在Python中定义悬臂

这似乎进行得相当顺利。类的定义很整洁,带有自身函数用于偏转计算。人们会感到自豪。

class Cantilever:
def __init__(self, length, area, modulus):
self.length = length # Length of the cantilever
self.area = area # Cross-sectional area of the cantilever
self.modulus = modulus # Young's modulus of the cantilever
self.deflections = None # Initialize deflections array to None

def __str__(self):
return f"Cantilever with length {self.length} m, area {self.area} m^2, and modulus {self.modulus} Pa"

def calculate_deflections(self, loads):
# Calculate deflections at different points along the cantilever under a given set of loads
moment_of_inertia = self.area * (self.length ** 3) / 12
self.deflections = []
for load in loads:
deflection = load * (self.length ** 3) / (3 * self.modulus * moment_of_inertia)
self.deflections.append(deflection)

太好了:尖端偏转与理论解析解之间没有显著误差。起初我也忽略了它:“为什么要怀疑一件好事呢?”

完整的偏转图是线性的。然而,偏转不应该是线性的,对吗?

ChatGPT中文站
Deflected cantilever according to ChatGPT

ChatGPT 了解我在偏转属性上所需的内容,但代码写错了。我想要一个沿悬臂的不同点的偏转数组。然而,它绘制的是末端不同负载强度的图形。这显然是一个线性曲线(而不是预期的立方曲线),因为它是根据负载(P)而不是距离(x)绘制的。

从分析来看,该解决方案看起来是这样的:

在此式中,P = 施加的力载荷,x = 距离关节点的距离,E =杨氏模量,Iᵧ = y轴上的转动惯量,L = 杆的长度。

在对代码感到压力和担忧(暗示有许多未经记录的尝试)之际,我重新阅读之前生成的代码,寻找错误,寻找可能被忽略的代码行,却发现了正对着我的东西:ChatGPT为自身使用了偏转的分析功能。

亵渎

一个会发现它在类定义本身,并会说,“哦,那真的不难找到。”你需要明白的是,这既不是我唯一的尝试,也不是一天的努力。

重启的时刻。重新做。更新。一个新的聊天。

用一种全新的思路和计划,我登录了Open AI。在做与手头任务相关的任何事之前,我首先需要检查一件事,以保持理智。

ChatGPT中文站
One can never be too sure (Image by Author)

这是令人安心的,不是吗?根据经验,不要相信机器人。但我们可以给它以怀疑的好处。

我们需要机器人理解两件事情:一是什么是悬臂梁,二是如何对其进行有限差分分析。

这是一个停下来分析学习模型的好时机。我们要求它先学习什么是悬臂,然后对其进行有限差分分析(FDM)。这次失败是因为我们希望使用有限差分分析的数量在悬臂的定义中已经被机器人以解析方式定义了。

这就是为什么我们换种方式来进行(手指交叉,第三次以其魅力,尝试#3):让它执行一些基本的有限差分样例,然后转向悬臂。

尝试3:应用有限差分分析求解受尖端载荷作用的悬臂梁

# resultant code: 

import numpy as np
import matplotlib.pyplot as plt

# Define the properties of the cantilever
L = 1.0 # Length of cantilever
E = 1.0e7 # Young's modulus
I = 1.0e-4 # Moment of inertia
w = 100.0 # Tip load

# A's added definition of analytical solution for comparison
def cantilytical(x):
return w*(x**3)/(6*E*I) - w*L*x*x/(2*E*I)

# Define the boundary conditions
x0 = 0.0
y0 = 0.0
dydx0 = 0.0

# Define the domain of the solution
a = 0.0
b = L
n = 101 # Number of grid points
h = (b - a) / (n - 1) # Grid spacing

# Initialize the solution arrays
x = np.linspace(a, b, n)
y = np.zeros(n)
dydx = np.zeros(n)

# Apply finite difference approximation to solve the difference equation
for i in range(1, n):
y[i] = y[i-1] + h*dydx[i-1]
dydx[i] = dydx[i-1] + h*(-w/(E*I))

# Apply boundary conditions
y[0] = y0
dydx[0] = dydx0

# Plot the solution
plt.plot(x, y*1000, 'r-', lw=2, label='FDM')
plt.plot(x, cantilytical(x)*1000, 'b--', lw=4, label='exact')
plt.xlabel('x (m)')
plt.ylabel('y (mm)')
plt.legend()
plt.show()

# yay!! :D
ChatGPT中文站
Comparison of ChatGPT’s deflection v/s analytical solution (Image generated by running the above code)

这是一个相对成功的尝试。然而,显而易见的是,这并不接近悬臂的精确解(通过分析得出),因为它似乎是使用一阶近似解来解决的。

在上述方法的执行中,ChatGPT在识别正确的算法并实现它方面表现出色。然而,更加微妙的问题,比如知道在创建三对角矩阵时,矩阵的限制不能超过n,这是机器人无法理解的。这些是我们作为人类编程者能够意识到并知道如何解决的事情。

总而言之,ChatGPT是一个相当不错的大型语言模型。但它擅长于语言方面,仅限于此。掌握编码是它尚未(根据我们的经验)或将无法掌握的领域。这带来了世界运行方式上的矛盾。我们可以编写编码,但编码无法编写关于自身或更高级的编码。

诗人

最后一道题给诗人ChatGPT:写一首关于ChatGPT混乱编码的诗歌。

接下来是我努力的亮点:

哦,ChatGPT,文辞之帝, 语言技艺无人能比, 然而在编写代码板时, 它总是很难把事情安排得井井有条。

其词汇广阔丰富,守规则的文法,语法规则却无法隐藏,混乱不决断。

代码的行数尝试着编写,充满了函数、类和循环,然而当它运行时,多么可怕,宕机严重,看不到尽头。

然而我们仍热爱亲爱的ChatGPT,因为它带来了语言方面的帮助。虽然它的代码可能有缺陷,但它的语言能力令人温暖感动。

以这首自省诗为凭,由一位合著的法学硕士,我结案了。

完整的互动已经在GitHub上进行了记录,对于那些对细节感兴趣的人来说很有参考价值。其中还包括了ChatGPT生成的完整代码以及我进行的微小修改。

2023-10-20 17:09:54 AI中文站翻译自原文