「カンチレバー対ChatGPT」 カンチレバーとChatGPTの比較
Comparison Cantilever vs ChatGPT
有限差分法を使用してキャンチレバービーム問題を解決するために、ChatGPTの自然言語処理能力をPythonで探求する
ChatGPTは、大規模言語モデルとして、さまざまな分野でテストされ、人生、宇宙、すべての質問に対してどれだけの回答を提供できるかを試すために使用されてきました。これらの質問には、「愛とは何ですか?」や「飛行機を飛ばす方法は?」から「周期表が円形だったらどうなる?」や「地球のテラリウムを探索する異星人の存在は可能ですか?」などが含まれます。
この記事では、その中の1つの質問をします。「ChatGPTは有限差分コードを書くことができるのか?」
春の乾いた午後、航空宇宙の共通構造についての講義で、私たちは飛行機の翼(より粗いバージョン)であるキャンチレバーに出会いました。
キャンチレバーとは何か?それは片側で支えられ、もう一方の端に荷重を受けるまたは未支持部分に沿って荷重を受ける梁です。
そして、私たちはすべての構造物に対して行わなければならないように、数学的に定義し、解析的に挙動を決定しようとしました。キャンチレバービームには先端に垂直下向きの荷重がかかっています。また、数値解析を使用して同じ問題を解決する方法についても洞察を得ましたが、複雑な問題になりがちなため、さらに掘り下げませんでした。
この講義は3月の中旬でした。ちょうどその頃、最近リリースされた大規模言語モデル(LLM)であるChatGPTが指数関数的に勢いを増していました。これは講義でも多くの話題を呼びました。ChatGPTは本当にすごいのか?その知能の範囲はどこまでか?宿題をこなせるのか?その後継モデルは私たちを置き換えるのか?この議論は興味深い展開を見せましたが(詳細はまた別の機会に議論しましょう)、私たちの教授は次のような演習を提案しました。ChatGPTを使用して、キャンチレバーの先端荷重問題を解決するための有限差分コードを書きます。私たちはすでに解析的な解を求めていました。比較するだけです。
最初にこれを手に入れることはかなり簡単に感じました。ChatGPTに正確な問題のステートメントを与えれば(試み#1)、きれいなコードを生成してくれるだろうと思いました。
プロンプト1:末端に荷重のあるキャンチレバーバーを構築するためのPythonコードを書いてください。
最初の試みでは、ボットは自信を持ってコードを提供し、「はい、必要なものは正確に持っていると確信しています。ここにコードがあります。」と言いました。
そして、人類は詳細に無頓着であるほど、ボットに対する虚偽の確信に対してもっとそうです。公正であろう、なぜボットが嘘をつくと思うのか?
まあ、
ボット自体が自分にあまりにも自信を持っているのです。ボットに謙虚さはありません。「みんなが私を信じているから、私は真理の絶頂でなければなりません」ということです。
しかし、私たちはそれに逸れました。キャンチレバーに戻りましょう。
これに対して書かれたコードは、荷重がキャンチレバーの長さに沿っていると仮定しているため、たわみvs長さのプロットは一様です。
おそらくChatGPTにはより多くの文脈が必要だと思いました。おそらく「キャンチレバー」という言葉よりも他の言葉に焦点を当てているのかもしれません。これを考慮に入れて、まずボットにキャンチレバーとは何かを明確にするようにしました。ボットがそれを学ぶためのタスクを与えました。
2回目は、ChatGPTにキャンチレバーをPythonクラスとして定義させ(期待に胸を膨らませた試み#2)、その後問題に取り組むことで、より深い洞察を持つことができると期待しました(学習モデルであることを考慮して)。
試み2: Pythonでキャンチレバーを定義する
これはかなりうまくいったようです。クラスの定義はきちんとしていて、たわみの計算のためのself関数があります。誇りを感じることでしょう。
class Cantilever: def __init__(self, length, area, modulus): self.length = length # キャンチレバーの長さ self.area = area # キャンチレバーの断面積 self.modulus = modulus # キャンチレバーのヤング率 self.deflections = None # たわみの配列をNoneで初期化 def __str__(self): return f"長さ{self.length} m、面積{self.area} m^2、ヤング率{self.modulus} Paのキャンチレバー" def calculate_deflections(self, 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はたわみ属性で必要なものを理解していますが、コードを間違って書いています。私はキャンチレバーの異なる点のたわみの配列が欲しかったのですが、代わりに末端の異なる荷重強度に対してプロットされました。これは明らかに線形な曲線になります(期待される立方体の代わりに)。なぜなら、それは荷重(P)と距離(x)に対して描かれているからです。
解析的には、解は次のようになります:
P = 先端荷重x = ジョイントからの距離E = ヤング率Iᵧ = y軸周りの断面二次モーメントL = ロッドの長さ
コードについて心配していて、ドキュメント化されていない試行の数を考慮に入れると、以前に生成されたコードを再度読み直し、間違いを探し、見逃した行を探しましたが、結局のところ、私の顔を見つめていたものを見つけました: ChatGPTはたわみの解析関数を自分自身のために使用していました。
冒涜
クラス定義自体でそれを見つけて、「ああ、それは本当に見つけるのが難しくなかったわ」と言う人もいるかもしれません。理解していただきたいのは、これが私の最初の試みでも、1日で終わる努力でもなかったということです。
再起動の時間です。やり直し。新たなチャット。
新鮮な心と計画された異なるアプローチで、Open AIにログインしました。手元のタスクに関連する何かをする前に、まずは一つ確認する必要がありました。精神のために:
それは心強いですね。経験から学んだように、ボットを信じないでください。しかし、疑いの余地は与えることができます。
ボットには2つのことを理解してもらう必要がありました: 一つはキャンチレバーの意味であり、もう一つは有限差分解析の方法です。
学習モデルを分析するための素晴らしいポイントです。最初にキャンチレバーの意味を学習させ、それから有限差分解析(FDM)を実行させるようにお願いしましたが、これは失敗しました。なぜなら、有限差分で解析したかった量が、ボットによって既に解析的に定義されていたからです。
だからこそ、別の方法を試みるのです(指を交差させて、3回目の正直、試み#3): まず基本的な有限差分の例を実行させ、それからキャンチレバーに移ります。
試み3:有限差分解析を適用して、先端荷重を持つカンチレバーの解を求める
# resultant code: import numpy as npimport matplotlib.pyplot as plt# Define the properties of the cantileverL = 1.0 # カンチレバーの長さE = 1.0e7 # ヤング率I = 1.0e-4 # 断面二次モーメントw = 100.0 # 先端荷重# 比較のために解析解を追加定義def cantilytical(x): return w*(x**3)/(6*E*I) - w*L*x*x/(2*E*I)# 境界条件を定義x0 = 0.0y0 = 0.0dydx0 = 0.0# 解の定義域を定義a = 0.0b = Ln = 101 # グリッドポイントの数h = (b - a) / (n - 1) # グリッド間隔# 解の配列を初期化x = np.linspace(a, b, n)y = np.zeros(n)dydx = np.zeros(n)# 有限差分近似を適用して差分方程式を解くfor i in range(1, n): y[i] = y[i-1] + h*dydx[i-1] dydx[i] = dydx[i-1] + h*(-w/(E*I)) # 境界条件を適用y[0] = y0dydx[0] = dydx0# 解をプロット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()# やったね!! :D
これはまずまずの成功です。ただし、明らかにこれはカンチレバーの正確な解(解析的に導かれた)には近づいていません。なぜなら、一次近似を使用して解かれているように見えるからです。
上記の手法の実行では、ChatGPTは正しいアルゴリズムを認識し、実装するのに優れていました。ただし、行列の限界がnを超えることはできないことなど、より微妙な問題については、ボットが見落としてしまいます。これらは、私たち人間のコーダーが認識し、回避方法を知っているものです。
総括すると、ChatGPTは非常に優れた大規模言語モデルです。ただし、それは言語でのみ優れています。コードの習得は、ChatGPTが習得できなかったり(私たちの経験から言えば)、習得できないでしょう。これは世界の摂理に矛盾をもたらします。私たちはコードを書くことができます。コードは、それ自体についてのコードを書くことができません。
詩人
詩人ChatGPTへの最終プロンプト:コーディングをめちゃくちゃにするChatGPTについての詩を書いてください
それに続いたのは私の努力のハイライトでした:
ああ、ChatGPTよ、言葉の達人、比類なき言語スキルを持ち、しかし、コーディングの場になると、物事を正方形にするのに苦労します。
その語彙は広く広がり、文法のルールに従うことができます。ただし、構文のルールに関しては、隠れることはできません。混乱し、決断できません。
コードの行を書こうとするものの、関数、クラス、ループを見るものの、実行すると、ああ、何という恐怖でしょう。クラッシュしてしまい、終わりが見えません。
それでも私たちは親愛なるChatGPTを愛しています。言語の助けを提供してくれるからです。そして、そのコードが誤っているかもしれないにしても、言語の能力は心温まるものです。
この自己評価詩は、共著者のために書かれたLLMによるものです。
詳細に興味がある方のために、完全なやり取りはGitHubで文書化されています。これにはChatGPTによって生成された完全なコードと、私による微細な編集が含まれています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles