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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3364閲覧

微分した関数のグラフ表示について

mdshiba2

総合スコア21

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/12/11 10:29

編集2018/12/11 12:30

前提・実現したいこと

python 初心者です.
ある関数に対して微分したもののグラフを表示したいのです.
知識のある方,お助けお願い致します.

発生している問題・エラーメッセージ

インターネットなどでやり方を探しているのですが,初心者ということもあり,いまいち理解できていません.

該当のソースコード

Python

1#微分したグラフ 2 3import numpy as np 4import matplotlib.pyplot as plt 5 6# 描画範囲の指定 7# x = np.arange(x軸の最小値, x軸の最大値, 刻み) 8x = np.arange(0, 6.28, 0.1) 9 10plt.grid(True) 11plt.xlabel('$x$', fontsize=16) 12plt.ylabel('$Z$', fontsize=16) 13plt.title('upper die') 14 15#縦横比1:1 16plt.gca().set_aspect('equal', adjustable='box') 17 18R=-19.41053 19k=-59.85017 20A=0.00032903849 21B=-5.2456616*10**(-6) 22C=-9.3112502*10**(-8) 23D=4.1876359*10**(-9) 24E=3.0521463*10**(-11) 25F=7.4771618*10**(-13) 26c=1/R 27 28from sympy import Symbol, Derivative 29#xを変数xに指定 30x=Symbol('x') 31 32#関数入力 33z=-(c*x**2/(1+(1-(1+k)*c**2*x**2)**(1/2))+A*x**2+B*x**4+C*x**6+D*x**8+E*x**10+F*x**12) 34#入力関数を指定変数で微分 35Z=Derivative(z,x).doit() 36 37# 横軸の変数。縦軸の変数。 38plt.plot(x,Z) 39 40# 描画実行 41plt.show()

これを入力すると

>>> #入力関数を指定変数で微分 ... Z=Derivative(z,x).doit() >>> >>> # 横軸の変数。縦軸の変数。 ... plt.plot(x,Z) Traceback (most recent call last): File "<stdin>", line 2, in <module> File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\pyplot.py", line 3363, in plot ret = ax.plot(*args, **kwargs) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\__init__.py", line 1867, in inner return func(ax, *args, **kwargs) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\axes\_axes.py", line 1529, in plot self.add_line(line) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\axes\_base.py", line 1960, in add_line self._update_line_limits(line) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\axes\_base.py", line 1982, in _update_line_limits path = line.get_path() File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\lines.py", line 956, in get_path self.recache() File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\lines.py", line 652, in recache x = _to_unmasked_float_array(xconv).ravel() File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\cbook\__init__.py", line 2052, in _to_unmasked_float_array return np.asarray(x, float) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\numpy\core\numeric.py", line 501, in asarray return array(a, dtype, copy=False, order=order) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\sympy\core\expr.py", line 225, in __float__ raise TypeError("can't convert expression to float") TypeError: can't convert expression to float >>> >>> # 描画実行 ... plt.show()

のようなエラーが出ます...
また出力される画像はイメージ説明
この様なものです..

知恵を授けて頂けると幸いです.宜しくお願い致します.

プログラム改訂後グラフです.
イメージ説明

補足情報(FW/ツールのバージョンなど)

python3.6を使用しています.

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

変数 Z は Sympy の式で具体的な値ではないので、それをそのまま plot() に突っ込んだらエラーになります。
evalf() 関数に変数 x の値を与えて、具体的な数値を計算してください。

python

1import matplotlib.pyplot as plt 2import numpy as np 3from sympy import Derivative, Symbol, N 4 5R = -19.41053 6k = -59.85017 7A = 0.00032903849 8B = -5.2456616*10**(-6) 9C = -9.3112502*10**(-8) 10D = 4.1876359*10**(-9) 11E = 3.0521463*10**(-11) 12F = 7.4771618*10**(-13) 13c = 1/R 14 15# xを変数xに指定 16x = Symbol('x') 17 18# 関数入力 19z = -(c*x**2/(1+(1-(1+k)*c**2*x**2)**(1/2))+A * 20 x**2+B*x**4+C*x**6+D*x**8+E*x**10+F*x**12) 21# 入力関数を指定変数で微分 22Z = Derivative(z, x).doit() 23 24# x, y の点一覧を作成する。 25xs = np.arange(0, 6.28, 0.1) 26ys = [Z.evalf(subs={x: v}) for v in xs] 27 28# 描画する。 29fig, ax = plt.subplots(figsize=(7, 7)) 30plt.grid(True) 31plt.xlabel('$x$', fontsize=16) 32plt.ylabel('$Z$', fontsize=16) 33plt.title('upper die') 34plt.plot(xs, ys) 35plt.show()

軸のスケールを equal にすると、x 軸に対して y 軸の値のスケールが小さすぎて潰れてしまうため、その部分だけ消しました。

イメージ説明

投稿2018/12/11 11:49

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mdshiba2

2018/12/11 12:28

ご回答ありがとうございます. 試したところできました!しかし,出力されたグラフがtiitoi様のと異なってしまいます...
mdshiba2

2018/12/11 12:39

グラフも載せましたのでご享受して頂けると幸いです.
tiitoi

2018/12/11 13:43 編集

回答欄のコードをそのままコピペして実行してもそうなりますか? 別のPCでも試しましたが、回答のグラフが表示されたので、ご指摘いただいたような現象はこちらでは再現できないです。
mdshiba2

2018/12/12 06:30

先程,再び試したところtiitoi様に提示して頂いたものと同じグラフになりました. とても助かりました!!ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問