home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / derive / download / Setup.exe / %MAINDIR% / Users / Z Transforms.mth < prev   
Encoding:
Text File  |  2002-05-15  |  3.8 KB  |  75 lines

  1. NATURAL?(n):=IF(n>=0 AND INTEGER?(n),true,false,false)
  2.  
  3. REAL?(n):=IF(DIM(VARIABLES(n))=0,IF(IM(n)=0,true,false,false),false,false)
  4.  
  5. PRODUCTS(f):=MAP_LIST(v SUB 1^v SUB 2,v,FACTORS(f))
  6.  
  7. CONTAINS?(u,z,store):=PROG(store:=VariableOrder,VariableOrder:=[z],IF((VARIAB~
  8. LES(u)) SUB 1=z,(VariableOrder:=store) AND RETURN(true),(VariableOrder:=store~
  9. ) AND RETURN(false),(VariableOrder:=store) AND RETURN(false)))
  10.  
  11. SIN?(f,str):=PROG(str:=STRING(f),IF(str SUB 1="SIN",RETURN([true,str SUB 2]))~
  12. ,[false])
  13.  
  14. COS?(f,str):=PROG(str:=STRING(f),IF(str SUB 1="COS",RETURN([true,str SUB 2]))~
  15. ,[false])
  16.  
  17. POLY_EXP?(f,k,det1,det2,base,vars,const,power):=PROG(det1:=f/SUBST(f,k,k/2),d~
  18. et2:=SUBST(det1,k,k+1)/det1,base:=det2^2,vars:=VARIABLES(base),MAP(IF(r=k,RET~
  19. URN([false])),r,vars),power:=k*(DIF(f,k)/f-LN(base)),const:=f/(k^power*base^k~
  20. ),[true,const,base,power])
  21.  
  22. POLY_EXPZT(z,a,b,c):=a*ITERATE(-z*DIF(u,z),u,z/(z-b),c)
  23.  
  24. LINSIN?(f,z,str,infunc):=PROG(str:=STRING(f),IF(NOT(NAME_TO_CODES(str SUB 1)=~
  25. [83,73,78]),RETURN([false])),infunc:=str SUB 2,IF(NOT(CONTAINS?(infunc,z)),RE~
  26. TURN([false])),IF(CONTAINS?(DIF(infunc,z),z),RETURN([false])),[true,DIF(infun~
  27. c,z),SUBST(infunc,z,0)])
  28.  
  29. LINCOS?(f,z,str,infunc):=PROG(str:=STRING(f),IF(NOT(NAME_TO_CODES(str SUB 1)=~
  30. [67,79,83]),RETURN([false])),infunc:=str SUB 2,IF(NOT(CONTAINS?(infunc,z)),RE~
  31. TURN([false])),IF(CONTAINS?(DIF(infunc,z),z),RETURN([false])),[true,DIF(infun~
  32. c,z),SUBST(infunc,z,0)])
  33.  
  34. LINSINZT(z,a,b):=#i*z*#e^(-b*#i)*(#e^(2*a*#i)+z*#e^(a*#i)*(#e^(2*b*#i)-1)-#e^~
  35. (2*b*#i))/(2*(#e^(a*#i)-z)*(z*#e^(a*#i)-1))
  36.  
  37. LINCOSZT(z,a,b):=z*#e^(-b*#i)*(#e^(2*a*#i)-z*#e^(a*#i)*(#e^(2*b*#i)+1)+#e^(2*~
  38. b*#i))/(2*(#e^(a*#i)-z)*(z*#e^(a*#i)-1))
  39.  
  40. PROD?(f,sf):=PROG(sf:=STRING(f),IF(sf SUB 1="ยท",RETURN([true,REST(sf)])),[fal~
  41. se])
  42.  
  43. ZT(f,k,z,transforms,terms,size,counter,term,poly,linsin,lincos,prod,prods):=P~
  44. ROG(transforms:=[],terms:=TERMS(EXPAND(f,k)),size:=DIM(terms),counter:=1,LOOP~
  45. (IF(counter>size,exit),term:=terms SUB counter,PROG(poly:=POLY_EXP?(term,k),I~
  46. F(poly SUB 1,IF(NATURAL?(poly SUB 4),(transforms:=ADJOIN(POLY_EXPZT(z,poly SU~
  47. B 2,poly SUB 3,poly SUB 4),transforms)) AND exit)),linsin:=LINSIN?(term,k),IF~
  48. (linsin SUB 1,(transforms:=ADJOIN(LINSINZT(z,linsin SUB 2,linsin SUB 3),trans~
  49. forms)) AND exit),lincos:=LINCOS?(term,k),IF(lincos SUB 1,(transforms:=ADJOIN~
  50. (LINCOSZT(z,lincos SUB 2,lincos SUB 3),transforms)) AND exit),prod:=PROD?(ter~
  51. m),IF(NOT(prod SUB 1),RETURN('ZT(f,k,z))),prod:=(DELETE(prod,1)) SUB 1,prods:~
  52. =[1,1],MAP(IF(CONTAINS?(v,k),prods SUB 2:*v,prods SUB 1:*v),v,prod),linsin:=L~
  53. INSIN?(prods SUB 2,k),IF(linsin SUB 1,(transforms:=ADJOIN(prods SUB 1*LINSINZ~
  54. T(z,linsin SUB 2,linsin SUB 3),transforms)) AND exit),lincos:=LINCOS?(prods S~
  55. UB 2,k),IF(lincos SUB 1,(transforms:=ADJOIN(prods SUB 1*LINCOSZT(z,lincos SUB~
  56.  2,lincos SUB 3),transforms)) AND exit)),counter:+1),SUM(transforms))
  57.  
  58. residues(f_,z,z0,m):=LIM(1/(m-1)!*DIF((z-z0)^m*f_,z,m-1),z,z0)
  59.  
  60. Zero_Poles?(f,z,denoms,order,counter,size):=PROG(denoms:=FACTORS(DENOMINATOR(~
  61. f),Rational,z),size:=DIM(denoms),counter:=1,LOOP(IF(counter>size,RETURN([fals~
  62. e])),IF(denoms SUB counter SUB 1=z,RETURN([true,denoms SUB counter SUB 2])),c~
  63. ounter:+1))
  64.  
  65. INVZT(f,z,n,denoms,size,count,sols,poles,orders,expr,ans,ZeroP):=PROG(denoms:~
  66. =FACTORS(DENOMINATOR(f),Complex,z),size:=DIM(denoms),count:=1,poles:=[],order~
  67. s:=[],LOOP(IF(count>size,exit),expr:=denoms SUB count SUB 1,IF(CONTAINS?(expr~
  68. ,z),PROG(sols:=SOLUTIONS(expr,z),IF(sols SUB 1=0,exit),IF(DIM(sols)>1,orders:~
  69. =APPEND(orders,VECTOR(denoms SUB count SUB 2,r,1,DIM(sols))),orders:=APPEND(o~
  70. rders,[denoms SUB count SUB 2])),poles:=APPEND(poles,sols))),count:+1),size:=~
  71. DIM(poles),IF(DIM(orders)/=size,RETURN(false)),ans:=SUM(VECTOR(residues(f*z^(~
  72. n-1),z,poles SUB r,orders SUB r),r,1,size)),ZeroP:=Zero_Poles?(z^(-1)*f,z),IF~
  73. (ZeroP SUB 1,RETURN(ans*STEP(n-ZeroP SUB 2))),ans)
  74.  
  75.