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?

(途中)2025 中部大学 様の数学の1問「四角形の面積の最小値」ChatGPT先生に聞きました。(その1/5) sympyで

0
Last updated at Posted at 2025-12-01

データ分析の上限に達しました。さらにご利用を続けるには無料の Plus をお試しください. もしくは、明日の 19:40 以降に制限がリセットされるまでお待ちください。

(本日は)待ちます。

(その1/5) 本ページ
(その2/5) scipyで
(その3/5) 81通り(=3^4)で。
(その4/5) 幾何的直感で。
(その5/5) ChatGPT先生のコードはどの組み合わせ。

・長文です。

オリジナル

PDF

数学①(経営情報・国際関係・人文学部)III < 前期入試A方式・B方式(2025年2月2日)
・問題文 ページの下の方
https://www.chubu.ac.jp/admissions/wp-content/uploads/sites/15/2025/07/03ab1-2025.pdf#page=4
・解答例
https://www.chubu.ac.jp/admissions/wp-content/uploads/sites/15/2025/07/03ab1-2025.pdf#page=132

・過去問題ダウンロード < 中部大学公式Webサイト
https://www.chubu.ac.jp/admissions/entrance-exams/questions/
https://www.chubu.ac.jp

(本日の)ChatGPT先生へ

問題文

・(PDFより)テキスト文です。いつものmathjaxを使っていません。(?私はわかっていない。)

III ABC において,BC = 7,AC = 5,∠A = 60◦ とする。このとき,次の問いに
答えよ。
(1) ABC を図示し,辺 AB の長さを求めよ。
(2) 辺 AC 上に点 D をとり,AD = x とする。辺 AB 上に EB = 2x となるように
点 E をとる。x の取り得る値の範囲を求めよ。
(3) 四角形 CDEB の面積を S(x) とする。x を用いて,S(x) を表せ。
(4) (2) で求めた範囲において,S(x) の最小値を求めよ。

回答抜粋
(4)...S(x)の最小値は S(2)=8√3 である。

座標図を教えて下さい。

image.png

角度と長さを追加して下さい。

(表示省略)

BCを水平にして下さい。

image.png

sympyで教えて下さい。print 文の(1),(2),(3),(4)でお願いします。

BC を水平にした座標配置を SymPy で計算して求める方法 を示します。
(数値ではなく SymPy による厳密計算 です。)

# ver0.1
# SymPyで(1)〜(4)を表示するコード(そのまま実行できます)
import sympy as sp
from sympy.geometry import Point, Polygon

# シンボル
x = sp.symbols('x', real=True)

# 点の設定(A=(0,0), B=(8,0), C は AC=5, ∠A=60°)
A = Point(0, 0)
B = Point(8, 0)
C = Point( sp.Rational(5)*sp.cos(sp.pi/3), sp.Rational(5)*sp.sin(sp.pi/3) )  # (5*cos60, 5*sin60)

# (1) AB の長さ
AB_len = A.distance(B).simplify()

# (2) x の取り得る範囲
# AD = x -> 0 <= x <= AC (=5)
# EB = 2x on AB (0 <= 2x <= AB=8) -> 0 <= x <= 4
range_x = sp.Interval(0,5).intersect(sp.Interval(0,4))

# (3) S(x):四角形 C-D-E-B の面積
t = x/5  # D は A + t*(C-A)
D = Point( A.x + t*(C.x - A.x), A.y + t*(C.y - A.y) )
E = Point(8 - 2*x, 0)  # EB = 2x -> AE = 8 - 2x
poly_CDEB = Polygon(C, D, E, B)
Sx = sp.simplify(poly_CDEB.area)  # 面積の式(x の式)

# (4) S(x) の最小値(区間 [0,4])
dSdx = sp.diff(Sx, x)
crit_points = sp.solve(sp.Eq(dSdx, 0), x)
# 区間内の実数解だけ選ぶ
crit_in_interval = [pt for pt in crit_points if pt.is_real and pt >= 0 and pt <= 4]
candidates = crit_in_interval + [sp.Integer(0), sp.Integer(4)]
values = [(pt, sp.simplify(Sx.subs(x, pt))) for pt in candidates]
# 数値で比較して最小を選ぶ
x_min, S_min = min(values, key=lambda item: float(item[1]))

# print 文(要求どおり (1),(2),(3),(4))
print("(1) AB の長さ = ", AB_len)
print("(2) x の取り得る値の範囲 = ", range_x)
print("(3) S(x) = ", sp.simplify(Sx))
print("(4) S(x) の最小値: x =", sp.simplify(x_min), ", S_min =", sp.simplify(S_min))
(1) AB の長さ =  8
(2) x の取り得る値の範囲 =  Interval(0, 4)
(3) S(x) =  sqrt(3)*(x*(x - 4) + 20)/2
(4) S(x) の最小値: x = 2 , S_min = 8*sqrt(3)

データ分析の上限に達しました。さらにご利用を続けるには無料の Plus をお試しください. もしくは、明日の 19:40 以降に制限がリセットされるまでお待ちください。

待ちます。

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
(その2) を先に投稿しました。勉強中。
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
単なる余弦定理の公式と思っていましたが、手こずっています。
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

S(x)のグラフを表示して下さい。

(回答抜粋)
image.png

最大値の位置

sympyで(解答例 を参考に)

・やっぱり楽したら、ダメかも。次ページの 3^4通りのどれかだといいです。

ver1.0

・余弦定理で

# ver 1.0
from sympy import *
var('AB,x',positive=True)
BC,AC,degA=7,5,60
AB     =solve(Eq(BC**2,AC**2+AB**2-2*AC*AB*cos(degA*Rational(1,180)*pi)),AB)[0]         ;print("#",AB)
range_x=Interval(0,AC).intersect(Interval(0,AB/2))                                      ;print("#",range_x)
S_x    =( Rational(1,2)*AC*AB      *sin(degA*Rational(1,180)*pi) \
         -Rational(1,2)*x *(AB-2*x)*sin(degA*Rational(1,180)*pi)).expand().simplify()   ;print("#",S_x)
S_x_min=minimum(S_x,x,range_x)
print("#",solve(Eq(S_x,S_x_min),x)[0],S_x_min)
# 8
# Interval(0, 4)
# sqrt(3)*(x**2 - 4*x + 20)/2
# 2 8*sqrt(3)

ver1.1

・inequality をもう少し細かく?

# ver 1.1
from sympy import *
from sympy.solvers.inequalities import solve_univariate_inequality

AB, x = symbols('AB x', real=True)

def inequality_to_interval_complete(ineq, var):
    if ineq is True:
        return S.Reals
    if ineq is False:
        return S.EmptySet

    if isinstance(ineq, And):
        intervals = [
            solve_univariate_inequality(arg, var, relational=False)
            for arg in ineq.args
        ]
        return Intersection(*intervals).intersect(S.Reals)

    sol = solve_univariate_inequality(ineq, var, relational=False)
    return sol.intersect(S.Reals)
BC,AC,degA=7,5,60
AB     =solve(Eq(BC**2,AC**2+AB**2-2*AC*AB*cos(degA*Rational(1,180)*pi)),AB)[1]   ;print("#",AB)
k      =2
range_x=inequality_to_interval_complete((0 <= k*x) & (k*x <= AB), x)              ;print("#",range_x)
S_x    =( Triangle(sas=(AB    ,60,AC)).area \
         -Triangle(sas=(AB-2*x,60,x )).area).expand().simplify()                  ;print("#",S_x)        
S_x_min=minimum(S_x,x,range_x)
print("#",solve(Eq(S_x,S_x_min),x)[0],S_x_min)
# 8
# Interval(0, 4)
# sqrt(3)*(x**2 - 4*x + 20)/2
# 2 8*sqrt(3)

sympyで(いつもの方法で) 力技?

ver1.2

# ver1.2

データ分析の上限に達しました。さらにご利用を続けるには無料の Plus をお試しください. もしくは、明日の 19:50 以降に制限がリセットされるまでお待ちください。
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

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

sympyのweb上での実行方法

SymPy Live Shellで。FreeCADのマクロは、以下で実行できません。
https://qiita.com/mrrclb48z/items/00dd08b0317069be9342#web%E4%B8%8A%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95sympy-live-shell%E3%81%A7

(テンプレート)

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

sympy のdoc

ver0.1

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?