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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1044閲覧

x<30でF(x)=a みたいにF(x)が変化するような関数をプロットしたい2

hataki7

総合スコア4

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/04 05:40

編集2020/08/04 06:24

条件によって変化するF(x)をプロットしたいがエラーが出てしまう。

イメージ説明

python

1from scipy.special import kv 2import matplotlib.pyplot as plt 3from scipy.integrate import quad 4import numpy as np 5import math 6from math import gamma 7 8xs = np.linspace(0, 100, 10000) 9f = lambda z: kv(5/3,z) 10F = [quad(f,x,np.inf)[0]*x for x in xs] 11 12a = gamma(1/3) 13G = [(4*math.pi/np.sqrt(3)/a)*(x/2)**(1/3) for x in xs] 14H = [((math.pi/2)**(1/2))*(x**(1/2))*(math.exp(-x))for x in xs] 15 16 17def A(x): 18 if x <= 5.0*1e-3: 19 return G 20 elif 5.0*1-3 < x < 30: 21 return F 22 elif 30 <= x: 23 return H 24 25y = [A(i) for i in xs] 26 27fig = plt.figure() 28ax = fig.add_subplot(1,1,1) 29ax.grid() 30ax.plot(xs,y) 31ax.set_xlim(1e-3, 1e1) 32ax.set_ylim(1e-3, 1e0) 33ax.set_yscale('log') 34ax.set_xscale('log') 35ax.set_title('log') 36ax.set_xlabel('x') 37ax.set_ylabel('') 38plt.show()

python

1エラー 2TypeError Traceback (most recent call last) 3TypeError: float() argument must be a string or a number, not 'list' 4 5The above exception was the direct cause of the following exception: 6 7ValueError Traceback (most recent call last) 8<ipython-input-14-37ff64188e32> in <module> 9 28 ax = fig.add_subplot(1,1,1) 10 29 ax.grid() 11---> 30 ax.plot(xs,y) 12 31 ax.set_xlim(1e-3, 5*1e1) 13 32 ax.set_ylim(1e-3, 1e0) 14 15C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in plot(self, scalex, scaley, data, *args, **kwargs) 16 1665 lines = [*self._get_lines(*args, data=data, **kwargs)] 17 1666 for line in lines: 18-> 1667 self.add_line(line) 19 1668 self.autoscale_view(scalex=scalex, scaley=scaley) 20 1669 return lines 21 22C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in add_line(self, line) 23 1900 line.set_clip_path(self.patch) 24 1901 25-> 1902 self._update_line_limits(line) 26 1903 if not line.get_label(): 27 1904 line.set_label('_line%d' % len(self.lines)) 28 29C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _update_line_limits(self, line) 30 1922 Figures out the data limit of the given line, updating self.dataLim. 31 1923 """ 32-> 1924 path = line.get_path() 33 1925 if path.vertices.size == 0: 34 1926 return 35 36C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\lines.py in get_path(self) 37 1025 """ 38 1026 if self._invalidy or self._invalidx: 39-> 1027 self.recache() 40 1028 return self._path 41 1029 42 43C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\lines.py in recache(self, always) 44 673 if always or self._invalidy: 45 674 yconv = self.convert_yunits(self._yorig) 46--> 675 y = _to_unmasked_float_array(yconv).ravel() 47 676 else: 48 677 y = self._y 49 50C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\cbook\__init__.py in _to_unmasked_float_array(x) 51 1388 return np.ma.asarray(x, float).filled(np.nan) 52 1389 else: 53-> 1390 return np.asarray(x, float) 54 1391 55 1392 56 57C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order) 58 83 59 84 """ 60---> 85 return array(a, dtype, copy=False, order=order) 61 86 62 87 63 64ValueError: setting an array element with a sequence.

python

1from scipy.special import kv 2import matplotlib.pyplot as plt 3from scipy.integrate import quad 4import numpy as np 5import math 6from math import gamma 7 8xs = np.linspace(0, 50, 10000) 9f = lambda z: kv(5/3,z) 10F = [quad(f,x,np.inf)[0]*x for x in xs] 11 12a = gamma(1/3) 13G = [(4*math.pi/np.sqrt(3)/a)*(x/2)**(1/3) for x in xs] 14H = [((math.pi/2)**(1/2))*(x**(1/2))*(math.exp(-x))for x in xs] 15 16 17def A(x): 18 if x <= 5.0*1e-3: 19 return (4*math.pi/np.sqrt(3)/a)*(x/2)**(1/3) 20 elif 5.0*1-3 < x < 30: 21 return quad(f,x,np.inf)[0]*x 22 elif 30 <= x: 23 return ((math.pi/2)**(1/2))*(x**(1/2))*(math.exp(-x)) 24 25y = [A(i) for i in xs] 26 27fig = plt.figure() 28ax = fig.add_subplot(1,1,1) 29ax.grid() 30ax.plot(xs,y) 31ax.set_xlim(1e-3, 5*1e1) 32ax.set_ylim(1e-3, 1e0) 33ax.set_yscale('log') 34ax.set_xscale('log') 35ax.set_title('log') 36ax.set_xlabel('x') 37ax.set_ylabel('') 38plt.show()

のようにすると、イメージ説明
途中できれたものが出てくる

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラーに関して

最初のエラーに関してですが、内包表記が必要となる部分はxsからyを作る部分のみです。他の部分は普通に関数として定義するようにして下さい。

python

1f = lambda z: kv(5 / 3, z) 2a = gamma(1 / 3) 3 4 5def F(x): 6 return quad(f, x, np.inf)[0] * x 7 8 9def G(x): 10 return (4 * math.pi / np.sqrt(3) / a) * (x / 2) ** (1 / 3) 11 12 13def H(x): 14 return ((math.pi / 2) ** (1 / 2)) * (x ** (1 / 2)) * (math.exp(-x)) 15 16 17def A(x): 18 if x <= 5.0 * 1e-3: 19 return G(x) 20 elif 5.0 * 1 - 3 < x < 30: 21 return F(x) 22 elif 30 <= x: 23 return H(x) 24 25y = [A(i) for i in xs]

途中で切れたものが出てくる件に関して

考えられる点は2点あります。

  1. A(x)の値がNaN
  2. xの範囲が不十分

1に関しては計算式があっているかどうかを確認して下さい。2に関しては、対数スケールに対して

python

1xs = np.linspace(0, 50, 10000)

としているため、刻み幅が約0.005(より少し大きい)となっています。そうするとx <= 5.0 * 1e-3は1点(x=0の場合のみ)しか得られないことになります。これを避けるためにはnp.logspace()を使って対数スケールに対して等幅となるようにxsを作成して下さい。例えば10の-3乗から10の2乗まで10000点で等幅とするには

python

1xs = np.logspace(-3, 2, 10000)

とします。

投稿2020/08/04 06:51

yymmt

総合スコア1615

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

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

hataki7

2020/08/04 08:33

勉強になります。 主原因として範囲設定において、1e-3<x<30のeの部分が抜けていたことによるものでした。
guest

0

python

1elif 5.0*1-3 < x < 30: 23elif 5.0*1e-3 < x < 30:

投稿2020/08/04 08:42

hataki7

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問