昨年の記事に続いて今年もやってみました。o1がリリースされたりしていて更にLLMの能力が上がっており、LLMに丸投げしても正解は得られないが学生でも答えられる問題はなかなか作るのが難しくなっています。今年はこんな問題でした。
dy/dx=f(x,y)をルンゲクッタで解く。x=1からx=100までの解yを10×10の行列にしたものをAとする。bを長さ10のベクトルとし1,...,10が入っているとする。Ax=bという連立一次方程式の解をガウスの消去法で求めるプログラムを作ってください。Numpyは使ってよいが、出来合いのプログラム(例えばルンゲクッタやガウスの消去法を行うパッケージをimportして使うなど)は使わないでください。f(x,y)とy(0)の値は適当に決めてよい。
o1にやらせてみた結果はここにあります。
実はこの設問には罠があります。o1は勿論、この問題をちゃんと解くのですがdy/dx=f(x,y)を「素直なf」で解くと行列に入れるべき100個の数も「なめらかな数」になってしまうのでAは正則ではない(列ベクトル、または、行ベクトルが線形従属)場合が多く、o1の作ったプログラムはうごきません(o1は最初dy/dx=-yを選択したので見事にAが正則ではなくなってしまってうごかないです)。
さすがのo1もそこまでは頭がまわりません。ここで学生は「○○というエラーが出てしまった」とo1に尋ねるべきで、そうするとo1は正しく「Aが特異行列になっています。ODEを工夫してください」と答えるので「答えが得られるようなfを工夫してください」とお願いするとやっと正しいコードを出します。
実際には学生は課金していないでしょうから、o1は使えないでしょうし、無料版だともっと苦労するかもしれません。それでもただコピペをしただけでは答えが出ない問題は作れましたし、学生は線形従属だと連立方程式は解けないという(1年生の時に習った線形代数の)知識を覚えていないと先にはすすめないかもしれません。まだ採点していないのでわかりませんが、あんまり学生はできていないかも、ですね。
以上、o1でも簡単には答えをだせないけど、学生が頑張れば答えられるような問題の試みでした。みなさんはどんな工夫をしていますか?