・私は、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図
履歴
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
