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

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

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

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

Q&A

1回答

887閲覧

リストを変数としてNumpy関数をプロットするには

tapiocaumai0618

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/05/28 15:48

前提・実現したいこと

pythonにおいて、xの値を変化させて以下のf(x)とg(x)に代入しsについて積分して、最終的にその2乗の和をxについてプロットしたいのですが、xがリスト型なので引数に指定すると以下のエラーメッセージが発生してしまいます。解決方法はありますか…?

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

TypeError: only size-1 arrays can be converted to Python scalars ValueError: x and y must be the same size

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3from scipy import integrate 4 5x=np.arange(-0.005,0.005,0.00001) 6 7def f(s): 8 return np.cos(9.929180321080256*10**6*np.sqrt(0.0625+(x-s)**2.0))/(0.0625+(x-s)**2.0) 9 10S=integrate.quad(f, -0.005, 0.005) #integrate.quad(関数、積分範囲の下値、積分範囲の上値) 11 12def g(s): 13 return np.sin(9.929180321080256*10**6*np.sqrt(0.0625+(x-s)**2.0))/(0.0625+(x-s)**2.0) 14 15T=integrate.quad(g, -0.005, 0.005) 16S1=S[0] 17T1=T[0] 18U=(S1**2.0+T1**2.0) 19plt.plot(x,U) 20plt.show() 21

試したこと

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

Python 3.7.1

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

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

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

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

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

meg_

2020/05/29 00:48

エラーメッセージは上記で全部ですか?(エラー発生箇所の情報もないのですか?)
tapiocaumai0618

2020/05/29 02:04

不慣れですみません…。エラー発生箇所全部抜き出しました。 ``` >>> S=integrate.quad(f, -0.005, 0.005) #integrate.quad(関数、積分範囲の下値、積分範囲の上値) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\chiit\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 342, in quad points) File "C:\Users\chiit\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 453, in _quad return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) TypeError: only size-1 arrays can be converted to Python scalars >>> >>> def g(s): ... return np.sin(9.929180321080256*10**6*np.sqrt(0.0625+(x-s)**2.0))/(0.0625+(x-s)**2.0) ... >>> T=integrate.quad(g, -0.005, 0.005) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\chiit\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 342, in quad points) File "C:\Users\chiit\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 453, in _quad return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) TypeError: only size-1 arrays can be converted to Python scalars >>> S1=S[0] >>> T1=T[0] >>> U=(S1**2.0+T1**2.0) >>> plt.plot(x,U) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\chiit\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 2813, in plot is not None else {}), **kwargs) File "C:\Users\chiit\Anaconda3\lib\site-packages\matplotlib\__init__.py", line 1810, in inner return func(ax, *args, **kwargs) File "C:\Users\chiit\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py", line 1611, in plot for line in self._get_lines(*args, **kwargs): File "C:\Users\chiit\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 393, in _grab_next_args yield from self._plot_args(this, kwargs) File "C:\Users\chiit\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 370, in _plot_args x, y = self._xy_from_xy(x, y) File "C:\Users\chiit\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 231, in _xy_from_xy "have shapes {} and {}".format(x.shape, y.shape)) ValueError: x and y must have same first dimension, but have shapes (1000,) and (1,) ```
guest

回答1

0

代数計算のが楽そうだったのでsympyで書いてみましたが、plotしようとすると全然駄目ですね。ノーパソだからなのか、1時間経過してまだ描けません。質問者さんが高性能PCお持ちなら試してみてください。
ちなみに、想定している式(U)は下の画像であっていますか?

U

python3

1from sympy import Symbol, integrate, cos, sin, sqrt 2from sympy.plotting import plot 3x = Symbol('x') 4s = Symbol('s') 5 6def f(x,s): 7 return cos(9.929180321080256*10**6*sqrt(0.0625+(x-s)**2.0))/(0.0625+(x-s)**2.0) 8S=integrate(f(x,s), (s,-0.005, 0.005)) 9 10def g(x,s): 11 return sin(9.929180321080256*10**6*sqrt(0.0625+(x-s)**2.0))/(0.0625+(x-s)**2.0) 12T=integrate(g(x,s), (s,-0.005, 0.005)) 13U=(S**2.0+T**2.0)

python3

1# 描画、これが重い 2plot(U,(x,-0.005,0.005))

追記
係数を簡略化して置換積分すると、どうにか計算可能。

python3

1from sympy import Symbol, integrate, cos, sin, sqrt 2x = Symbol('x') 3s = Symbol('s') 4 5t = Symbol('t') 6a = 1 # 9.929180321080256*10**6 7b = 0 # 0.0625 8# t = b+(x-s)**2.0 9 10dsdt = -1/2/sqrt(t) # 置換積分用 ds/dt 11 12expr=cos(a*sqrt(t))/t*dsdt 13S=integrate(expr, t) 14S

S

投稿2020/05/29 01:07

編集2020/05/29 07:55
jeanbiego

総合スコア3966

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

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

tapiocaumai0618

2020/05/29 01:56

すいません自分で式を見返してみたら積分区間が間違えていたので訂正しました…!他のところは合っているのですがプロットすると以下のようなエラーが出てしまいました、どうしてでしょうか?プロットしなくてもシンタックスエラーは消えません…。 ``` File "<stdin>", line 3 S=integrate(f(x,s), (s,-0.002, 0.002)) ^ SyntaxError: invalid syntax >>> >>> def g(x,s): ... return sin(9.929180321080256*10**6*sqrt(0.0625+(x-s)**2.0))/(0.0625+(x-s)**2.0) ... T=integrate(g(x,s), (s,-0.002, 0.002)) File "<stdin>", line 3 T=integrate(g(x,s), (s,-0.002, 0.002)) ^ SyntaxError: invalid syntax >>> U=(S**2.0+T**2.0) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'float'
jeanbiego

2020/05/29 05:10

syntax errorはなぜでしょうか。コードはコピペで貼り付けても駄目でしたか? ところで、色々試してみましたがsympyだとここまで複雑な積分は解いてくれないようです。数学的な技法で、もう少し簡易な式に落とし込まないと厳しいかもしれません。
tapiocaumai0618

2020/05/29 07:10

コードはコピペしたのですが駄目でした。環境が違うのでしょうか?Windows10を使っています。沢山考えてくださったようで本当にありがとうございます…。成る程、正直に全部計算させることしか考えていませんでした。この数式は一次元の回折光の強度の式でして、数学的な落とし込みでしたらやり方を知っている人に心当たりがあるので聞いてみます。
jeanbiego

2020/05/29 07:57

お力になれずすみませんでした。 例として、係数を簡略化して置換積分したものを計算させたところ、ようやく積分を解いてくれました。(置換積分とか久しぶりにやったので、間違えてるかも… コードは回答欄末尾に追記しました。
tapiocaumai0618

2020/05/29 09:57

コードの書き方とても参考になります。ありがとうございます。無事(cosの積分)^2+(sinの積分)^2を計算させ終えることが出来ました。
jeanbiego

2020/05/29 10:23

それは良かったです。係数とか勝手に違う数字にしてしまっていますので、お気を付けください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問