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.

中高校生のみなさまへ。<1/2>「高校入試問題。円の難問2023千葉県数学3(3)」をsympyとFreeCADで作図しました。

Last updated at Posted at 2023-10-11

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。

みなさまへ

お忙しい中高校生の方には、ムダに?私の長文なので、
さらっと,<2/2>も見てもらえると助かります。

大人の方には、解答へのオススメの手順です。
①問題文だけを見て、さらっとわかるかも。
②問題文の前ページを見て。さらっとわかるかも
③qiitaの<1/2>本ページ内のリンクyoutubeを見て、確認されるかも。
④qiitaの<1/2>本ページを見て、変な事やって作図しているなあ。です。
⑤qiitaの<2/2>次ページを見て、類題過去問ありますか?

以上、くどくて、申し訳ありません。それでは、どうぞ。

問題文3(3)

ページP8の下半分です。

<URL
https://homepage1.canvas.ne.jp/ynaka/R5PDF/12chiba.pdf#page=12
12千葉県<●R5全問<数学苦手な中学生,応援します
http://homepage1.canvas.ne.jp/ynaka/

解答3(3)

(0:00~5:43)

(47:25~55:00)

sympy風に(数学を数楽に 様の方法を参考に)

>相似が見えますよね。(数学を数楽に 様 3:15)
>90度。いっぱいあるよね。(東大合格請負人 様 48:31)
点Eに、直角(90度)が3つ、見えます。
>長さを求めなさい。中学校3年生です。三平方の定理と相似(1:50)
>半弦の弧に対する円周角(3:14)
>共通している部分があるよね(3:28)

プログラムは、次節です。
以下は,大人も小人もマネしないで下さい。
以下は、プログラムでは、ありません。数学を数楽に 様のyoutubeを転写です。

# 以下は,大人も小人もマネしないで下さい。プログラムではありません。。
# 右端の #(xx.xx) は、数学を数楽に 様のyoutubeの時間です。
from sympy import *
var('AB'           ,real=True,positive=True)
var('BF'           ,real=True,positive=True)
var('degBEC,degBEF',real=True,positive=True)
var('degCEF,degAEB',real=True,positive=True)
var('degFEC,degDEC',real=True,positive=True)
var('degDBC'       ,real=True,positive=True)
var('maru,batu'    ,real=True,positive=True)
var('x'            ,real=True,positive=True)
(EG,GF)        =(1,2)   ;print("# EG,GF        =",EG,GF)            #(0:35)
(degAEF,degEAF)=(90,30) ;print("# degAEF,degAEF=",degAEF,degEAF)    #(0:35)
# 
EF=EG+GF                         ;print("# EF=",EF  )               #(0:40)
AE=EF*sqrt(3)                    ;print("# AE=",AE  )               #(1:06)
AF=EF*2                          ;print("# AF=",AF  )               #(1:10)
eq01=Eq(AB,AF-BF)                ;print("# 01" ,eq01)               #(1:16)
eq02=Eq(degBEC,90)               ;print("# 02" ,eq02)               #(1:54)
eq03=Eq(degBEF,maru)             ;print("# 03" ,eq03)               #(2:04)
eq04=Eq(degAEB,batu)             ;print("# 04" ,eq04)               #(2:08)
eq05=Eq(maru+batu,90)            ;print("# 05" ,eq05)               #(2:09)
# 
eq06=Eq(degBEF+degFEC,90)        ;print("# 06" ,eq06)               #(2:15)
eq07=Eq(eq03.rhs+degCEF,eq05.lhs);print("# 07" ,eq07)               #(2:15)
degCEF=solve(eq07,degCEF)[0]     ;print("#   ∠CEF",degCEF)         #(2:16)
# 
eq08=Eq(degCEF+degDEC,90)        ;print("# 08" ,eq08)               #(2:28)
degDEC=solve( eq08.lhs-eq05.lhs,degDEC)[0] \
                                 ;print("#   ∠DEC",degDEC)          #(2:30)
# 
eq09=Eq(degDEC,degDBC)           ;print("# 09" ,eq09)               #(2:40)      
degDBC=solve( eq09,degDBC)[0]    ;print("#   ∠DBC",degDBC)          #(2:40)
# △EBFに注目
eq10=Eq(degDEC,degDBC)           ;print("# 10"     ,eq10)           #(3:10) 
# △EFB∽△BFG
eq11=Eq(BF,x)                    ;print("# 11"     ,eq11)           #(3:10)
eq12=Eq(EF/x,x/GF)               ;print("# 12"     ,eq12)           #(4:17)
ans=solve(eq12)[0]               ;print("#    BF=" ,ans )           #(4:20)
AB=solve(eq01)[0][AB]            ;print("#    AB=" ,AB  )           #(4:30)
AB=AB.subs({BF:ans})             ;print("#    AB=" ,AB  )           #(4:44)
# EG,GF        = 1 2
# degAEF,degAEF= 90 30
# EF= 3
# AE= 3*sqrt(3)
# AF= 6
# 01 Eq(AB, 6 - BF)
# 02 Eq(degBEC, 90)
# 03 Eq(degBEF, maru)
# 04 Eq(degAEB, batu)
# 05 Eq(batu + maru, 90)
# 06 Eq(degBEF + degFEC, 90)
# 07 Eq(degCEF + maru, batu + maru)
#   ∠CEF batu
# 08 Eq(batu + degDEC, 90)
#   ∠DEC maru
# 09 Eq(maru, degDBC)
#   ∠DBC maru
# 10 True
# 11 Eq(BF, x)
# 12 Eq(3/x, x/2)
#    BF= sqrt(6)
#    AB= 6 - BF
#    AB= 6 - sqrt(6)

sympyで(いつものスタイルで)

・求める値は、ABの長さ円の半径です。solveで連立方程式です。
・全点座標計算を目標です。具体的な値は、次節のFreecad作図でしました。
・角度チェック計算を追加しました。∠FBGと∠BEFの角度です。

from sympy import *
var('AB,r',real=True,positive=True)
A=Point(0   ,0)
B=Point(AB  ,0)
F=Point(6   ,0)
O=Point(AB+r,0)
E=Point(3/2*sqrt(3)*sqrt(3),3/2*sqrt(3))
G=E+Rational(1,3)*(F-E)
D=Line(A,E).intersection(Line(B,G))[0]
ABr=solve( [Eq(O.distance(E),r),Eq(O.distance(D),r) ],[AB,r] )
print("#",sqrtdenest(ABr[0][0]),",",ABr[0][1])
# 6 - sqrt(6) , 3/5 + 7*sqrt(6)/5

print() #角度チェック計算
mySubs={AB:sqrtdenest(ABr[0][0]),r:ABr[0][1]}
O=O.subs(mySubs)
B=B.subs(mySubs)
C=(O+Point(2*r,0)).subs(mySubs)
D=D.subs(mySubs)
FBG=Line(B,F).angle_between(Line(B,G))
BEF=Line(E,B).angle_between(Line(E,F))
print("#",float(FBG*180/pi),FBG)
print("#",float(BEF*180/pi),BEF)
# 50.07527421903285 acos((-1 + sqrt(6))/sqrt((1 - sqrt(6))**2 + 3))
# 50.07527421903285 acos((9 - 3*sqrt(6)/2)/(3*sqrt((-3/2 + sqrt(6))**2 + 27/4)))

(参考)上のプログラムで使用した関数のDOCの抜粋

・sqrtdenest関数を使うと思いませんでした。???ソレナリ の計算みたいです。???
・The intersection with another geometrical entity.
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.LinearEntity.intersection
・sympy.simplify.sqrtdenest.sqrtdenest(expr, max_iter=3)
https://docs.sympy.org/latest/modules/simplify/simplify.html#sympy.simplify.sqrtdenest.sqrtdenest
・angle_between(l2)
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.LinearEntity.angle_between

FreeCADのマクロで作図

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
・マクロプログラムの計算部分は、上記をそのままコピーしています。
・マクロプログラムの途中で、
 全点座標計算をしています。作図用でABの長さと円の半径を代入しています。
・点Aを、原点のままです。
 点Oを原点にすると、座標値が複雑?になるので移動はしていません。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
var('AB,r',real=True,positive=True)
A=Point(0   ,0)
B=Point(AB  ,0)
F=Point(6   ,0)
O=Point(AB+r,0)
E=Point(3/2*sqrt(3)*sqrt(3),3/2*sqrt(3))
G=E+Rational(1,3)*(F-E)
D=Line(A,E).intersection(Line(B,G))[0]
ABr=solve( [Eq(O.distance(E),r),Eq(O.distance(D),r) ],[AB,r] )
print("#",sqrtdenest(ABr[0][0]),",",ABr[0][1])
############################################################################
# 作図用
mySubs={AB:sqrtdenest(ABr[0][0]),r:ABr[0][1]}
O=O.subs(mySubs)
B=B.subs(mySubs)
C=(O+Point(2*r,0)).subs(mySubs)
D=D.subs(mySubs)
#
ci=Circle(O,O.distance(B))
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
############################################################################
# 円の作図 FrecCADのdocより
# https://wiki.freecad.org/Macro_Circle
def Freecad3D_circle(x=0.0,y=0.0,z=0.0,radius=0.0,diameter=0.0,circumference=0.0,area=0.0,startangle=0.0,endangle=0.0,arc=0.0,anglecenter=0.0,cord=0.0,arrow=0.0,center=0,placemObject=""):
    from math import sqrt, pi
    if placemObject == "":
        pl = FreeCAD.Placement()
        pl.Rotation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()   
        pl.Base = FreeCAD.Vector(x,y,z)
    else:
        pl = FreeCAD.Placement()
        pl = placemObject                                  # placement imposted
    if diameter != 0:                                      # with diameter
        radius = diameter / 2.0
    elif circumference != 0:                               # with circumference
        radius = (circumference / pi) / 2.0
    elif area != 0:                                        # with area
        radius =  sqrt((area / pi))
    elif (cord != 0) and (arrow != 0):                     # with cord and arrow
        radius = ((arrow**2) + (cord**2) / 4.0) / (arrow*2) 
    elif (arc != 0) and (anglecenter != 0):                # with arc and anglecenter central in degrees
        radius = ((360/anglecenter)*arc) / pi/2.0
        if endangle != 0:
            startangle  = endangle - anglecenter
        endangle   = anglecenter + startangle
        startangle  = endangle - anglecenter
    if radius != 0:
        try:
            Draft.makeCircle(radius,placement=pl,face=False,startangle=startangle,endangle=endangle,support=None)
            if center != 0:
                x=pl.Base.x
                y=pl.Base.y
                z=pl.Base.z
                Draft.makePoint(x,y,z)
        except Exception:
            App.Console.PrintError("Unexpected keyword argument" + "\n")
        App.ActiveDocument.recompute()
    else:
        App.Console.PrintMessage("Unexpected keyword argument" + "\n")
        App.Console.PrintMessage("circle(x,y,z,radius,diameter,circumference,area,startangle,endangle,[arc,anglecenter],[cord,arrow],center,placemObject)" + "\n")
        App.Console.PrintMessage("circle(radius=10.0,placemObject=App.Placement(App.Vector(11,20,30), App.Rotation(30,40,0), App.Vector(0,0,0)))" + "\n")
    return
def myCircle_2D(myCi):
    x=myCi.center.x
    y=myCi.center.y
    r=myCi.radius
    Freecad3D_circle(
           x=float(x),y=float(y),z=0.0,
           radius=float(abs(r)),
           center=1,
           placemObject=App.Placement(App.Vector(float(x),float(y),0),
           App.Rotation(0,0,0),App.Vector(0,0,0)))
    return
############################################################################
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_S_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    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
#######################################################################################
myCircle_2D  ( ci )
myLine_C_2D  ( A,C,D )
myLine_S_2D  ( B,E )
myLine_S_2D  ( B,D )
myLine_S_2D  ( E,F )
myLine_S_2D  ( E,C )
myTxtXYZ_S_2D( O,"O",A,"A",B,"B",C,"C")
myTxtXYZ_S_2D( D,"D",E,"E",F,"F",G,"G" )
#######################################################################################
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

・上空から?です。Originは、CAD操作で非表示です。
1png.png

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

(テンプレート)

お疲れ様です。

ここまで来て、
④qiitaの<1/2>本ページを見て、変な事やって作図しているなあ。 です。
と、思われたと思います。

<2/2>へ続く

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?