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?

円と放物線の交点の個数「2つの曲線の交点の個数について」様を、計算はsympyで作図もAI先生に教えてもらいました。

0
Last updated at Posted at 2026-08-03

・私は、sympyで 代表値??? の扱いを理解できませんでした。アドバイスいただけると助かります。
 7パターンを言ったのが悪かったカモ。

オリジナル

@arairuca(iru ca) 様へ。 いつもお世話になっております。

(本日の)Gemini先生へ

(最終コードだけ)

# 1行目: SymPyを用いて定数aを文字のまま含めた一般解と7パターンの代表値における厳密解(真数)を計算・表示するプログラム
from sympy import Symbol, Eq, solve, Rational, sqrt, simplify

def main():
    x = Symbol('x', real=True)
    y = Symbol('y', real=True)
    a = Symbol('a', real=True)

    # ---------------------------------------------------------
    # 1. 定数 a のまま解く(一般解の計算)
    # ---------------------------------------------------------
    eq1 = Eq(x**2 + (y - a)**2, 1)
    eq2 = Eq(y, x**2)

    print("==================================================")
    print("【1. 定数 a を用いた一般解の計算】")
    print("==================================================")
    
    # y についての二次方程式 y^2 + (1-2a)y + a^2 - 1 = 0 を解く
    y_eq = Eq(y**2 + (1 - 2*a)*y + a**2 - 1, 0)
    y_solutions = solve(y_eq, y)
    
    print(f"y の解 (a で表した式):")
    for idx, y_sol in enumerate(y_solutions, 1):
        print(f"  y_{idx} = {y_sol}")
    print("\n※ x = ±√y (y ≧ 0 の場合)\n")

    # ---------------------------------------------------------
    # 2. 7つのパターン・代表値による計算(厳密解・真数表示)
    # ---------------------------------------------------------
    print("==================================================")
    print("【2. 7パターンの代表値における厳密解と解の個数】")
    print("==================================================")

    test_cases = [
        ("a > 5/4", Rational(2, 1)),
        ("a = 5/4", Rational(5, 4)),
        ("1 < a < 5/4", Rational(9, 8)),
        ("a = 1", Rational(1, 1)),
        ("-1 < a < 1", Rational(0, 1)),
        ("a = -1", Rational(-1, 1)),
        ("a < -1", Rational(-2, 1)),
    ]

    for label, a_val in test_cases:
        # 代表値を代入して方程式を作成
        eq1_sub = Eq(x**2 + (y - a_val)**2, 1)
        
        # 厳密解を計算
        sols = solve((eq1_sub, eq2), (x, y))
        
        # 重複解(重根)を除外して相異なる実数解を取得
        unique_sols = list(dict.fromkeys(sols))

        print(f"--- {label} (代表値: a = {a_val}) ---")
        print(f"解の個数: {len(unique_sols)}")
        if unique_sols:
            for s in unique_sols:
                print(f"  (x, y) = ({s[0]}, {s[1]})")
        else:
            print("  実数解なし")
        print()

if __name__ == "__main__":
    main()

実行結果

==================================================
【1. 定数 a を用いた一般解の計算】
==================================================
y の解 (a で表した式):
  y_1 = a - sqrt(5 - 4*a)/2 - 1/2
  y_2 = a + sqrt(5 - 4*a)/2 - 1/2

※ x = ±√y (y ≧ 0 の場合)

==================================================
【2. 7パターンの代表値における厳密解と解の個数】
==================================================
--- a > 5/4 (代表値: a = 2) ---
解の個数: 0 個
  実数解なし

--- a = 5/4 (代表値: a = 5/4) ---
解の個数: 2 個
  (x, y) = (-sqrt(3)/2, 3/4)
  (x, y) = (sqrt(3)/2, 3/4)

--- 1 < a < 5/4 (代表値: a = 9/8) ---
解の個数: 4 個
  (x, y) = (-sqrt(5/8 - sqrt(2)/4), 5/8 - sqrt(2)/4)
  (x, y) = (sqrt(5/8 - sqrt(2)/4), 5/8 - sqrt(2)/4)
  (x, y) = (-sqrt(sqrt(2)/4 + 5/8), sqrt(2)/4 + 5/8)
  (x, y) = (sqrt(sqrt(2)/4 + 5/8), sqrt(2)/4 + 5/8)

--- a = 1 (代表値: a = 1) ---
解の個数: 3 個
  (x, y) = (-1, 1)
  (x, y) = (0, 0)
  (x, y) = (1, 1)

--- -1 < a < 1 (代表値: a = 0) ---
解の個数: 2 個
  (x, y) = (-sqrt(-1/2 + sqrt(5)/2), -1/2 + sqrt(5)/2)
  (x, y) = (sqrt(-1/2 + sqrt(5)/2), -1/2 + sqrt(5)/2)

--- a = -1 (代表値: a = -1) ---
解の個数: 1 個
  (x, y) = (0, 0)

--- a < -1 (代表値: a = -2) ---
解の個数: 0 個
  実数解なし

PNG図

image.png

履歴

1. \begin{cases} x^2+(y-a)^2=1\\ y=x^2 \end{cases} 日本語でお願いします。
2. 上記7パターンをsympyのソースコードで教えて下さい。。結果も。
3. 代表値の計算も含めておまとめで。小数でなく真数で。
4. 分割しないで
5. 代表値の計算も含めて。
6. 7パターンをpng図で教えて下さい。
7. 上記の私の質問すべてから、Markdownのテキスト形式で、質問リストを出力して。追番を追加して。本質問も含めて。コピーできる形式で。空白行不要です。

(翌日の)Gemini先生へ

以下を微分を使ったソースコードにして下さい。結果もお願いします。
(上記ソースコード)

​微分を用いたソースコード

# SymPyを用いて微分(極値・法線条件)を利用し、円と放物線の交点および接点を解くプログラム

from sympy import Symbol, Eq, solve, Rational, diff, simplify

def main():
    x = Symbol('x', real=True)
    y = Symbol('y', real=True)
    a = Symbol('a', real=True)

    print("==================================================")
    print("【1. 微分を用いた交点・接点条件(一般解)の導出】")
    print("==================================================")

    # 放物線 y = x^2 上の点 P(x, x^2) と円の中心 C(0, a) の距離の2乗を f(x) とする
    # f(x) = x^2 + (x^2 - a)^2
    f_x = x**2 + (x**2 - a)**2

    # f(x) を x で微分して極小値(法線条件)を求める
    df_dx = diff(f_x, x)
    print(f"距離の2乗 f(x) = {f_x}")
    print(f"微分 f'(x)     = {df_dx}")

    # f'(x) = 0 となる臨界点を求める: 2x * (1 + 2(x^2 - a)) = 0
    # したがって x = 0 または x^2 = a - 1/2
    critical_points = solve(df_dx, x)
    print(f"臨界点 (f'(x)=0 となる x): {critical_points}")

    # 円と放物線が接する条件は、極小値における最小距離が半径 1 に等しいこと
    # すなわち f(x) = 1 となること
    # x^2 = a - 1/2 を f(x) = 1 に代入すると (a - 1/2) + (1/2)^2 = 1 => a = 5/4
    
    print("\n--- 微分から導かれる臨界条件 ---")
    print("・x = 0  (軸上の交点):  y = 0  => a = ±1 のとき円の境界")
    print("・x ≠ 0 (左右対称な接点): a > 1/2 のとき存在し、a = 5/4 で半径1と一致(接する)")

    print("\n==================================================")
    print("【2. 7パターンの代表値における厳密解と解の個数】")
    print("==================================================")

    test_cases = [
        ("a > 5/4", Rational(2, 1)),
        ("a = 5/4", Rational(5, 4)),
        ("1 < a < 5/4", Rational(9, 8)),
        ("a = 1", Rational(1, 1)),
        ("-1 < a < 1", Rational(0, 1)),
        ("a = -1", Rational(-1, 1)),
        ("a < -1", Rational(-2, 1)),
    ]

    for label, a_val in test_cases:
        # a の値を代入した距離関数とその微分
        f_val = f_x.subs(a, a_val)
        df_val = diff(f_val, x)

        # f(x) = 1 (半径1の円周上) となる点(交点)を計算
        x_sols = solve(Eq(f_val, 1), x)
        
        # 重複を除いた実数解の x, y 座標ペアを作成
        unique_sols = []
        for x_s in x_sols:
            if x_s.is_real:
                y_s = simplify(x_s**2)
                pair = (x_s, y_s)
                if pair not in unique_sols:
                    unique_sols.append(pair)

        print(f"--- {label} (代表値: a = {a_val}) ---")
        print(f"解の個数: {len(unique_sols)}")
        if unique_sols:
            for s in unique_sols:
                print(f"  (x, y) = ({s[0]}, {s[1]})")
        else:
            print("  実数解なし")
        print()

if __name__ == "__main__":
    main()

実行結果

==================================================
【1. 微分を用いた交点・接点条件(一般解)の導出】
==================================================
距離の2乗 f(x) = x**2 + (x**2 - a)**2
微分 f'(x)     = 4*x**3 + x*(2 - 4*a)
臨界点 (f'(x)=0 となる x): [0, -sqrt(2*a - 1)/2, sqrt(2*a - 1)/2]

--- 微分から導かれる臨界条件 ---
・x = 0  (軸上の交点):  y = 0  => a = ±1 のとき円の境界
・x ≠ 0 (左右対称な接点): a > 1/2 のとき存在し、a = 5/4 で半径1と一致(接する)

==================================================
【2. 7パターンの代表値における厳密解と解の個数】
==================================================
--- a > 5/4 (代表値: a = 2) ---
解の個数: 2 個
  (x, y) = (-sqrt(sqrt(5) + 1), sqrt(5) + 1)
  (x, y) = (sqrt(sqrt(5) + 1), sqrt(5) + 1)

--- a = 5/4 (代表値: a = 5/4) ---
解の個数: 3 個
  (x, y) = (0, 0)
  (x, y) = (-sqrt(3)/2, 3/4)
  (x, y) = (sqrt(3)/2, 3/4)

--- 1 < a < 5/4 (代表値: a = 9/8) ---
解の個数: 4 個
  (x, y) = (-sqrt(7)/4, 7/16)
  (x, y) = (sqrt(7)/4, 7/16)
  (x, y) = (-1/2, 1/4)
  (x, y) = (1/2, 1/4)

--- a = 1 (代表値: a = 1) ---
解の個数: 3 個
  (x, y) = (0, 0)
  (x, y) = (-1, 1)
  (x, y) = (1, 1)

--- -1 < a < 1 (代表値: a = 0) ---
解の個数: 2 個
  (x, y) = (-1, 1)
  (x, y) = (1, 1)

--- a = -1 (代表値: a = -1) ---
解の個数: 1 個
  (x, y) = (0, 0)

--- a < -1 (代表値: a = -2) ---
解の個数: 0 個
  実数解なし

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

sympyのweb上での実行方法

SymPy Live Shellで。FreeCADのマクロは、以下で実行できません。

(テンプレート)

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

python のdoc

・enumerate(iterable, start=0)¶
https://docs.python.org/ja/3/library/functions.html#enumerate

sympy のdoc

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?