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?

Heaviside関数を使って?3つの頂点が動点の三角形の面積計算「昨年の2023 早稲田大学 教育学部【1】(4)」をsympyと作図をやってみたい。

Last updated at Posted at 2024-02-17

公式ホームページ
https://www.waseda.jp/inst/admission/assets/uploads/2023/04/15_2023_ippan_sugaku.pdf#page=3
>Admissions Center
https://www.waseda.jp/inst/admission/other/2022/11/22/12919/

小学6年生のタツ郎先生が、
この問題は小学5年生レベルだネ。
最大面積計算は、1行の掛け算割り算だネ。と
おっしゃっておられますけど。
私には、コイツ?この方は間違っていると思います。
(小学6年生のタツ郎先生は、三平方の定理は知らないはずです。相似も。
もちろん、2次関数も知らないはずです。)
>5年生「三角形・−」の面積、

皆さんは、どう思われますか?
2024-02-18追加

小学6年生のタツ郎先生のご紹介
(大学入試数学問題集成 様掲示板内で登場済み 24年 共通テ 本試験 I 3-2・IA 2-1 2次関数の応用問題)

解答をありがとうございました。

めぐろ塾 様より
スクロールして下さい。ジャンプしていません。

>早稲田教育の小問集合独特の「絶対論証ムリ系問題」
>厳密にやるなら、「底辺を固定したとき、高さが最大となるのは残りの点が三角形の頂点にあるとき」って予選決勝法的解法かな~。

3x4÷2÷5x4÷2x4÷2=24/5=4.8
3*4/2/5*4/2*4/2=24/5=4.8
最初の行がわかりやすかも。

パイソニスタの方へ

・plotのループの方法について、おすすめのサイトを教えて下さい。
・4.19999999999999 がでています。(作業中)分数で。

オリジナル

2023 早稲田大学 教育学部【1】(4) < 河合塾
https://kaisoku.kawai-juku.ac.jp/nyushi/honshi/23/w03-21a.pdf#page=6
https://kaisoku.kawai-juku.ac.jp/nyushi/honshi/23/w03.html

大学入試数学問題集成 様>テキスト 【1】(4)

sympyで(Heaviside関数を使わなくても)

・全部で9通りやっています。
・プログラムは、つまみ食いです。申し訳ありません。
 https://www.deepl.com/ja/translator#ja/つまみ食いです。
 https://www.deepl.com/ja/translator#ja/ちゃんとやれよ。です。
A parameterized point on the polygon. にしました。
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Polygon.arbitrary_point
・2(1)次曲線で、両端点とその中点を通るように、3点で補間? しています。
・ver0.1

# ver0.1
# [0, 1.5, 2.0, 2.5, 5.5, 7.0, 9.5, 10.0, 10.5, 12] 10
from sympy import *
t,myT,l    =symbols('t myT l'  ,real=True)
x,y,a,b,c  =symbols('x y a b c',real=True)
x1,y1,x2,y2=symbols('x1,y1,x2,y2',real=True)
def myPtTr(myTr,l):
    return myTr.arbitrary_point('t').subs(t,l/myTr.perimeter)
def my2jikyokusen_sten(myTr,st,en):
    mi  =(st+en)/2
    myA1=Triangle(myPtTr(myTr,1.5+st),myPtTr(myTr,5.0+st),myPtTr(myTr,9.5+st)).area
    myA2=Triangle(myPtTr(myTr,1.5+mi),myPtTr(myTr,5.0+mi),myPtTr(myTr,9.5+mi)).area
    myA3=Triangle(myPtTr(myTr,1.5+en),myPtTr(myTr,5.0+en),myPtTr(myTr,9.5+en)).area
    return my2jikyokusen(st,myA1,mi,myA2,en,myA3)  
def my2jikyokusen(x1,y1,x2,y2,x3,y3):
    sol=solve( [Eq(a*x1**2+b*x1+c,y1),Eq(a*x2**2+b*x2+c,y2),Eq(a*x3**2+b*x3+c,y3) ],[a,b,c])
    return sol[a] *t**2+sol[b]*t+sol[c]   
myTr=Polygon((0, 3),(0, 0),(4, 0), (0, 3),(0, 0),(4, 0))
y1=my2jikyokusen_sten(myTr, 0.0, 1.5)
y2=my2jikyokusen_sten(myTr, 1.5, 2.0) 
y3=my2jikyokusen_sten(myTr, 2.0, 2.5) 
y4=my2jikyokusen_sten(myTr, 2.5, 5.5) 
y5=my2jikyokusen_sten(myTr, 5.5, 7.0) 
y6=my2jikyokusen_sten(myTr, 7.0, 9.5) 
y7=my2jikyokusen_sten(myTr, 9.5,10.0) 
y8=my2jikyokusen_sten(myTr,10.0,10.5) 
y9=my2jikyokusen_sten(myTr,10.5,12.0) 
# 
print("# ",max(maximum(y1,t,Interval( 0.0, 1.5)), 
               maximum(y2,t,Interval( 1.5, 2.0)), 
               maximum(y3,t,Interval( 2.0, 2.5)), 
               maximum(y4,t,Interval( 2.5, 5.5)), 
               maximum(y5,t,Interval( 5.5, 7.0)), 
               maximum(y6,t,Interval( 7.0, 9.5)), 
               maximum(y7,t,Interval( 9.5,10.0)), 
               maximum(y8,t,Interval(10.0,10.5)), 
               maximum(y9,t,Interval(10.5,12.0)), 
              )) 
# 作図(グラフ)-------------------------------------------
from sympy.plotting import plot
p0=plot(0,4.8,(t,0,12),aspect_ratio=(1.0,1.0),show=False)
p1=plot(y1,(t, 0.0, 1.5),show=False)
p2=plot(y2,(t, 1.5, 2.0),show=False) 
p3=plot(y3,(t, 2.0, 2.5),show=False) 
p4=plot(y4,(t, 2.5, 5.5),show=False) 
p5=plot(y5,(t, 5.5, 7.0),show=False) 
p6=plot(y6,(t, 7.0, 9.5),show=False) 
p7=plot(y7,(t, 9.5,10.0),show=False) 
p8=plot(y8,(t,10.0,10.5),show=False) 
p9=plot(y9,(t,10.5,12.0),show=False) 
p0.extend(p1)
p0.extend(p2)
p0.extend(p3)
p0.extend(p4)
p0.extend(p5)
p0.extend(p6)
p0.extend(p7)
p0.extend(p8)
p0.extend(p9)
p0.show()
# 作図(最大値の時刻)-------------------------------
print("# 1",    maximum(y1,t,Interval( 0.0, 1.5)) )  
print("# 2",    maximum(y2,t,Interval( 1.5, 2.0)) ) 
print("# 3",    maximum(y3,t,Interval( 2.0, 2.5)) ) 
print("# 4",    maximum(y4,t,Interval( 2.5, 5.5)) )
print("# 5",    maximum(y5,t,Interval( 5.5, 7.0)) ) 
print("# 6",    maximum(y6,t,Interval( 7.0, 9.5)) ) 
print("# 7",    maximum(y7,t,Interval( 9.5,10.0)) ) 
print("# 8",    maximum(y8,t,Interval(10.0,10.5)) ) 
print("# 9",    maximum(y9,t,Interval(10.5,12.0)) ) 
sol=solveset(Eq(y8,maximum(y8,t,Interval(10.0,10.5))),t,Interval(10.0,10.5) ).args[0] ;print("# sol ",sol)  
ptA=myPtTr(myTr,1.5+t).subs({t:sol}) ;print("# ptA ",ptA)
ptB=myPtTr(myTr,5.0+t).subs({t:sol}) ;print("# ptB ",ptB)
ptC=myPtTr(myTr,9.5+t).subs({t:sol}) ;print("# ptC ",ptC)   
def myPlotPtPt(pt1,pt2):
    return plot(pt1.y+(pt2.y-pt1.y)/(pt2.x-pt1.x)*(x-pt1.x),(x, pt1.x, pt2.x),show=False) 
pL4=plot(0,(t,0,4),aspect_ratio=(1.0,1.0),show=False)
pL5=myPlotPtPt(myTr.args[0],myTr.args[2])
pAB=myPlotPtPt(ptA,ptB)
pBC=myPlotPtPt(ptB,ptC)
pCA=myPlotPtPt(ptC,ptA)
pL4.extend(pAB)
pL4.extend(pL5)
pL4.extend(pBC)
pL4.extend(pCA)
pL4.show()
#  4.80000000000000
# 1 4.20000000000000
# 2 4.72500000000000
# 3 4.72500000000000
# 4 4.19999999999999
# 5 4.20000000000000
# 6 4.00000000000000
# 7 4.80000000000000
# 8 4.80000000000000
# 9 4.19999999999999
# sol  10.0000000000000
# ptA  Point2D(2/5, 27/10)
# ptB  Point2D(0, 0)
# ptC  Point2D(18/5, 3/10)
# 私のパソコンです。
# [Done] exited with code=0 in 150.183 seconds

作図

・sympyのplot moduleで
・線の色の指定をしていません。自動的です。

1Figure_1.png

2Figure_1.png

作図(FreeCADで)

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

2f.png

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算省略   
from sympy import *
ptA =Point2D(2/5, 27/10)
ptB =Point2D(0, 0)
ptC =Point2D(18/5, 3/10)
pt40=Point2D(4, 0)
pt03=Point2D(0, 3)
############################################################################
# 作図用
############################################################################
# 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.3 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  ( ptA,ptB,ptC )
myTxtXYZ_S_2D( ptA,"A",ptB,"B",ptC,"C" )
myLine_2D    ( pt40,pt03 )
myTxtXYZ_S_2D( pt40,"",pt03,"" )
#######################################################################################
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")

sympyで(Heaviside関数を使って)

・???Heaviside関数のmaximumは、無理かも。
・ver0.1

# ver0.1
from sympy import *
var('t',real=True,positive=True)
def myTimePQR(P,Q,R ,S):
    myInputA=[0,0+3/2,0+3/2+4,0+3/2+4+5,12]      #;print("#",myInputA,len(myInputA)  ) 
    myInputB=[0,0+4/2,0+4/2+5,0+4/2+5+3,12]      #;print("#",myInputB,len(myInputB)  )
    myInputC=[0,0+5/2,0+5/2+3,0+5/2+3+4,12]      #;print("#",myInputC,len(myInputC)  )
    myInputD= sorted(myInputA+myInputB+myInputC) #;print("#",myInputD,len(myInputD)  )
    myInputD= list( dict.fromkeys(myInputD))      ;print("#",myInputD,len(myInputD)  )    
    return 0
P  =Point(0, 3)
Q  =Point(0, 0)
R  =Point(4, 0)
# 
VPQ=Point(0,-1)
VQR=Point(1, 0)
VRP=(P-R)/R.distance(P) 
# 
myTimePQR(P,Q,R ,S) 
myTr_00t0=Triangle( P+VPQ*(1.5+ t), Q+VQR*(2.0+ t), R+VRP*(2.5+ t))   
myTr_01t5=Triangle( Q+VQR*(t- 1.5), Q+VQR*(2.0+ t), R+VRP*(2.5+ t))     
myTr_02t0=Triangle( Q+VQR*(t- 1.5), R+VRP*(t- 2.0), R+VRP*(2.5+ t)) 
myTr_02t5=Triangle( Q+VQR*(t- 1.5), R+VRP*(t- 2.0), P+VPQ*(t- 2.5))
# myTr_05t5=Triangle( R+VRP*(t- 5.5           ), R+VRP*(t- 2.0), Q+VQR*(t- 5.5))
myTr_05t5  =Triangle( R+VRP*(t- Rational(11,2)), R+VRP*(t- 2  ), Q+VQR*(t- 5.5))
myTr_07t0=Triangle( R+VRP*(t- 5.5), P+VPQ*(t- 7  ), Q+VQR*(t- 5.5))
# myTr_09t5=Triangle( R+VRP*(t- 5.5), P+VPQ*(t- 7.0), R+VRP*(t- 9.5           ))
myTr_09t5  =Triangle( R+VRP*(t- 5.5), P+VPQ*(t- 7.0), R+VRP*(t- Rational(19,2)))
myTr_10t0=Triangle( R+VRP*(t- 5.5), Q+VQR*(t-10.0), R+VRP*(t- 9.5))
myTr_10t5=Triangle( P+VPQ*(t-10.5), Q+VQR*(t-10.0), R+VRP*(t- 9.5))  
# 
print("# ( 1.5)",Eq(myTr_00t0.subs({t: 1.5}),myTr_01t5.subs({t: 1.5})))
print("# ( 2.0)",Eq(myTr_01t5.subs({t: 2.0}),myTr_02t0.subs({t: 2.0})))
print("# ( 2.5)",Eq(myTr_02t0.subs({t: 2.5}),myTr_02t5.subs({t: 2.5})))
print("# ( 5.5)",Eq(myTr_02t5.subs({t: 5.5}),myTr_05t5.subs({t: 5.5}))) 
# print("# ( 7.0)",Eq(myTr_05t5.subs({t: 7.0}),myTr_07t0.subs({t: 7.0})))
print  ("# ( 7.0)",Eq(myTr_05t5.subs({t: 7  }),myTr_07t0.subs({t: 7   })))
print("# ( 9.5)",Eq(myTr_07t0.subs({t: 9.5}),myTr_09t5.subs({t: 9.5})))
print("# (10.0)",Eq(myTr_09t5.subs({t:10.0}),myTr_10t0.subs({t:10.0})))
print("# (10.5)",Eq(myTr_10t0.subs({t:10.5}),myTr_10t5.subs({t:10.5})))
print("# (12.0)",Eq(myTr_10t5.subs({t:12.0}),myTr_00t0.subs({t: 0.0})))
print()
print("# ",   maximum(myTr_00t0.area,t,Interval( 0.0, 1.5)), 
              maximum(myTr_01t5.area,t,Interval( 1.5, 2.0)), 
              maximum(myTr_02t0.area,t,Interval( 2.0, 2.5)), 
              maximum(myTr_02t5.area,t,Interval( 2.5, 5.5)), 
              maximum(myTr_05t5.area,t,Interval( 5.5, 7.0)), 
              maximum(myTr_07t0.area,t,Interval( 7.0, 9.5)), 
              maximum(myTr_09t5.area,t,Interval( 9.5,10.0)), 
              maximum(myTr_10t0.area,t,Interval(10.0,10.5)), 
              maximum(myTr_10t5.area,t,Interval(10.5,12.0)) 
             )
print()
print("# ",max(maximum(myTr_00t0.area,t,Interval( 0.0, 1.5)), 
               maximum(myTr_01t5.area,t,Interval( 1.5, 2.0)), 
               maximum(myTr_02t0.area,t,Interval( 2.0, 2.5)), 
               maximum(myTr_02t5.area,t,Interval( 2.5, 5.5)), 
               maximum(myTr_05t5.area,t,Interval( 5.5, 7.0)), 
               maximum(myTr_07t0.area,t,Interval( 7.0, 9.5)), 
               maximum(myTr_09t5.area,t,Interval( 9.5,10.0)), 
               maximum(myTr_10t0.area,t,Interval(10.0,10.5)), 
               maximum(myTr_10t5.area,t,Interval(10.5,12.0)) 
              ))
# [0, 1.5, 2.0, 2.5, 5.5, 7.0, 9.5, 10.0, 10.5, 12] 10
# ( 1.5) True
# ( 2.0) True
# ( 2.5) True
# ( 5.5) True
# ( 7.0) True
# ( 9.5) True
# (10.0) True
# (10.5) True
# (12.0) True

#  4.20000000000000 4.72500000000000 4.72500000000000 4.20000000000000 4.20000000000000 4.00000000000000 4.80000000000000 4.79999999999998 4.19999999999999

#  4.80000000000000

いつもの? 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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?