LoginSignup
0
0

ChatGPT3.5先生は2024年GW中、大学入試数学の猛勉強されましたか?空間ベクトル「気象大学校2022年多肢選択式第13問」をChatGPTとsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-05-17

既投稿を潰してしまって、復旧中です。申し訳ありません。
 気のせいなら、ごめんなさい。
・sympyの計算結果もでる。
 今まで、sympyの計算結果がでなかったはず?
 「sympyで」が無しでも、結果がでる。

・作図は、私のFreeCADの操作が未熟で、申し訳ありません。
・気象大学校の年度は、ビミョーに1つずれるそうです。

(2024/05/21追加)
 猛勉強は、
「GPT-4o(オムニ:omni)」と関係ないと思います。
https://ja.wikipedia.org/wiki/ChatGPT#GPTモデル
https://www.deepl.com/ja/translator#en/ja/omni

オリジナル

> T氏の数学日記 様 問題解答解説

リンク先を直しました。

> 大学入試数学問題集成 様 >【13】テキスト

公式ホームページ
(省略)

sympyで(オリジナル 様の方法で)

・??? 勉強中

ChatGPT-3.5先生へ(その1) 選択肢あり。

・ページのソースを表示です。MathMLです。
 途中の表示を省略しようと思いましたが、大学入試数学問題集成 様の必要部分です。

<div class="qbody">
<p class="slevel"><a name="q-0113" 
id="q-0113"></a><span 
class="qnum">【13】</span> 座標空間内の<math>
<mspace width=".2em"></mspace><mn>4</mn>
<mspace width=".2em"></mspace>
</math>点<math>
<mspace width=".2em"></mspace><mi mathvariant="normal">A</mi>
<mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mn>0</mn><mo>,</mo>
<mo>-</mo><mn>1</mn><mo>,</mo><mn>1</mn>
<mo rspace=".2em" stretchy="false">)</mo><mtext>,</mtext></mrow>
</math><math>
<mi mathvariant="normal">B</mi><mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mn>2</mn><mo>,</mo>
<mn>0</mn><mo>,</mo><mn>0</mn>
<mo rspace=".2em" stretchy="false">)</mo><mtext>,</mtext></mrow>
</math><math>
<mi mathvariant="normal">C</mi><mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mn>1</mn><mo>,</mo>
<mn>0</mn><mo>,</mo><mn>1</mn>
<mo rspace=".2em" stretchy="false">)</mo><mtext>,</mtext></mrow>
</math><math>
<mi mathvariant="normal">D</mi><mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mi>t</mi><mo>,</mo><mn>2</mn>
<mo>,</mo><mn>0</mn><mo rspace=".2em" stretchy="false">)</mo></mrow>
</math><math>
<mrow><mtext>(</mtext><mspace width=".2em"></mspace>
<mi>t</mi></mrow><mspace width=".2em"></mspace>
</math>は実数)が同一平面上にあるとき,<math>
<mi>t</mi><mspace width=".2em"></mspace>
</math>の値はいくらか.</p>
<p class="s2sublevel half"><math>
<mrow><mtext>1.</mtext><mo>-</mo><mn>2</mn><mtext>  </mtext></mrow>
</math><math>
<mrow><mtext>2.</mtext><mn>0</mn><mtext>  </mtext></mrow>
</math><math>
<mrow><mtext>3.</mtext><mn>2</mn><mtext>  </mtext></mrow>
</math><math>
<mrow><mtext>4.</mtext><mn>4</mn><mtext>  </mtext></mrow>
</math><math>
<mrow><mtext>5.</mtext><mn>6</mn></mrow></math>
</p>
</div>
</div>

・上記を、ChtGPTのnewchatにコピー貼り付けです。
なんだか、凄すぎる。
 (結果省略)

ChatGPT-3.5先生へ(その2) 選択肢なし。

<div class="qbody">
<p class="slevel"><a name="q-0113" 
id="q-0113"></a><span 
class="qnum">【13】</span> 座標空間内の<math>
<mspace width=".2em"></mspace><mn>4</mn>
<mspace width=".2em"></mspace>
</math>点<math>
<mspace width=".2em"></mspace><mi mathvariant="normal">A</mi>
<mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mn>0</mn><mo>,</mo>
<mo>-</mo><mn>1</mn><mo>,</mo><mn>1</mn>
<mo rspace=".2em" stretchy="false">)</mo><mtext>,</mtext></mrow>
</math><math>
<mi mathvariant="normal">B</mi><mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mn>2</mn><mo>,</mo>
<mn>0</mn><mo>,</mo><mn>0</mn>
<mo rspace=".2em" stretchy="false">)</mo><mtext>,</mtext></mrow>
</math><math>
<mi mathvariant="normal">C</mi><mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mn>1</mn><mo>,</mo>
<mn>0</mn><mo>,</mo><mn>1</mn>
<mo rspace=".2em" stretchy="false">)</mo><mtext>,</mtext></mrow>
</math><math>
<mi mathvariant="normal">D</mi><mspace width=".5em"></mspace>
</math><math>
<mrow><mo stretchy="false">(</mo><mi>t</mi><mo>,</mo><mn>2</mn>
<mo>,</mo><mn>0</mn><mo rspace=".2em" stretchy="false">)</mo></mrow>
</math><math>
<mrow><mtext>(</mtext><mspace width=".2em"></mspace>
<mi>t</mi></mrow><mspace width=".2em"></mspace>
</math>は実数)が同一平面上にあるとき,<math>
<mi>t</mi><mspace width=".2em"></mspace>
</math>の値はいくらか.</p>

・上記を、ChtGPTのnewchatにコピー貼り付けです。
なんだか、これも凄すぎる。
 (結果省略)

ChatGPT-3.5先生へ(その3)??? 私は先生の凄さがわかりませんでした。

・以下の1行を追加して、貼り付ける。
 行列式を使わず、ベクトルだけでお願いします。
なんだか、これも凄すぎる。
 (結果省略)

ChatGPT-3.5先生へ(その4)??? 私は先生の凄さがわかりませんでした。

・sympyで
・ChatGPT-3.5先生のコードをvscodeで実行しました。
 私は、ソースコードのprint文に手を加えています。
なんだか、これも凄すぎる。
 (結果省略)

import sympy as sp

# Define the coordinates of the points
A = sp.Matrix([0, -1, 1])
B = sp.Matrix([2, 0, 0])
C = sp.Matrix([1, 0, 1])
D = sp.Matrix([sp.symbols('t'), 2, 0])

# Vectors AB, AC, AD
AB = B - A
AC = C - A
AD = D - A

# Mixed product AB · (AC × AD)
mixed_product = AB.dot(AC.cross(AD))

# Solve for t
t_value = sp.solve(mixed_product, sp.symbols('t'))
print("#",t_value)
# [4]

(従来の方法)sympyで、私のいつもの方法です。

・以下、私のコツコツのコードです。
・安易に行列式を使っています。
>sympy docより
https://docs.sympy.org/latest/tutorials/intro-tutorial/matrices.html#advanced-methods

・ ver.0.1 : T氏様の解答方法を参考にです。

# ver0.1
from sympy import *
var('t,p,q',real=True)
A=Point(0,-1, 1)
B=Point(2, 0, 0)
C=Point(1, 0, 1)
D=Point(t, 2, 0)
DA1=p*(B-A)+q*(C-A)  
DA2=  (D-A)  
print  ("#",solve([Eq(DA1.x,DA2.x),Eq(DA1.y,DA2.y),Eq(DA1.z,DA2.z)],[p,q,t])[t])
# print("#",solve([Eq(DA1  ,DA2  )                                ],[p,q,t])[t])
# 4

・ ver.0.2 : 行列式の三角錐の体積公式??? です。

# ver0.2
from sympy import *
var('t',real=True)
def SimentaiTaiseki(PTO,PTA,PTB,PTC):
    return Matrix([[PTA.x-PTO.x, PTA.y-PTO.y, PTA.z-PTO.z],
                   [PTB.x-PTO.x, PTB.y-PTO.y, PTB.z-PTO.z],
                   [PTC.x-PTO.x, PTC.y-PTO.y, PTC.z-PTO.z]]
                  ).det()/6
A=Point(0,-1, 1)
B=Point(2, 0, 0)
C=Point(1, 0, 1)
D=Point(t, 2, 0)
t_ans=solve(SimentaiTaiseki(A,B,C,D),t)[0]
print("#",t_ans)
# 4

・ ver.0.3 : ver.0.2と同じです.わざわざ作図のためです。

# ver0.3
from sympy import *
var('t',real=True)
def SimentaiTaiseki(PTO,PTA,PTB,PTC):
    return Matrix([[PTA.x-PTO.x, PTA.y-PTO.y, PTA.z-PTO.z],
                   [PTB.x-PTO.x, PTB.y-PTO.y, PTB.z-PTO.z],
                   [PTC.x-PTO.x, PTC.y-PTO.y, PTC.z-PTO.z]]
                  ).det()/6
A=Point(0,-1, 1)
B=Point(2, 0, 0)
C=Point(1, 0, 1)
D=Point(t, 2, 0)
D=D.subs({t:solve(SimentaiTaiseki(A,B,C,D),t)[0]})
print("#",D)
# Point3D(4, 2, 0)

・ ver.0.4 : チョット凝りすぎのプログラム: 三角錐の体積公式???へ値の代入
???点A,B,Cの座標に値を、具体的な代入していない。
 変数のまま。最後に値を代入。

from sympy import *
var('t'       ,real=True)
var('ax,ay,az',real=True)
var('bx,by,bz',real=True)
var('cx,cy,cz',real=True)
var('dx,dy,dz',real=True)
def SimentaiTaiseki(PTO,PTA,PTB,PTC):
    return Matrix([[PTA.x-PTO.x, PTA.y-PTO.y, PTA.z-PTO.z],
                   [PTB.x-PTO.x, PTB.y-PTO.y, PTB.z-PTO.z],
                   [PTC.x-PTO.x, PTC.y-PTO.y, PTC.z-PTO.z]]
                  ).det()/6
A=Point(ax,ay,az)
B=Point(bx,by,bz)
C=Point(cx,cy,cz)
D=Point(dx,dy,dz)
V=SimentaiTaiseki(A,B,C,D)
print("#",V)
# 
rep={ax:0,ay:-1,az:1,
     bx:2,by: 0,bz:0,
     cx:1,cy: 0,cz:1,
     dx:t,dy: 2,dz:0}
print("#",D.subs(rep).subs({t:solve(V.subs(rep),t)[0]}))
# -ax*by*cz/6 + ax*by*dz/6 + ax*bz*cy/6 - ax*bz*dy/6 - ax*cy*dz/6 + ax*cz*dy/6 + ay*bx*cz/6 - ay*bx*dz/6 - ay*bz*cx/6 + ay*bz*dx/6 + ay*cx*dz/6 - ay*cz*dx/6 - az*bx*cy/6 + az*bx*dy/6 + az*by*cx/6 - az*by*dx/6 - az*cx*dy/6 + az*cy*dx/6 + bx*cy*dz/6 - bx*cz*dy/6 - by*cx*dz/6 + by*cz*dx/6 + bz*cx*dy/6 - bz*cy*dx/6
# Point3D(4, 2, 0)

・ ver.0.5 : ver0.4と同じ。Point文をmap関数にしました。

from sympy import *
var('t'       ,real=True)
var('ax,ay,az',real=True)
var('bx,by,bz',real=True)
var('cx,cy,cz',real=True)
var('dx,dy,dz',real=True)
def SimentaiTaiseki(PTO,PTA,PTB,PTC):
    return Matrix([[PTA.x-PTO.x, PTA.y-PTO.y, PTA.z-PTO.z],
                   [PTB.x-PTO.x, PTB.y-PTO.y, PTB.z-PTO.z],
                   [PTC.x-PTO.x, PTC.y-PTO.y, PTC.z-PTO.z]]
                  ).det()/6
A,B,C,D=map(Point,[(ax,ay,az),(bx,by,bz),(cx,cy,cz),(dx,dy,dz)])
V=SimentaiTaiseki(A,B,C,D)
print("#",V)
# 
rep={ax:0,ay:-1,az:1,
     bx:2,by: 0,bz:0,
     cx:1,cy: 0,cz:1,
     dx:t,dy: 2,dz:0}
print("#",D.subs(rep).subs({t:solve(V.subs(rep),t)[0]}))
# -ax*by*cz/6 + ax*by*dz/6 + ax*bz*cy/6 - ax*bz*dy/6 - ax*cy*dz/6 + ax*cz*dy/6 + ay*bx*cz/6 - ay*bx*dz/6 - ay*bz*cx/6 + ay*bz*dx/6 + ay*cx*dz/6 - ay*cz*dx/6 - az*bx*cy/6 + az*bx*dy/6 + az*by*cx/6 - az*by*dx/6 - az*cx*dy/6 + az*cy*dx/6 + bx*cy*dz/6 - bx*cz*dy/6 - by*cx*dz/6 + by*cz*dx/6 + bz*cx*dy/6 - bz*cy*dx/6
# Point3D(4, 2, 0)

FreeCADのマクロで作図

・計算は、ver0.3にしました。
・3次元FreeCADのワイヤーフレームです。
・マクロプログラムの計算部分は、コピーしています。

import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
##############################################################
# ver0.3
from sympy import *
var('t',real=True)
def SimentaiTaiseki(PTO,PTA,PTB,PTC):
    return Matrix([[PTA.x-PTO.x, PTA.y-PTO.y, PTA.z-PTO.z],
                   [PTB.x-PTO.x, PTB.y-PTO.y, PTB.z-PTO.z],
                   [PTC.x-PTO.x, PTC.y-PTO.y, PTC.z-PTO.z]]
                  ).det()/6
A=Point(0,-1, 1)
B=Point(2, 0, 0)
C=Point(1, 0, 1)
D=Point(t, 2, 0)
D=D.subs({t:solve(SimentaiTaiseki(A,B,C,D),t)[0]})
print("#",D)
# Point3D(4, 2, 0)

##########################################################################################################
### 作図用
##########################################################################################################
### 3D作図
def myXYZ2Txt(A):
     return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
    #return ''
def myTxtXYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '1.0 mm'
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.5 mm'
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.3 mm'
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.1 mm'
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.05 mm'
    return
def myTxtXYZ_S(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt(xy_tx[2*i-2]) )
    return
def myLine(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),float(A.z)
    Bx,By,Bz=float(B.x),float(B.y),float(B.z)
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
    return
def myLine_S(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    return
def myLine_C(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    myLine(args[i],args[0])
    return
def myLine_H(*args):
    for i in range(1,len(args)):
        myLine(args[0],args[i])
    return
#

myLine_C  (A,B,C)
myLine_H  (D,A,B,C)
myTxtXYZ_S(A,"A",B,"B",C,"C",D,"D")
#
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")

・作図はしましたが、FreeCADの勉強不足で、正しいか誤っているかよくわかりません。

1.png
拡大図
2.png

いつもと違うおすすめです。

「(自作)三角錐の座標による体積の公式」へのリンクを追加しました。

いつもの? sympyの実行環境と 参考のおすすめです。

(テンプレート)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0