pinyue / May 11 2019
Remix of Python by
Nextjournal
数据溢出的解决过程
Remix this to get started with Python
import sys; sys.version.split()[0]
'3.6.8'
1. 数据溢出的问题
1.1. 查看运行环境
查看本文件的环境配置(在Bash环境中进行)
pip list
1.2. 编写程序实现算法时出现数据溢出问题
要实现的算法
import numpy as np def coth(r_i,f,mu,Rho): omega = 2*np.pi*f temp = omega*mu/Rho temp1 = 1j*temp m = np.sqrt(temp1) x = 0.777*m*r_i result = np.cosh(x)/np.sinh(x) return result
f = 10**10 r_i = 5.9*0.001 mu = 4*np.pi*10**(-7) Rho = 172.41*10**(-10) result = coth(r_i,f,mu,Rho) result
(nan+nanj)
当f的取值大于10**9时,就会发生溢出
2. 解决数据溢出问题
安装mpmath解决数据溢出问题
pip install mpmath
再次查看本文件的环境配置(在Bash环境中进行),说明安装mpmath已经成功安装在此运行环境中。
pip list
import numpy as np import mpmath as mp def coth(r_i,f,mu,Rho): omega = 2*np.pi*f temp = omega*mu/Rho temp1 = 1j*temp # m = math.sqrt(temp1) m = np.sqrt(temp1) print(m) x = 0.777*m*r_i print(x) print(mp.cosh(x)) print(mp.sinh(x)) result = mp.cosh(x)/mp.sinh(x) return result
r_i = 5.9*0.001 f = 10**20 mu = 4*np.pi*10**(-7) Rho = 172.41*10**(-10) result = coth(r_i,f,mu,Rho) result
mpc(real='1.0', imag='0.0')
以上说明数据溢出的问题已经解决。
3. numpy和mpmath的结合问题
当计算的数据需要以numpy的array的形式输入和输出时,会出现报错:TypeError:cannot create mpf from array
import numpy as np import mpmath as mp def coth(x): return (mp.exp(x)+mp.exp(-x))/(mp.exp(x)-mp.exp(-x)) def calc_Zc(f,r,mu,rho): m=np.sqrt(1j*2*np.pi*f*mu/rho) # n=np.shape(c_xy)[0] n = 14 Zc=np.empty(n,np.complex128) Zc=rho*m/(2*np.pi*r)*coth(0.777*m*r)+0.356*rho/(np.pi*r**2) return Zc
f=5000000 conductors_calc_radius=0.001*np.array([5.9,7.00,9.5,109.1,109.1,7.60,5.35,5.9,7.00,9.5,109.1,109.1,7.60,5.35]) r=conductors_calc_radius # 单位 m #mu=4*np.pi*10**-7 # mu=np.array([4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,8.575*4*np.pi*10**-7,8.575*4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,8.575*4*np.pi*10**-7,8.575*4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7]) conductors_rho=10**-10*np.array([172.41,146.15,298.96,1666.7,1666.7,352.74,251.77,172.41,146.15,298.96,1666.7,1666.7,352.74,251.77]) rho=conductors_rho Zc=calc_Zc(f,r,mu,rho) print(Zc*10**3) print(Zc.tolist())
4. 解决问题--np.frompyfunc
pip install mpmath
import mpmath as mp import numpy as np def coth(x): #coth = (mp.exp(x)+mp.exp(-x))/(mp.exp(x)-mp.exp(-x)) coth = mp.cosh(x)/mp.sinh(x) return coth coth_vec=np.frompyfunc(coth,1,1) def calc_Zc(f,r,mu,rho): m=np.sqrt(1j*2*np.pi*f*mu/rho) # n=np.shape(c_xy)[0] n = 14 Zc=np.empty(n,np.complex128) Zc=rho*m/(2*np.pi*r)*coth_vec(0.777*m*r)+0.356*rho/(np.pi*r**2) return Zc
f=5000000 conductors_calc_radius=0.001*np.array([5.9,7.00,9.5,109.1,109.1,7.60,5.35,5.9,7.00,9.5,109.1,109.1,7.60,5.35]) r=conductors_calc_radius # 单位 m #mu=4*np.pi*10**-7 # mu=np.array([4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,8.575*4*np.pi*10**-7,8.575*4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7,8.575*4*np.pi*10**-7,8.575*4*np.pi*10**-7,4*np.pi*10**-7,4*np.pi*10**-7]) conductors_rho=10**-10*np.array([172.41,146.15,298.96,1666.7,1666.7,352.74,251.77,172.41,146.15,298.96,1666.7,1666.7,352.74,251.77]) rho=conductors_rho Zc=calc_Zc(f,r,mu,rho) print(Zc)
关于np.frompyfunc的用法参考如下: