123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- import numpy
- import os
- import scipy.interpolate
- import filionQuadrature
- def ln(mu,cv):
-
- m=numpy.log(mu/numpy.sqrt(1+cv*cv))
- s=numpy.sqrt(numpy.log(1+cv*cv))
- return ln_s(m,s)
- def ln_s(mu_s,sigma_s):
-
-
-
- z=numpy.random.normal()
- return numpy.exp(mu_s+sigma_s*z)
- def readCoef(sigma):
-
-
-
-
-
-
-
-
-
- fdir=os.path.join(os.path.expanduser('~'),'software','src','PBPK',
- 'lnnCoeficients20','cBase.txt')
- with open(fdir,'r') as f:
- lines=f.read().splitlines()
- fm=[q.split(' ') for q in lines]
- fm=numpy.array([[float(q) for q in x] for x in fm])
- fn=(fm.shape[1]-1)//2
-
- fa=fm[:,1:fn+1]
- fb=fm[:,fn+1:2*fn+1]
- fx=fm[:,0]
- falpha=[]
- fbeta=[]
- for i in range(fn):
- f2a = scipy.interpolate.interp1d(fx, fa[:,i], kind='cubic')
- falpha.append(f2a(sigma))
- f2b = scipy.interpolate.interp1d(fx, fb[:,i], kind='cubic')
- fbeta.append(f2b(sigma))
- return numpy.array(falpha),numpy.array(fbeta)
- def getLTransform(z,fa,fb, mu=0):
-
-
-
-
- s=1
- fn=len(fa)
- for i in range(fn):
- s*=numpy.power((1+z*numpy.exp(mu)/fb[i]),-fa[i])
- return s
- def getLTransformGrid(sigma,fz, mu=0):
-
-
-
- fa,fb=readCoef(sigma)
- fn=len(fa)
- return numpy.array([getLTransform(z,fa,fb,mu) for z in fz])
- def getComplexConjugatedLTransformAtMinusComplexConjugatedZGrid(sigma,fz, mu=0):
-
-
-
- fa,fb=readCoef(sigma)
- fn=len(fa)
- zPrime=-numpy.conj(fz)
- return numpy.conj(numpy.array([getLTransform(z,fa,fb,mu) for z in zPrime]))
- def getLTransformPart(z, fa, fb, i):
-
-
- return numpy.power((1+z/fb[i]),-fa[i])
- def getLTransformGridPart(sigma,fz,i):
-
-
-
- fa,fb=readCoef(sigma)
- fn=len(fa)
- print('Using alpha={} beta={}'.format(fa[i],fb[i]))
- return numpy.array([getLTransformPart(z,fa,fb,i) for z in fz])
- def addExpA(fz,fq,x):
-
- return fq*numpy.exp(numpy.real(fz)*x)
- def getZArray(n=2000):
-
-
-
-
- u0=0
- u1=300
-
- c=1
-
-
- fa=numpy.complex(-0.1,1)
-
-
- qh=numpy.linspace(u0,u1,2*n+1)
- h=(u1-u0)/2/n
-
- qz=c+fa/numpy.absolute(fa)*qh
- return qz,fa,u0,h
- def inverseL(fx,qz,qPhi,fa,u0,h,n):
-
- fI=numpy.zeros(len(fx),dtype=complex)
- for i in range(len(fx)):
- x=fx[i]
- qPhi1=addExpA(qz,qPhi,x)
- fRc=filionQuadrature.filionQuadrature(numpy.real(qPhi1),x,u0,h,n,'cos')
- fIc=filionQuadrature.filionQuadrature(numpy.imag(qPhi1),x,u0,h,n,'cos')
- fRs=filionQuadrature.filionQuadrature(numpy.real(qPhi1),x,u0,h,n,'sin')
- fIs=filionQuadrature.filionQuadrature(numpy.imag(qPhi1),x,u0,h,n,'sin')
- fI[i]=numpy.complex(fRc-fIs,fIc+fRs)
- fI1=fa*fI
- return numpy.imag(fI1)
- def convolveLN(fx,sigma,mu,sign):
-
-
-
-
-
- n=2000
- qz,fa,u0,h=getZArray(n)
-
- qPhi=numpy.ones(qz.size,dtype=complex)
- for i in range(len(sigma)):
- m=mu[i]
- s=sigma[i]
- if sign[i]:
- qPhi*=getLTransformGrid(sigma[i],qz,mu[i])
- continue
- qPhi*=getComplexConjugatedLTransformAtMinusComplexConjugatedZGrid(s,qz,m)
-
- return inverseL(fx,qz,qPhi,fa,u0,h,n)
|