sympyのdoc
・Plotting
https://docs.sympy.org/latest/modules/plotting.html
・class sympy.functions.elementary.piecewise.Piecewise(*_args)
https://docs.sympy.org/latest/modules/functions/elementary.html#piecewise
ChatGPT先生へ
・質問リストの追番は無視して下さい。1個ずつです。途中の回答表示は省略しています。
・私の質問の仕方が悪かったです。
# 質問リスト
1. sympyのplot 関数の引数に Piecewise関数を使いたい。
2. 例1をユーザー定義関数にして下さい。
3. 上記の条件で、線種を増やして下さい。
4. 上記を実行するとエラーがでます。AttributeError: 'bool' object has no attribute 'astype'
5. 上記の条件で色の変更のみにして下さい。
6. 上記の条件で、次の引数不要で。num_points=400, colors=["blue", "red", "green"]
7. 最後のソースコードを出力するために、1回の質問で回答をもらうための、質問文を教えて下さい。
・(私)(再)そうかあ。以下私が何だかバージョンした気分です。
最後のソースコードを出力するために、1回の質問で回答をもらうための、質問文を教えて下さい。
質問文:
SymPy の Piecewise 関数をプロットする関数を作りたいです。条件ごとに異なる色("blue", "red", "green")で描画し、線種は変更しません。プロット範囲はデフォルトで (-5, 5)、プロット点数は 400 に固定してください。また、関数の引数として num_points や colors は不要です。これに対応する Python のコードを教えてください。
・私は恐ろしくて未実行です。
・ちょうど時間となりました。
・GPT-4o. の Free プランの制限に達しました。
・「もっと簡易でお願いします。」と聞けませんでした。
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。(回答抜粋)
以下間違っていました。申し訳ありません。
修正後のコード
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
def plot_piecewise(expr, x_range=(-5, 5)):
"""
sympyのPiecewise関数をプロットし、各条件ごとに異なる色で描画する。
Parameters:
expr (sympy.Expr): sympyのPiecewise関数
x_range (tuple): (xmin, xmax) の範囲(デフォルト: (-5, 5))
"""
x = sp.Symbol('x')
conditions = expr.args # Piecewise の条件と関数を取得
colors = ["blue", "red", "green"] # 固定の色リスト
plt.figure(figsize=(8, 5))
x_vals_full = np.linspace(x_range[0], x_range[1], 400) # num_points = 400 固定
for i, (func, cond) in enumerate(conditions):
if i >= len(colors): # 色が足りない場合の安全対策
break
# 条件を適用する範囲を決定
if cond is True: # 最後の条件(デフォルト)
x_vals = x_vals_full
else:
cond_func = sp.lambdify(x, cond, 'numpy') # 条件を numpy 関数に変換
cond_vectorized = np.vectorize(lambda val: bool(cond_func(val))) # ベクトル化
mask = cond_vectorized(x_vals_full) # True/False の配列
x_vals = x_vals_full[mask] # 条件に合う x 値のみ取得
# sympy の関数を numpy 用に変換
f_lambdified = sp.lambdify(x, func, 'numpy')
y_vals = f_lambdified(x_vals)
# プロット(色を変更)
plt.plot(x_vals, y_vals, color=colors[i], label=f"Condition {i+1}")
# 軸とグリッドを設定
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.legend()
plt.grid()
plt.show()
# 使用例
x = sp.Symbol('x')
f = sp.Piecewise((x**2, x < -2), (x + 1, (x >= -2) & (x < 2)), (-x, x >= 2))
plot_piecewise(f)
Gemini先生へ
copilot先生へ
いつもの? sympyの実行環境と 参考のおすすめです。