既投稿を潰してしまって、復旧中です。申し訳ありません。
気のせいなら、ごめんなさい。
・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の勉強不足で、正しいか誤っているかよくわかりません。
いつもと違うおすすめです。
「(自作)三角錐の座標による体積の公式」へのリンクを追加しました。