0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ベクトルの三角形への応用「2023鳥取大学前期【1】」をChatGPTとWolframAlphaとsympyとFreeCADでやってみたい。

Last updated at Posted at 2023-08-06

・sympyで解法4通りでやってみました。
・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
・垂心の勉強中です。

オリジナル
リンク切れ
https://blog.goo.ne.jp/mh0920-yhは、見つかりませんでした。
身勝手な主張 様~2023年前期日程の鳥取大学工学部等の入試より
https://blog.goo.ne.jp/mh0920-yh

上と同じです。大学入試数学問題集成>テキスト【1】

ChatGPTで

勉強中

WolframAlpha で

勉強中

sympyで(<解法1>身勝手な主張 様の方法で)一次独立であることを用いて(求めて)ベクトルを定めることができる。

sympyのベクトルの座標表示です。
??? だんだん、最終行を含めてわからなくなってきました。???
アドバイスをいただけると幸いです。

from sympy import *
s,t  =symbols('s,t'  ,real=True)
Len_AD,Len_BD=symbols('Len_AD,Len_BD',real=True)
Len_AE,Len_CE=symbols('Len_AE,Len_CE',real=True)
Ax,Ay=symbols('Ax,Ay',real=True)
Bx,By=symbols('Bx,By',real=True)
Cx,Cy=symbols('Cx,Cy',real=True)
Hx,Hy=symbols('Hx,Hy',real=True)
(deg_A,Len_AB,Len_AC)=(60,8,6)
ans_ADBD=solve([Eq(Len_AD,Len_AC*cos(deg_A*pi/180)),Eq(Len_AB,Len_AD+Len_BD)],[Len_AD,Len_BD])
ans_AECE=solve([Eq(Len_AE,Len_AB*cos(deg_A*pi/180)),Eq(Len_AC,Len_AE+Len_CE)],[Len_AE,Len_CE])
Len_AD=ans_ADBD[Len_AD]
Len_BD=ans_ADBD[Len_BD]
Len_AE=ans_AECE[Len_AE]
Len_CE=ans_AECE[Len_CE]
print("#",ans_ADBD)
print("#",ans_AECE)
A=Point(Ax,Ay)
B=Point(Bx,By)
C=Point(Cx,Cy)
H=Point(Hx,Hy)
#
D=A+Len_AD/(Len_AD+Len_BD)*(B-A)
E=A+Len_AE/(Len_AE+Len_CE)*(C-A)
#
my1A=Eq(H-B,s*(E-B))
my1B=Eq(H-C,t*(D-C))
#
my2A=Eq(H-A,(1-s)*(B-A)+   s *(E-A))
my2B=Eq(H-A,   t *(D-A)+(1-t)*(C-A))
ans_st=solve( [Eq(my2A.rhs.x,my2B.rhs.x),
               Eq(my2A.rhs.y,my2B.rhs.y)],[s,t])
print("#",ans_st)
print("#",(1-s).subs({s:ans_st[s]}),Len_AE/(Len_AE+Len_CE)*s.subs({s:ans_st[s]}))
# {Len_AD: 3, Len_BD: 5}
# {Len_AE: 4, Len_CE: 2}
# {s: 5/6, t: 4/9}
# 1/6 5/9

sympyで(<解法2>身勝手な主張 様の方法で) メネラウスの定理を使う別解で

勉強中
以降、s,tだとまぎらわしいので、u,vにしています。

from sympy import *
BD,DA,AC,CE,EH,HE=symbols('BD,DA,AC,CE,EH,HE',real=True,nonnegative=True)
my1=Eq(BD/DA*AC/CE*EH/HE,1)
mySubs={BD:5,DA:3,AC:6,CE:2}
my2=Eq(my1.lhs.subs(mySubs)/5,my1.rhs/5)
print("#",my2)
Bx,By=symbols('Bx,By',real=True)
Cx,Cy=symbols('Cx,Cy',real=True)
Ex,Ey=symbols('Ex,Ey',real=True)
u ,v =symbols('u ,v ',real=True)
A=Point(0 ,0 )
B=Point(Bx,By)
C=Point(Cx,Cy)
E=Rational(2,3)*C
H=(B+5*E)/6
print("#",H)
print("#",solve( [Eq(H.x,u*B.x+v*C.x),
                  Eq(H.y,u*B.y+v*C.y) ],[u,v])
     )
# Eq(EH/HE, 1/5)
# Point2D(Bx/6 + 5*Cx/9, By/6 + 5*Cy/9)
# {u: 1/6, v: 5/9}

sympyで(<解法3> Triangle:三角形,orthocenter:垂心で)

class sympy.geometry.polygon.Triangle(*args, **kwargs)
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle
Triangleのclassを見つけました。身勝手な主張 様の三角形の作図の向きに合わせるため、
sas→sssで、座標の入れ替えをしました。class のsss を使わなくてもでした。<解法4>へ。
solveのEqはx,y連立方程式です。1行?でできませんでした。以前、自作関数?を作っています。

from sympy import *
u,v=symbols('u,v',real=True)
myT=Triangle(sas=(8,60,6))
myT=Triangle(sss=(myT.args[2].distance(myT.args[1]),
                  myT.args[1].distance(myT.args[0]),
                  myT.args[0].distance(myT.args[2])
                   ))
A=myT.args[2]
B=myT.args[0]
C=myT.args[1]
H=myT.orthocenter
# ans=solve(Eq(H-A,u*(B-A)+v*(C-A)),[u,v])
print("# ",solve([Eq(H.x-A.x,u*(B.x-A.x)+v*(C.x-A.x)),
                  Eq(H.y-A.y,u*(B.y-A.y)+v*(C.y-A.y))],[u,v])
     )
#  {u: 1/6, v: 5/9}

sympyで(<解法4> Law of cosines:余弦定理,orthocenter:垂心で)

余弦定理で十分でした。solveにしました。

from sympy import *
u,v   =symbols('u,v'   ,real=True)
Len_BC=symbols('Len_BC',real=True,nonnegative=True)
(deg_A,Len_AB,Len_AC)=(60,8,6)
Len_BC=solve(Eq(Len_BC**2,Len_AB**2+Len_AC**2-2*Len_AB*Len_AC*cos(deg_A*Rational(1,180)*pi)),Len_BC)[0]
B=Point(0     ,0)
C=Point(Len_BC,0)
A=Circle(B,Len_AB).intersection(Circle(C,Len_AC))[1]
H=Triangle(A,B,C).orthocenter
# ans=solve(Eq(H-A,u*(B-A)+v*(C-A)),[u,v])
print("# ",solve([Eq(H.x-A.x,u*(B.x-A.x)+v*(C.x-A.x)),
                  Eq(H.y-A.y,u*(B.y-A.y)+v*(C.y-A.y))],[u,v])
     )
#  {u: 1/6, v: 5/9}

FreeCADのマクロで作図

問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
計算部分は<解法3>をコピーです。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
from sympy import *
u,v=symbols('u,v',real=True)
myT=Triangle(sas=(8,60,6))
myT=Triangle(sss=(myT.args[2].distance(myT.args[1]),
                  myT.args[1].distance(myT.args[0]),
                  myT.args[0].distance(myT.args[2])
                   ))
A=myT.args[2]
B=myT.args[0]
C=myT.args[1]
H=myT.orthocenter
# ans=solve(Eq(H-A,u*(B-A)+v*(C-A)),[u,v])
print("# ",solve([Eq(H.x-A.x,u*(B.x-A.x)+v*(C.x-A.x)),
                  Eq(H.y-A.y,u*(B.y-A.y)+v*(C.y-A.y))],[u,v])
     )
#  {u: 1/6, v: 5/9}
############################################################################
# 計算追加(直線の交点計算)作図のため
D=Line(C,H).intersection(Line(A,B))[0]
E=Line(B,H).intersection(Line(C,A))[0]
############################################################################
# 3D作図 z=0 XY平面に作図しました。
def myXYZ2Txt_2D(A):
    return '(' + str(A.x) + ',' + str(A.y) +  ')'
    #return ""
def myTxtXYZ_2D(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=0.0
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.4 mm'
    return
def myTxtXYZ_S_2D(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_2D(xy_tx[2*i-2]) )
    return
def myLine_2D(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),0.0
    Bx,By,Bz=float(B.x),float(B.y),0.0
    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_C_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    myLine_2D(args[i],args[0])
    return
#######################################################################################
myLine_C_2D  ( A,B,C )
myLine_2D    ( A,H )
myLine_2D    ( B,E )
myLine_2D    ( C,D )
myTxtXYZ_S_2D( A,"A",B,"B",C,"C" )
myTxtXYZ_S_2D( H,"H",D,"D",E,"E" )
#######################################################################################
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")

isometric方向?です。

0png.png

上空から?です。
角度寸法表示方法を勉強中。
AHの赤色は、マウス操作です。線の着色方法を勉強中
'Origin'は、操作で非表示です。
1png.png

sympyの実行環境

①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
??? タブレット環境で、コピー貼り付けが実行できませんでした。???

参考

以下、いつもの?おすすめです。

0
0
1

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?