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

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

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

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

NumPy

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

Python 3.x

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

Q&A

解決済

2回答

11543閲覧

グラフが描けているのにエラーが出ている

mdshiba2

総合スコア21

Matplotlib

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

NumPy

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

Python 3.x

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

0グッド

0クリップ

投稿2018/12/17 02:50

前提・実現したいこと

python 初心者です.
matplotlibを使用してグラフを描いています.出力として描けているもののエラーが出ています.
宜しくお願い致します.

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

関数を描写するプログラムを走らせたところ,グラフとして描かれるものの,Python shellの方でエラーが出てしまいます.

#エラー部分 Warning (from warnings module): File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\numeric.py", line 501 return array(a, dtype, copy=False, order=order) ComplexWarning: Casting complex values to real discards the imaginary part

該当のソースコード

Python

1 2import numpy as np 3import matplotlib.pyplot as plt 4from sympy import * 5 6init_printing() 7 8plt.grid(True) 9plt.xlabel('$x$', fontsize=16) 10plt.ylabel('$theta$', fontsize=16) 11plt.title('upper die') 12 13#縦横比1:1 14plt.gca().set_aspect('equal', adjustable='box') 15 16x = Symbol('x') 17R=-19.41053 18k=-59.85017 19A=0.00032903849 20B=-5.2456616*10**(-6) 21C=-9.3112502*10**(-8) 22D=4.1876359*10**(-9) 23E=3.0521463*10**(-11) 24F=7.4771618*10**(-13) 25c=1/R 26 27# 計算式 28z =-(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) 29 30prime_z = Derivative(z, x).doit() 31 32a = Symbol('a') 33z_a = z.subs(x, a) # f(a) 34prime_z_a = prime_z.subs(x, a) # f'(a) 35tangent = prime_z_a * (x - a) + z_a # 点 (a, f(a)) の接線 36normal = (-1 / prime_z_a) * (x - a) + z_a # 点 (a, f(a)) の法線 37theta = deg(atan(-1 / prime_z_a)) # 法線の角度 38 39xs = np.arange(0.01, 7, 0.01) 40thetas = np.array([complex(theta.subs(a, t)) for t in xs]) 41 42# 横軸の変数。縦軸の変数。 43plt.plot(xs, thetas+90) 44 45# 描画実行 46plt.show() 47

###グラフ

イメージ説明

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

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

解決方法がわかっていないので,ご協力お願い致します.

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

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

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

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

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

guest

回答2

0

ベストアンサー

ComplexWarning: Casting complex values to real discards the imaginary part

グーグル翻訳:
『ComplexWarning:複雑な値を実際にキャストすると、虚数部が破棄されます。』

複雑な値 ⇒ 複素数、実際 ⇒ 実数 と置き換えられれば意味は充分汲み取れます。


次の一行を書き換えれば警告は消えます。

Python

thetas = np.array([complex(theta.subs(a, t)) for t in xs])

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Python

1thetas = np.array([theta.subs(a, t) for t in xs])

投稿2018/12/17 04:20

LouiS0616

総合スコア35660

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

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

KSwordOfHaste

2018/12/17 04:37

内容がかぶった回答をしてしまいました。エラーメッセージを読みましょうというLouiS0616さんの回答の含意に同意です。ただcomplex=複素数という単語を知らなかったとすればgoogle翻訳から意味を把握するのはちょっと厳しい気もしました。自分はcomplex関数を使っているのだから複素数については質問者さんがわかっていると解釈したのですが実際はどうだったのかな?
mdshiba2

2018/12/17 04:42

ご回答ありがとうございます.教えて頂いたように行ったところできました!! ありがとうございます. もう一つお伺いしたいのですが, プロットする座標を細かくするために ``` xs = np.arange(0.0001, 7, 0.0001) ``` この様にしたのですが,出力に時間がかなりかかっており,いつグラフが出てくるんだ...と感じるぐらい遅いです(5分ほど待っても出ません). これはxsの刻みを小さくしたのでしょうがないことなのでしょうか?
LouiS0616

2018/12/17 05:33

@KSwordOfHaste さん なるほど、少し厳しかったでしょうか。 ただ『虚数部』というワードがでてくるので、それで気付けるだろうと思った節もあります。 --- @mdshiba2 さん > xs = np.arange(0.0001, 7, 0.0001) > 出力に時間がかなりかかっており そんなに細かくプロットしなければならないほど目まぐるしい変化をする関数なのでしょうか? あるいは単に罫線を細かくしたいだけかもしれませんが、それならば設定する方法があると思います。
mdshiba2

2018/12/17 07:18

自分の勉強不足で申し訳ありませんでした. >>>LouiS0616 様 >>>そんなに細かくプロットしなければならないほど目まぐるしい変化をする関数なのでしょうか? こちらの勘違いでした... 最後に一つご質問なのですが,現在のプログラムはxの範囲指定でθを決定していましたが,θの範囲指定でxを決定することは可能でしょうか??
LouiS0616

2018/12/17 07:45 編集

グラフの概形を見る限り、逆関数は導出できないように思えますが。
mdshiba2

2018/12/19 02:47

>>>LouiS0616 様 そうですよね...ありがとうございました!
guest

0

メッセージの内容は

ComplexWarning: Casting complex values to real discards the imaginary part

「警告: 複素数を実数へ変換(キャスト)すると虚部は捨てられちゃいます」

ですが、これはplot関数が出力している警告メッセージです。

plotはグラフを描画する際、X軸Y軸の値として実数を要求します。複素数を指定したとしてもそれを2次元のグラフに表現できないからでしょうね。そこで複素数が指定されたとき実数(実数を表すのに使われるfloat型)へ変換するのですが・・・

応用によって複素数から実数へ変換する方法は一意ではなく「実部を採用」「複素平面の原点からの距離を採用」などいくつかの方法が考えられます。しかしplotはプログラマーがどのような応用のためにこのグラフを描画しようとしているかわからないため、「とりあえず虚部を捨てて実部だけを取る」という方針で変換します。ただしplotは「プログラマーが複素数を自分の目的に応じて実数へ変換する処理を忘れてしまっているかも知れないなぁ」と考えてくれ、親切で前述の警告メッセージを表示してくれているのでしょう。

プログラムを拝見するとグラフのY軸データは確かに複素数ですが虚部は全て0になっています。なぜ複素数になるかといえば

thetas = np.array([complex(theta.subs(a, t)) for t in xs])

この計算でわざわざ実数を複素数に変換しているからです。思うにこの複素数の変換は特に意味が感じられないので単に以下のようにすればよいと思います。そうすれば警告は出なくなります。

thetas = np.array([theta.subs(a, t) for t in xs])

投稿2018/12/17 04:25

KSwordOfHaste

総合スコア18394

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

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

mdshiba2

2018/12/17 07:12

ご回答ありがとうございます. すごくわかりやすい解説ありがとうございました!! もっと勉強したいと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問