0
0

More than 1 year has passed since last update.

tan((x+y)/2)の値「2023山口大学後期理学部物理情報科,化,生物学科【1】」をChatGPTとMathematicaとWolframAlphaとsympyでやってみたい。

Last updated at Posted at 2023-07-24

(2)について。出題者のやさしさ?がでている問題文でした。    
・勉強不足の人のためには、WolframAlphaの解説あり。
・オーソドックスな解法の勉強をしている優秀な受験生には、
 正弦定理の隣の?正接定理がありました。
 ?>ただ,全く役に立たないので高校数学では習いません。(高校数学の美しい物語)様参考より

(1)がわからなくても(2)で部分点がもらえるかも。
○○場の馬鹿力で、試験場で気づいた方がおられたかもしれません。
種明かしは、ページ終盤にあり。

オリジナル T氏の数学日記 様より

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

xxxx ChatGPT で(できませんでした。) xxx

入力文

x,yを実数とする.
sin(x)+sin(y)=(1+sqrt(3))/2,cos(x)+cos(y)=(-1+sqrt(3))/2
の時、tan((x+y)/2)の値を求めなさい.

...最終的に、tan((x + y)/2) の値を求めることができます。ただし、この式を解析的に解くことは難しいので、数値的な方法を用いる必要があります。

Mathematicaで

最近、Mathematicaの良さが、わかりつつあります。
≒起動方法の参考あり。以下の無料正式技あり。いつかやってみたい。
https://qiita.com/AKKYM/items/3517bd1b55522f4bfacd#mathematica

???結果の使い方を教えて下さい。???
https://reference.wolfram.com/language/tutorial/BuildingUpCalculations.html.ja

(1)αとβの順番が調子悪いです。

In
TrigExpand[Sin[\[Alpha] + \[Beta]] + Sin[\[Alpha] - \[Beta]]]

Out
2 Cos[\[Beta]] Sin[\[Alpha]]

(2)

In
Solve[{Sin[x] + Sin[y] == (1 + Sqrt[3])/2,
  Cos[x] + Cos[y] == (-1 + Sqrt[3])/2},
            {x, y}]
Tan[(\[Pi]/6 + (2 \[Pi])/3)/2]
Tan[((2 \[Pi])/3 + \[Pi]/6)/2]

Out
(一部省略)
2 + Sqrt[3]
2 + Sqrt[3]

sympyで(1)のみ(T氏の数学日記 様のやり方)

TR10 普通の?加法定理
>TR10() - separate sin-cos arguments
https://docs.sympy.org/latest/modules/simplify/fu.html#sympy.simplify.fu.TR10
・分割不要でした。+で,連結してできました。
・最初のヤツが2個あって2倍、後ろのヤツが消える。でした。

from sympy import *
from sympy.simplify.fu import TR10
α,β=symbols('α,β',real=True)
f1=sin(α+β)
f2=sin(α-β)
print("#(1)","  ",     f1 ," "*19, "+ " ,     f2     )
print("#(1)","=(",TR10(f1),        ")+(",TR10(f2),")")
print("#(1)","= ",TR10(f1)           +   TR10(f2)    )
print("#(1)","  ",TR10(f1+f2)                        )
#(1)    sin(α + β)                     +  sin(α - β)
#(1) =( sin(α)*cos(β) + sin(β)*cos(α) )+( sin(α)*cos(β) - sin(β)*cos(α) )
#(1) =  2*sin(α)*cos(β)
#(1)    2*sin(α)*cos(β)

sympyで(1)のみ(回転行列を使って)

上と同じ。sinは、行列の2行目1列目(sympy行列の配列位置は、[1,0]に該当します。)

WolframAlphaで。(2)のみ(出題者のやさしさ?がでている問題)

数字1,√3,2 怪しいデスね。
対照式? x,y 又はy,x の2パターン。割る2は、平均?

厳密な結果 2+sqrt(3)

(リンクだけです)「15° 角度」を調べてみたい。ChatGPT様へ 証明は、勉強中です。

FreeCADで作図

半径2の円を、3次元FreeCADのマクロで、XY平面上に作図しました。
isometric方向?です。

0png.png

上空から?です。120°と30°の線です。75°の線は、まだです。
sin(x)+sin(y)=( 1+sqrt(3))/2 → =(sqrt(3)+1)/2
cos(x)+cos(y)=(-1+sqrt(3))/2
角度寸法表示の操作方法をChatGPTに問い合わせ必要です。

1png.png

FreeCADのマクロです。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from  sympy import *
############################################################################
# 作図
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
#############################################################
# 円の作図 FrecCADのdocより
# https://wiki.freecad.org/Macro_Circle
def 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(x,y,r):
    circle(x=float(x),y=float(y),z=0.0,
           radius=float(r),
           center=1,
           placemObject=App.Placement(App.Vector(float(x),float(y),0),
           App.Rotation(0,0,0),App.Vector(0,0,0)))
    return
#############################################################
O =Point(0.0,0.0)
X1=Point(-2.5,0.0)
X2=Point( 2.5,0.0)
Y1=Point(0.0,-2.5)
Y2=Point(0.0, 2.5)
myLine_2D(X1,X2)
myLine_2D(Y1,Y2)
myCircle_2D( 0.0,0.0,2.0 )
P1=Point(-2.0,0.0)
P2=Point( 0.0,2.0)
myTxtXYZ_S_2D(P1,"",P2,"")
#
A1=Point(-1.0,sqrt(3))
A2=Point(-1.0,0.0    )
myLine_C_2D(O,A1,A2)
B1=Point(sqrt(3),1.0 )
B2=Point(sqrt(3),0.0 )
myLine_C_2D(O,B1,B2)
myTxtXYZ_S_2D(O,"O")
myTxtXYZ_S_2D(A1,"",A2,"")
myTxtXYZ_S_2D(B1,"",B2,"")
#############################################################
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で(2)のみ(正弦定理の隣の?正接定理で)

今さら感。wikipediaで誰も?見た事のない公式を見つけました。
https://qiita.com/mrrclb48z/items/769cf5305ffd2d07e5a6
Tangent half-angle formula
/2をRational(1,2)にしています。/2、は*0.5になります。
これも、(1)を(2)のオモテで使っていません。

from sympy import *
x,y=symbols('x,y',real=True)
mySub  ={sin(x):Rational(1,2)*1      ,cos(x):Rational(1,2)*sqrt(3),
         sin(y):Rational(1,2)*sqrt(3),cos(y):Rational(1,2)*(-1)    }
myEqTan=Eq(tan((x+y)/2),(sin(x)+sin(y))/(cos(x)+cos(y)))
print("#(2)",mySub[sin(x)]+mySub[sin(y)],mySub[cos(x)]+mySub[cos(y)])
print("#(2)",myEqTan)
print("#(2)",myEqTan.subs(mySub).simplify())
#(2) 1/2 + sqrt(3)/2 -1/2 + sqrt(3)/2
#(2) Eq(tan(x/2 + y/2), (sin(x) + sin(y))/(cos(x) + cos(y)))
#(2) Eq(tan(x/2 + y/2), sqrt(3) + 2)

sympyで(2)のみ(T氏の数学日記 様のやり方)

①/②を実行しています。

from sympy import *
from sympy.simplify.fu import TR10
x,y=symbols('x,y',real=True)
α,β=symbols('α,β',real=True)
mySubs_sc={(sin(x)+sin(y)):(1+sqrt(3))/2,  (cos(x)+cos(y)):(-1+sqrt(3))/2}
myEq_αβ  =Eq(sin(α)*cos(β),Rational(1,2)*(sin(α+β)+sin(α-β)))
mySubs_αβ={α:(x+y)/2,β:(x-y)/2}
myEq2    =myEq_αβ.subs(mySubs_αβ)
maru1    =Eq(myEq2.lhs,factor(myEq2.rhs).subs(mySubs_sc))
print("# ①",maru1)
cc=cos(α+β)+cos(α-β)
myEq_αβ  =Eq(TR10(cc)/2,cc/2)
myEq2    =myEq_αβ.subs(mySubs_αβ)
maru2   =Eq(myEq2.lhs,factor(myEq2.rhs).subs(mySubs_sc))
print("# ②",maru2)
print("#",Eq(maru1.lhs/maru2.lhs,maru1.rhs/maru2.rhs).simplify())
# ① Eq(sin(x/2 + y/2)*cos(x/2 - y/2), 1/4 + sqrt(3)/4)
# ② Eq(cos(x/2 - y/2)*cos(x/2 + y/2), -1/4 + sqrt(3)/4)
# Eq(tan(x/2 + y/2), sqrt(3) + 2)

sympyで(2)のみ(TR2を使って 分母と分子に分けて)

TR2() - tan-cot to sin-cos ratio
https://docs.sympy.org/latest/modules/simplify/fu.html#sympy.simplify.fu.TR2

from sympy import *
from sympy.simplify.fu import TR2
x,y=symbols('x,y',real=True)
α,β=symbols('α,β',real=True)
mySubs={sin((x+y)/2):(1+sqrt(3))/2, cos((x+y)/2):(-1+sqrt(3))/2}
f=tan((x+y)/2)
print("#",f)                                                                                       
Bunsi1Bunbo1=TR2(f)
Bunsi1=numer(Bunsi1Bunbo1)
Bunbo1=denom(Bunsi1Bunbo1)
Bunsi2=Bunsi1.subs(mySubs)
Bunbo2=Bunbo1.subs(mySubs)
Bunsi2Bunbo2=Bunsi2/Bunbo2
print("#",Bunsi1,Bunbo1)
print("#",Bunsi2,Bunbo2)
print("#",Bunsi2Bunbo2.simplify() )
# tan(x/2 + y/2)
# sin(x/2 + y/2) cos(x/2 + y/2)
# 1/2 + sqrt(3)/2 -1/2 + sqrt(3)/2
# sqrt(3) + 2

sympyで(2)のみ(TR2を使って,分母と分子にわける必要はありませんでした。)

subsとsymplify()でいけました。

from sympy import *
from sympy.simplify.fu import TR2
x,y=symbols('x,y',real=True)
α,β=symbols('α,β',real=True)
mySubs={sin((x+y)/2):(1+sqrt(3))/2, cos((x+y)/2):(-1+sqrt(3))/2}
f=tan((x+y)/2)
print("#",    f                                                                                       )
print("#",TR2(f           )                                                                           )
print("#",TR2(f           ).subs( mySubs                                                  ).simplify())
print("#",TR2(tan((x+y)/2)).subs({sin((x+y)/2):(1+sqrt(3))/2, cos((x+y)/2):(-1+sqrt(3))/2}).simplify())
# tan(x/2 + y/2)
# sin(x/2 + y/2)/cos(x/2 + y/2)
# sqrt(3) + 2
# sqrt(3) + 2

sympyで(2)のみ(x,yの連立方程式を使って)

種明かし。 実は、(1)がわからなくて、最初にやったのが以下の(2)の連立方程式です。
x,yを求めてからtanに代入しようとしたら,あれ?解が2つ。75°。

from sympy import *
x,y=symbols('x,y',Real=True)
def Rad_Deg(myRad):
    return myRad*180/pi
ans=solve([Eq(sin(x)+sin(y),( 1+sqrt(3))/2),
           Eq(cos(x)+cos(y),(-1+sqrt(3))/2)
          ],[x,y])
print("#",Rad_Deg(ans[0][0]),Rad_Deg(ans[0][1]),Rad_Deg((ans[0][0]+ans[0][1])/2) )
print("#",Rad_Deg(ans[1][0]),Rad_Deg(ans[1][1]),Rad_Deg((ans[1][0]+ans[1][1])/2) )
print("#",tan((x+y)/2).subs({x:ans[0][0],y:ans[0][1]}))
print("#",tan((x+y)/2).subs({x:ans[1][0],y:ans[1][1]}))
# 30 120 75
# 120 30 75
# sqrt(3) + 2
# sqrt(3) + 2

sympyの実行環境

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

感想

・おすすめの過去問の類題を教えて下さい。
 「(1)は、わからないけど、(2)ならわかる。」です。
 例えば、共通テスト2022自転車君の問題以来?。またかの,ゆうどうです。
・優秀な受験生さんには、点検用だよね。
 試験時間内に「自信が確信に変わりました」?でしょうか。

・今から、赤本が楽しみです。いつの日か、赤本ChatGPTも。

・2023/07/24現在、数少ない中の一番勉強した問題。2023年度、私のNO.1です。
 >この三角関数の加法定理から派生する20個近くの公式たち..
 あといくつあるか、わかっていません。勉強中。

参考

> =2+√3

>2023 数学I・II・A・B入試問題集(文理系)
当問題が載っていなかったと思います。

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

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