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

公式ホームページ
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次関数も知らないはずです。)
＞５年生「三角形・−」の面積、

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

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

# 解答をありがとうございました。
めぐろ塾 様より
スクロールして下さい。ジャンプしていません。

https://www.megurojyuku.com/2023%e6%97%a9%e7%a8%b2%e7%94%b0%e6%95%99%e8%82%b2%e3%80%90%e6%95%b0%e5%ad%a6%e3%80%91%e8%a7%a3%e7%ad%94%e9%80%9f%e5%a0%b1/

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

https://www.google.com/search?q=%E4%BA%88%E9%81%B8%E6%B1%BA%E5%8B%9D%E6%B3%95%E7%9A%84%E8%A7%A3%E6%B3%95&rlz=1CAUHAM_enJP1089&oq=%E4%BA%88%E9%81%B8%E6%B1%BA%E5%8B%9D%E6%B3%95%E7%9A%84%E8%A7%A3%E6%B3%95&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIKCAEQABiABBiiBDIKCAIQABiABBiiBDIKCAMQABiABBiiBDIKCAQQABiABBiiBDIKCAUQABiABBiiBNIBCDE4MDBqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8
```
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 早稲田大学 教育学部【１】(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

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

https://mathexamtest.web.fc2.com/2023/202313591/2023135910500mj.html#s-0503

# 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
```python
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/16190ac9-d47a-54d1-7bd3-8fded80808fb.png)

![2Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/6500becf-8933-89ad-6c2b-05b5f469d365.png)

# 作図(FreeCADで)
・問題文は2次元ですが、３次元FreeCADのマクロで、XY平面上に作図しました。
![1f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/62c7e064-9e36-af80-433b-69c28d5112ff.png)

![2f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/6dcef793-eb76-e906-e25e-0cc2d615b451.png)
```python
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
```python
# 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の実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

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

https://docs.sympy.org/latest/modules/geometry/points.html#sympy.geometry.point.Point.length

https://qiita.com/mrrclb48z/items/1f1ff31b0ec40d5916e9