実現したいこと
計算処理を行いたい、が初心者なのでエラーをどう解決するべきなのかがわからない
前提
x=v/v_c の値で条件によりA(v/v_c)の関数が(F、G、H)変更するようにしたいけど配列をそのまま渡してしまうからany(),all()って聞かれてしまう。
A(x)=(G,G,G,G,F,F,F,F,F,H,H,H,H)みたく条件で変化する関数を作りたい
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-51-903ba0a3dfc3> in <module> 60 def P2(v): 61 return P(v)*ndgdb ---> 62 np.savetxt("{}/P_{}_{}_g^-{}B^-{}_g10^0-4_B10^0-4.txt".format(date,j,k,p,q),P2(v)) 63 <ipython-input-51-903ba0a3dfc3> in P2(v) 59 y[l]=P(v[l]) 60 def P2(v): ---> 61 return P(v)*ndgdb 62 np.savetxt("{}/P_{}_{}_g^-{}B^-{}_g10^0-4_B10^0-4.txt".format(date,j,k,p,q),P2(v)) 63 <ipython-input-51-903ba0a3dfc3> in P(v) 54 v_c=3*g**2*Q*B*sin_pa/(2*m*c*(2*np.pi)) 55 def P(v): ---> 56 return (np.sqrt(3)*Q**3*B*sin_pa/(m*c**2))*A(v/v_c) 57 y=np.zeros(N) 58 for l in range(N): <ipython-input-51-903ba0a3dfc3> in A(x) 35 36 def A(x): ---> 37 if x <= 5.0*1e-3: 38 return G(x) 39 elif 5.0*1e-3 < x < 30: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
該当のソースコード
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 7from sympy import * 8import os 9from matplotlib import rc 10from decimal import Decimal , ROUND_HALF_UP 11from scipy.optimize import curve_fit 12import seaborn as sns 13 14import itertools 15 16date="20231102A" 17 18m=9.1093837015e-31 * 1000 19c=299792458 * 100 20Q=4.803204673e-10 21pa=np.pi/2 22sin_pa=np.sin(pa) 23a = gamma(1/3) 24 25xs=np.logspace(-5, 3, 10000) 26 27f = lambda z: kv(5/3,z) 28 29def F(x): 30 return quad(f,x,np.inf)[0]*x 31def G(x): 32 return (4*np.pi/np.sqrt(3)/a)*(x/2)**(1/3) 33def H(x): 34 return ((np.pi/2)**(1/2))*(x**(1/2))*(np.exp(-x)) 35 36def A(x): 37 if x <= 5.0*1e-3: 38 return G(x) 39 elif 5.0*1e-3 < x < 30: 40 return F(x) 41 else: 42 return H(x) 43 44p=2 45q=3 46N=(15-0)*10 47v=np.logspace(0,15,N) 48s = 0 49for j in range(0,41): 50 for k in range(0,41): 51 g=10**(0.1*j) 52 B=10**(0.1*k) 53 ndgdb=(g**(-p))*(B**(-q))*((10**(0.1*(j+1)))-(10**(0.1*j)))*((10**(0.1*(k+1)))-(10**(0.1*k))) 54 v_c=3*g**2*Q*B*sin_pa/(2*m*c*(2*np.pi)) 55 def P(v): 56 return (np.sqrt(3)*Q**3*B*sin_pa/(m*c**2))*A(v/v_c) 57 y=np.zeros(N) 58 for l in range(N): 59 y[l]=P(v[l]) 60 def P2(v): 61 return P(v)*ndgdb 62 np.savetxt("{}/P_{}_{}_g^-{}B^-{}_g10^0-4_B10^0-4.txt".format(date,j,k,p,q),P2(v)) 63
試したこと
調べて、模索中
for文で逐次処理対応させられたら大丈夫かと思ったが同じようにエラーが出てしまう
import itertools #### j k l ### p=2 q=3 N=(15-0)*10 v=np.logspace(0,15,N) s = 0 for j in range(0,4): for k in range(0,4): g=10**(0.1*j) B=10**(0.1*k) ndgdb=(g**(-p))*(B**(-q))*((10**(0.1*(j+1)))-(10**(0.1*j)))*((10**(0.1*(k+1)))-(10**(0.1*k))) v_c=3*g**2*Q*B*sin_pa/(2*m*c*(2*np.pi)) CC=v/v_c Z=np.zeros(N) for mm in range(N): Z[mm]=A(CC[mm]) np.savetxt("{}/A_C_{}_{}_g^-{}B^-{}_g10^0-4_B10^0-4.txt".format(date,j,k,p,q),A(CC))
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-48-4af7f2999ddc> in <module> 17 for mm in range(N): 18 Z[mm]=A(CC[mm]) ---> 19 np.savetxt("{}/A_C_{}_{}_g^-{}B^-{}_g10^0-4_B10^0-4.txt".format(date,j,k,p,q),A(CC)) 20 21 <ipython-input-36-a26b605d64ec> in A(x) 1 def A(x): ----> 2 if x <= 5.0*1e-3: 3 return G(x) 4 elif 5.0*1e-3 < x < 30: 5 return F(x) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
解決後の後学勉強のため
np.vectorizeを使ってみる (np.vectorize(A)(v/v_c)だとうまく計算された)(np.vectorize(A(v/v_c))だとエラーになる
return (np.sqrt(3)*Q**3*B*sin_pa/(m*c**2))*np.vectorize(A(v/v_c))
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-56-8cbe0f1e7b70> in <module> 57 y=np.zeros(N) 58 for l in range(N): ---> 59 y[l]=P(v[l]) 60 def P2(v): 61 return P(v)*ndgdb <ipython-input-56-8cbe0f1e7b70> in P(v) 54 v_c=3*g**2*Q*B*sin_pa/(2*m*c*(2*np.pi)) 55 def P(v): ---> 56 return (np.sqrt(3)*Q**3*B*sin_pa/(m*c**2))*np.vectorize(A(v/v_c)) 57 y=np.zeros(N) 58 for l in range(N): TypeError: unsupported operand type(s) for *: 'float' and 'vectorize'
補足情報(FW/ツールのバージョンなど)
windows 11
jupyter notebook

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/11/10 07:40