1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import numpy
- def Taylor(x,coef):
- q=1
- s=0
- for c in coef:
- s+=c*q
- q*=x
- return s
- def filionAlpha(th,th3,sth,cth):
- if abs(th)<0.1:
- return Taylor(th,[0,0,0,2/45,0,-2/315,0,2/4725])
-
- th2=th*th
- return (th2+sth*cth*th-2*sth*sth)/th3
- def filionBeta(th,th3,sth,cth):
- if abs(th)<0.1:
- return Taylor(th,[2/3,0,2/15,0,-4/105,0,2/567,0,-4/22275])
-
- return 2*((1+cth*cth)*th-2*sth*cth)/th3
- def filionGamma(th,th3,sth,cth):
- if abs(th)<0.1:
- return Taylor(th,[4/3,0,-2/15,0,1/210,0,-1/11340])
-
- return 4*(sth-th*cth)/th3
- def cEven(qs,n):
- idx=numpy.arange(0,2*n+1,2)
- return numpy.sum(qs[idx])
- def qFunc(qf,t,x0,h,n,func):
- qx=numpy.linspace(x0,x0+2*h*n,2*n+1)
- qs=[q*func(t*x) for x,q in zip(qx,qf)]
- qs[0]*=0.5
- qs[len(qs)-1]*=0.5
- return numpy.array(qs)
-
- def cOdd(qs,n):
- idx=numpy.arange(1,2*n+1,2)
- return numpy.sum(qs[idx])
- def filionQuadrature(qf,t,x0,h,n,func,debug=0):
- #calculate integral f(x) func(tx) in [x0,x0+2*n*h]
- #where func is either cos or sine
- cFunc=numpy.cos
- iFunc=numpy.sin
- sign=1
- if func=='sin':
- cFunc=numpy.sin
- iFunc=numpy.cos
- sign=-1
- th=t*h
- sth=numpy.sin(th)
- cth=numpy.cos(th)
- th3=th*th*th
- x2n=x0+2*n*h
- A=filionAlpha(th,th3,sth,cth)
- B=filionBeta(th,th3,sth,cth)
- C=filionGamma(th,th3,sth,cth)
- qs=qFunc(qf,t,x0,h,n,cFunc)
- CE=cEven(qs,n)
- CO=cOdd(qs,n)
- D=sign*(qf[2*n]*iFunc(t*x2n)-qf[0]*iFunc(t*x0))
- r=h*(A*D+B*CE+C*CO)
- if debug:
- print('fillon r={:.2f} A={:.2f} D={:.2f} B={:.2f} CE={:.2f} C={:.2f} CO={:.2f}'.format(r,A,D,B,CE,C,CO))
- return r
-
- def tabulateFunction(f,x0,n,h):
- qx=[x0+i*h for i in range(2*n+1)]
- qy=[f(x) for x in qx]
- return qx,qy
|