・中学生の力でも? です。
・(再かも)ページ最後にリンクあります。
オリジナル
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図のみ出力して下さい。角度と距離を表示して下さい
(ソースコードの表示を省略)
・イロイロやった結果です。
いつもの? 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内で
