CFUNC.H
上传用户:zengbais
上传日期:2022-08-08
资源大小:49k
文件大小:8k
开发平台:

C++ Builder

  1. #ifndef CFUNC_H
  2. #define CFUNC_H
  3. #include <math.h>
  4. #include "matrix.h"
  5. #include "cmatrix.h"
  6. #include "func.h"
  7. class calgo // 复数算法类,专门生成自变量为实数,运算结果为复数的算法
  8. {
  9.  private:
  10. COMPLEX yfactor; // 乘因子,初始化为1
  11. DOUBLE xfactor; // x轴放大因子,初始化为1
  12. COMPLEX addconst; // 加和,初始化为0
  13. DOUBLE xshift; // x平移量,初始化为0
  14.  public:
  15. unsigned refnum; // 引用数,初始化为1
  16. calgo():refnum(1),yfactor(1.0),xfactor(1.0),addconst(0.0),xshift(0.0){};
  17.  // 构造函数,产生y=x线性函数
  18. calgo(DOUBLE xs, DOUBLE xf,COMPLEX adc=0.0, COMPLEX yf=1.0):refnum(1),
  19. yfactor(yf),addconst(adc),xshift(xs),xfactor(xf){};
  20. calgo(COMPLEX a):refnum(1),yfactor(0.0),xfactor(1.0),addconst(a),xshift(0.0)
  21. {};  // 常函数的构造
  22. calgo(calgo & alg):yfactor(alg.yfactor),xfactor(alg.xfactor),
  23. addconst(alg.addconst),xshift(alg.xshift),refnum(1){}; // 拷贝构造函数
  24. virtual ~calgo(){}; // 虚析构函数
  25. COMPLEX cal(DOUBLE x); // 计算算法值
  26. virtual COMPLEX calculate(DOUBLE x)
  27. {return x;}; // 本身算法,将被继承子类改写
  28. virtual calgo * clone(); // 克隆自己,必须被继承子类改写
  29. calgo * mul(COMPLEX a); // 乘a
  30. calgo * add(COMPLEX a); // 加a
  31. calgo * neg(); // 取负
  32. calgo * setxfactor(DOUBLE x); // 设置x轴因子
  33. calgo * xroom(DOUBLE x); // 将xfactor扩大x倍
  34. calgo * setxshift(DOUBLE x); // 设置xshift的值
  35. calgo * xshiftas(DOUBLE x); // 从当前开始平移x
  36. };
  37. class calgojoin : public calgo // 结合算法
  38. {
  39.  public:
  40. calgo * leftalgo; // 左算法,初始化为0
  41. calgo * rightalgo; // 右算法,初始化为0
  42. method met; // 指明算法
  43. calgojoin(calgo * l, calgo * r, method m):leftalgo(l),
  44. rightalgo(r), met(m)
  45. { if(leftalgo)
  46. leftalgo->refnum++;
  47.   if(rightalgo)
  48. rightalgo->refnum++;
  49. };
  50. calgojoin(calgojoin& alg):calgo(alg),
  51. leftalgo(alg.leftalgo),rightalgo(alg.rightalgo),met(alg.met){
  52. if(leftalgo)
  53. leftalgo->refnum++;
  54. if(rightalgo)
  55. rightalgo->refnum++;};
  56. // 拷贝构造函数
  57. virtual ~calgojoin() {
  58. if(leftalgo) { // 如左或者右算法已经没有被引用,则删除
  59. leftalgo->refnum--;
  60. if(!leftalgo->refnum) delete leftalgo;
  61. }
  62. if(rightalgo) {
  63. rightalgo->refnum--;
  64. if(!rightalgo->refnum) delete rightalgo;
  65. }
  66. };
  67. virtual calgo * clone(); // 克隆自己
  68. virtual COMPLEX calculate(DOUBLE x); // 实施结合算法
  69. };
  70. class calgofun : public calgo // 函数算法
  71. {
  72.  public:
  73. COMPLEX (*f)(DOUBLE); // 函数指针
  74. calgofun(COMPLEX (*fun)(DOUBLE)):f(fun){}; // 用函数指针进行初始化
  75. calgofun(calgofun& alg):calgo(alg),f(alg.f){}; // 拷贝构造函数
  76. virtual COMPLEX calculate(DOUBLE x); // 实施函数算法
  77. virtual calgo * clone(); // 克隆自己
  78. };
  79. class calgopoly : public calgo // 复多项式
  80. {
  81.  public:
  82. cmatrix data; // n乘1矩阵,存放n-1次多项式的系数a(0)到a(n-1)
  83. calgopoly(cmatrix& d):data(d){}; // 用矩阵构造多项式
  84. calgopoly(calgopoly& alg):calgo(alg),data(alg.data){}; // 拷贝构造函数
  85. virtual COMPLEX calculate(DOUBLE x); // 实施函数算法
  86. virtual calgo * clone(); // 克隆自己
  87. };
  88. class calgoenter : public calgo // 等间隔插值算法
  89. {
  90.  public:
  91. algoenter * er;
  92. algoenter * ei; // 两个插值算法构成结果的实部与虚部
  93. calgoenter(matrix& ver, matrix& vei, DOUBLE x0, DOUBLE h):
  94. er(new algoenter(ver,x0,h)), ei(new algoenter(vei,x0,h)) {};
  95. calgoenter(calgoenter& alg):calgo(alg),er(alg.er),ei(alg.ei) {
  96. er->refnum++; ei->refnum++;} // 拷贝构造函数
  97. virtual ~calgoenter(){
  98. er->refnum--;
  99. if(!er->refnum) delete er;
  100. ei->refnum--;
  101. if(!ei->refnum) delete ei;};
  102. virtual COMPLEX calculate(DOUBLE x); // 实施函数算法
  103. virtual calgo * clone(); // 克隆自己
  104. };
  105. class cfunc { // 复函数类,计算自变量为实数而结果是复数的类
  106.  public:
  107. calgo * alg; // 决定函数的算法
  108. cfunc(); // 缺省构造函数
  109. cfunc(COMPLEX a); // 常函数的构造函数
  110. cfunc(COMPLEX (*fun)(DOUBLE)); // 函数指针的构造函数
  111. cfunc(cfunc & fn); // 拷贝构造函数
  112. cfunc(calgo * a):alg(a){} // 算法构造函数,使用要小心,不能将一个算法产生
  113. // 两个函数,除非自己控制引用数的增加
  114. cfunc(cmatrix& m); // 构造多项式,m为nX1矩阵,是n-1阶多项式系数,
  115. // 其中m(0,0)为常数项,m(n-1,0)为n-1次项。
  116. virtual ~cfunc() { // 析构函数
  117. if(alg) {
  118. alg->refnum--; // 引用数减一,如再无其它引用,则删除算法
  119. if(!alg->refnum)
  120. delete alg;
  121. }
  122. };
  123. COMPLEX operator()(DOUBLE x){return alg->cal(x);}; // 计算x的函数值
  124. cfunc& operator=(cfunc& fn); // 赋值运算符
  125. cfunc& operator=(COMPLEX (*fn)(DOUBLE)); // 用函数指针的赋值运算符
  126. cfunc& operator=(COMPLEX a); // 常函数的赋值运算符
  127. cfunc& operator+=(cfunc& fn); // 自身加一个函数
  128. cfunc& operator+=(COMPLEX a){alg=alg->add(a);return (*this);};
  129. //自身加一个常数
  130. cfunc& operator+=(COMPLEX (*f)(DOUBLE)); // 自身加一个函数指针
  131. cfunc operator+(cfunc& fn); // 相加产生新函数
  132. cfunc operator+(COMPLEX a); // 与常数相加产生新函数
  133. friend cfunc operator+(COMPLEX a, cfunc& f); // 同上但常数在前
  134. cfunc operator+(COMPLEX (*f)(DOUBLE)); // 加一个函数指针产生新函数
  135. friend cfunc operator+(COMPLEX (*f)(DOUBLE),cfunc& fn);
  136. // 同上但函数指针在前
  137. cfunc& neg(); // 自身取负
  138. cfunc operator-(); // 产生负函数
  139. cfunc& operator-=(cfunc& fn); // 自身减一个函数
  140. cfunc& operator-=(COMPLEX a){alg=alg->add(-a);return (*this);};
  141. //自身减一个常数
  142. cfunc& operator-=(COMPLEX (*f)(DOUBLE)); // 自身减一个函数指针
  143. cfunc operator-(cfunc& fn); // 相减产生新函数
  144. cfunc operator-(COMPLEX a); // 与常数相减产生新函数
  145. friend cfunc operator-(COMPLEX a, cfunc& f); // 同上但常数在前
  146. cfunc operator-(COMPLEX (*f)(DOUBLE)); // 减一个函数指针产生新函数
  147. friend cfunc operator-(COMPLEX (*f)(DOUBLE),cfunc& fn); // 函数指针减函数
  148. cfunc& operator*=(cfunc& fn); // 自身乘一个函数
  149. cfunc& operator*=(COMPLEX a){alg=alg->mul(a);return (*this);};
  150. //自身乘一个常数
  151. cfunc& operator*=(COMPLEX (*f)(DOUBLE)); // 自身乘一个函数指针
  152. cfunc operator*(cfunc& fn); // 相乘产生新函数
  153. cfunc operator*(COMPLEX a); // 与常数相乘产生新函数
  154. friend cfunc operator*(COMPLEX a, cfunc& f); // 同上但常数在前
  155. cfunc operator*(COMPLEX (*f)(DOUBLE)); // 乘一个函数指针产生新函数
  156. friend cfunc operator*(COMPLEX (*f)(DOUBLE),cfunc& fn); // 函数指针乘函数
  157. cfunc& operator/=(cfunc& fn); // 自身除以一个函数
  158. cfunc& operator/=(COMPLEX a){alg=alg->mul(1.0/a);return (*this);
  159. };//自身除以常数
  160. cfunc& operator/=(COMPLEX (*f)(DOUBLE)); // 自身除以一个函数指针
  161. cfunc operator/(cfunc& fn); // 相除产生新函数
  162. cfunc operator/(COMPLEX a); // 与常数相除产生新函数
  163. friend cfunc operator/(COMPLEX a, cfunc& f); // 常数除以函数
  164. cfunc operator/(COMPLEX (*f)(DOUBLE)); // 除以一个函数指针产生新函数
  165. friend cfunc operator/(COMPLEX (*f)(DOUBLE),cfunc& fn); // 函数指针除以函数
  166. void setxfactor(DOUBLE a); // 设置x因子为a
  167. void xroom(DOUBLE a);   // x方向扩大a倍
  168. void setxshift(DOUBLE a); // 设置函数沿x轴平移a
  169. void shiftxas(DOUBLE a); // 函数沿x轴右移a
  170. cfunc& power(cfunc& f); // 函数的f次乘幂,函数自身改变
  171. cfunc& power(COMPLEX a); // 函数的a次幂,函数自身改变
  172. cfunc operator^(cfunc & fn); // 函数的fn次乘幂,产生新函数,原函数不变
  173. cfunc operator^(COMPLEX a);  // 函数的a次幂,产生新函数,原函数不变
  174. };
  175. inline cfunc operator+(COMPLEX a, cfunc& f) // 常数加函数
  176. { return f+a; }
  177. inline cfunc operator+(COMPLEX (*f)(DOUBLE),cfunc& fn) // 函数指针加函数
  178. { return fn+f;}
  179. cfunc operator-(COMPLEX a, cfunc& f); // 常数减函数
  180. cfunc operator-(COMPLEX (*f)(DOUBLE),cfunc& fn); // 函数指针减函数
  181. inline cfunc operator*(COMPLEX a, cfunc& f) // 常数乘函数
  182. { return f*a; }
  183. inline cfunc operator*(COMPLEX (*f)(DOUBLE),cfunc& fn) // 函数指针乘函数
  184. { return fn*f;}
  185. cfunc operator/(COMPLEX a, cfunc& f); // 常数除以函数
  186. cfunc operator/(COMPLEX (*f)(DOUBLE),cfunc& fn); // 函数指针除以函数
  187. class cfuncenter: public cfunc { // 插值复函数
  188.  public:
  189. cfuncenter(cmatrix& s,DOUBLE t0, DOUBLE dt);
  190. };
  191. cfunc fourier(func& f,DOUBLE tb, DOUBLE te, DOUBLE dt, DOUBLE df);
  192. // 利用fft技术对函数f作傅里叶变换,其中tb为采样窗口的起始点,te为结束点,
  193. // 必须te>tb,dt为采样间隔,df为频率采样间隔,但返回的cfunc是作了插值的
  194. // 插值函数
  195. #endif // CFUNC_H