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?

大人用です。正弦定理で面積計算「中学生の力で解いてください △ABCの面積は?」様を、計算はsympyで作図は手抜きのつもりでした。

0
Last updated at Posted at 2026-08-21

・中学生の力でも? です。
・(再かも)ページ最後にリンクあります。

オリジナル

YUUU0123 様 (0:00〜4:12) いつもお世話になっております。
↓中学生の力で解いてください △ABCの面積は?
https://youtu.be/uEJJrMLBI-c

いつものsympyで(オリジナル Youtbe様の方法を参考に)

ver0.1

・先生の丸写しです。図形の証明は省略です。

# ver0.1
from sympy import *
var('x,',real=True,positive=True)
S    =((2*x+sqrt(2)*x)*x/2).expand()               #;print(S)
x_sol=solve(Eq(x**2+(x+sqrt(2)*x)**2,2**2),x)[0]   #;print(x_sol)
print("#",S.subs({x:x_sol}).simplify())
# 1

ver0.2

・上と同じ。

# ver0.2
from sympy import *
var('x,',real=True,positive=True)
S    =((2*x+sqrt(2)*x)*x/2).expand()                                           #;print(S)
print("#",S.subs({x:solve(Eq(x**2+(x+sqrt(2)*x)**2,2**2),x)[0]}).simplify())
# 1

ver0.3

・Gemini先生? あと一歩です。together。いい方法があれば教えて下さい。

# ver0.3
from sympy import *
var('x,',real=True,positive=True)
degB,degC=45,22.5
AE    =x
BE    =AE
degEAC=90-degC                      #;print("#",degEAC)
EF    =x
AF   =sqrt(2)*x
FC   =AF
S    =(BE+EF+FC)*AE/2  

def expand_numerator_together(expr):
    """
    与えられた数式を通分し、共通分母を維持したまま分子を展開した形式を返します。
    """
    # 1. 通分する
    together_expr = together(expr)
    
    # 2. 分子と分母に分離する
    num, den = together_expr.as_numer_denom()
    
    # 3. 分子を展開する
    expanded_num = expand(num)
    
    # 4. evaluate=False で分数の項分解(自動分配)を防ぐ
    return Mul(expanded_num, Pow(den, -1), evaluate=False)
print("#",expand_numerator_together(S) )
# (sqrt(2)*x**2 + 2*x**2)*(1/2)
# 以下、続く

いつもの sympyで

ver1.1

・普通はコレ。Triangleのasaのarea

# ver1.1
from sympy import *
print("#",Triangle(asa=(22.5,2,(180-22.5-45))).area)
# 1

ver1.2

・上と同じ。

# ver1.2
from sympy import *
CA       =2
degB,degC=45,22.5
print("#",Triangle(asa=(degC,CA,(180-degC-degB))).area)
# 1

ver2.1

・怪しいデスネ。float にしたり。nsimplifyにしたり。
・正弦定理より導出される面積公式? を使用しているハズです。

# ver2.1
from sympy import *
# Degree(度数法)に直接対応した三角形面積計算プログラム
def triangle_area_two_angles_deg(
    angle1_deg, angle2_deg, side, side_type="between"
) -> Expr:
    """角度(degree)の2角と1辺から正弦定理を用いて三角形の面積を計算する関数"""
    # 1. floatが渡された場合は有理数(Rational)に変換して精度落ちを防ぐ
    a_sym = Rational(str(angle1_deg)) if isinstance(angle1_deg, float) else sympify(angle1_deg)
    b_sym = Rational(str(angle2_deg)) if isinstance(angle2_deg, float) else sympify(angle2_deg)
    side_sym = Rational(str(side)) if isinstance(side, float) else sympify(side)

    # 2. 数値入力時のバリデーション(2角の和が180度以上でないか)
    if a_sym.is_number and b_sym.is_number:
        a_val = float(a_sym)
        b_val = float(b_sym)
        if a_val <= 0 or b_val <= 0 or (a_val + b_val) >= 180:
            raise ValueError(
                "三角形の内角の和は180度未満である必要があります。"
            )

    # 3. ラジアン変換
    A = rad(a_sym)
    B = rad(b_sym)
    sin_C = sin(A + B)

    # 4. 指定された辺の位置に応じた面積計算
    if side_type == "between":
        area = (side_sym**2 * sin(A) * sin(B)) / (2 * sin_C)
    elif side_type == "opposite_1":
        area = (side_sym**2 * sin(B) * sin_C) / (2 * sin(A))
    elif side_type == "opposite_2":
        area = (side_sym**2 * sin(A) * sin_C) / (2 * sin(B))
    else:
        raise ValueError(
            "side_type は 'between', 'opposite_1', 'opposite_2' から指定してください。"
        )

    # 簡約化と有理数近似(nsimplify)で代数的整数にきれいにまとめる
    return nsimplify(simplify(area))


CA       =2
degB,degC=45,22.5
print("#",      triangle_area_two_angles_deg(degC, 180-degB-degC, CA, side_type='between'))
# 1

(続けて)ChatGPT先生へ

PNG図のみ出力して下さい。角度と距離を表示して下さい
(ソースコードの表示を省略)

・イロイロやった結果です。

image.png

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

sympyのweb上での実行方法

SymPy Live Shellで。
ソースコードの解説は、私よりGemini先生へのソースコードの丸投げがおすすめです。質問の追加はいくらでも。
モーダル対応?「実行して」。「作図して」「問題文章の丸投げ」いい時代です。

(テンプレート)

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

sympy のdoc

・いらないカモ。

ver0.1

ver0.2

ver0.3

ver1.1

ver1.2

ver2.1

・sympy.simplify.simplify.nsimplify(
expr,
constants=(),
tolerance=None,
full=False,
rational=None,
rational_conversion='base10',
)
https://docs.sympy.org/latest/modules/simplify/simplify.html#sympy.simplify.simplify.nsimplify

Qiita内で

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?