質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

Python_無限級数を可視化したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,004

UniUniPhy

score 17

Pythonで無限級数を可視化(グラフで表示)できないか企んでいます。以下の無限級数

\sum_{n=1}^{\infty} x^n


をPythonで実行し、その一般項(?)を表示させてからグラフにしたいです。

Fx=sym.Sum(x**n, (n, 1, oo))
print(Fx)
print(sym.factor(Fx.subs([(n, oo)]).doit()))


として実行すると、

Sum(x**n, (n, 1, oo))
Piecewise((x/(-x + 1), Abs(x) < 1), (Sum(x**n, (n, 1, oo)), True))


と返してくれたのでここまでは万歳!だったのですが、その後に

import matplotlib.pyplot as plt
from matplotlib.image import imread

plt.plot(Fx)
pli.show()


として実行すると、

Traceback (most recent call last):
  File "pra.py", line 46, in <module>
    plt.plot(Fx)
  File "/usr/local/lib/python3.7/site-packages/matplotlib/pyplot.py", line 3363, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/matplotlib/__init__.py", line 1867, in inner
    return func(ax, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/matplotlib/axes/_axes.py", line 1529, in plot
    self.add_line(line)
  File "/usr/local/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 1960, in add_line
    self._update_line_limits(line)
  File "/usr/local/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 1982, in _update_line_limits
    path = line.get_path()
  File "/usr/local/lib/python3.7/site-packages/matplotlib/lines.py", line 956, in get_path
    self.recache()
  File "/usr/local/lib/python3.7/site-packages/matplotlib/lines.py", line 657, in recache
    y = _to_unmasked_float_array(yconv).ravel()
  File "/usr/local/lib/python3.7/site-packages/matplotlib/cbook/__init__.py", line 2052, in _to_unmasked_float_array
    return np.asarray(x, float)
  File "/usr/local/lib/python3.7/site-packages/numpy/core/numeric.py", line 501, in asarray
    return array(a, dtype, copy=False, order=order)
  File "/usr/local/lib/python3.7/site-packages/sympy/core/expr.py", line 256, in __float__
    raise TypeError("can't convert expression to float")
TypeError: can't convert expression to float


と返ってきて涙目です。どこか間違いがあるでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kzm4269

    2018/12/19 11:32

    `plt.plot()` は「数値」を渡してグラフを描画するための関数なので、今回のような「数式」処理の用途では使うことができません。エラーが発生している理由はこれです。

    それはそれとして、無限級数を可視化するにあったってどういうグラフを作りたいのか(なにを横軸にしてなにを縦軸にするのか、など)が不明なので回答できません。

    キャンセル

回答 1

checkベストアンサー

+1

グラフの描画はある範囲の具体的な数値を与える必要があります。
無限級数でも実際プロットできるのは特定の範囲なので、その範囲の値を numpy の関数で計算して、plot(x, y) に渡してあげればよいです。

import matplotlib.pyplot as plt
import numpy as np

n = np.arange(30)
a = 2**n  # 数列の各項
print(a)
# [        1         2         4         8        16        32        64
#        128       256       512      1024      2048      4096      8192
#      16384     32768     65536    131072    262144    524288   1048576
#    2097152   4194304   8388608  16777216  33554432  67108864 134217728
#  268435456 536870912]

series = np.cumsum(a)  # 級数
print(series)
# [         1          3          7         15         31         63
#         127        255        511       1023       2047       4095
#        8191      16383      32767      65535     131071     262143
#      524287    1048575    2097151    4194303    8388607   16777215
#    33554431   67108863  134217727  268435455  536870911 1073741823]

fig, ax = plt.subplots(figsize=(6, 6))
ax.set_yscale('log')
ax.plot(n, series, 'bo-')
plt.show()

イメージ説明

ご提示の a_n = x**n は値が指数的に増加するので、項数が多いと float で表現できる範囲を超えてオーバーフローしてしまうので、50項ぐらいが描画できる限度です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/19 14:47

    これは縦軸が何になっているのでしょうか・・・?

    キャンセル

  • 2018/12/19 15:00 編集

    級数の値です。つまり、S_N = \sum_{n=0}^{N} 2^n
    x = 2 としています。

    キャンセル

  • 2018/12/19 15:04

    y軸を対数スケールに直しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る