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?

(途中)「sympyのplot 関数の引数に Piecewise関数を使いたい。」をAI先生に聞きました。

Last updated at Posted at 2025-03-15

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の実行環境と 参考のおすすめです。

(テンプレート)

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

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?