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

C++ Builder

  1. #include <values.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include "func.h"
  5. DOUBLE algo::cal(DOUBLE x) { // 基类的基本算法
  6. return yfactor*calculate(xfactor*(x-xshift))+addconst;
  7. }
  8. algo * algo::clone() // 克隆自己,必须被继承子类改写
  9. {
  10. return new algo(*this);
  11. }
  12. algo * algo::mul(DOUBLE a) // 乘a
  13. {
  14. algo * alg;
  15. alg = this;
  16. if(refnum>1) { refnum--;
  17. alg = clone(); // 如引用数大于1,则产生新的对象
  18. }
  19. alg->yfactor *= a;
  20. alg->addconst *= a;
  21. return alg;
  22. }
  23. algo * algo::add(DOUBLE a) // 加a
  24. {
  25. algo * alg;
  26. alg = this;
  27. if(refnum>1) { refnum--;
  28. alg = clone(); // 如引用数大于1,则产生新的对象
  29. }
  30. alg->addconst += a;
  31. return alg;
  32. }
  33. algo * algo::neg() // 取负
  34. {
  35. algo * alg;
  36. alg = this;
  37. if(refnum>1) { refnum--;
  38. alg = clone(); // 如引用数大于1,则产生新的对象
  39. }
  40. alg->addconst = -alg->addconst;
  41. alg->yfactor = -alg->yfactor;
  42. return alg;
  43. }
  44. algo * algo::setxfactor(DOUBLE x) // 设置x轴因子
  45. {
  46. algo * alg;
  47. alg = this;
  48. if(refnum>1) { refnum--;
  49. alg = clone(); // 如引用数大于1,则产生新的对象
  50. }
  51. alg->xfactor = x;
  52. return alg;
  53. }
  54. algo * algo::xroom(DOUBLE x) // 将xfactor扩大x倍
  55. {
  56. algo * alg;
  57. alg = setxfactor(x*xfactor);
  58. if(x!=0)alg->xshift/=x;
  59. return alg;
  60. }
  61. algo * algo::setxshift(DOUBLE x) // 设置xshift的值
  62. {
  63. algo * alg;
  64. alg = this;
  65. if(refnum>1) { refnum--;
  66. alg = clone(); // 如引用数大于1,则产生新的对象
  67. }
  68. alg->xshift = x;
  69. return alg;
  70. }
  71. algo * algo::xshiftas(DOUBLE x) // 从当前开始平移x
  72. {
  73. return setxshift(xshift+x);
  74. }
  75. algo * algojoin::clone() // 克隆自己
  76. {
  77. return new algojoin(*this);
  78. }
  79. DOUBLE algojoin::calculate(DOUBLE x) // 实施结合算法
  80. {
  81. if(leftalgo==0 || rightalgo==0)
  82. throw TMESSAGE("empty algo pointor!");
  83. DOUBLE a,b;
  84. if(met == ccom) // 复合函数
  85. return leftalgo->cal(rightalgo->cal(x));
  86. a = leftalgo->cal(x);
  87. b = rightalgo->cal(x);
  88. if(met == cadd) // 返回各结合运算值
  89. return a+b;
  90. else if(met == csub)
  91. return a-b;
  92. else if(met == cmul)
  93. return a*b;
  94. else if(met == cdiv)
  95. return a/b;
  96. else if(met == cpow)
  97. return pow(a,b);
  98. return 0.0;
  99. }
  100. algo * algofun::clone() // 克隆自己
  101. {
  102. return new algofun(*this);
  103. }
  104. DOUBLE algofun::calculate(DOUBLE x) // 实施函数算法
  105. {
  106. if(f)
  107. return f(x);
  108. return 0.0;
  109. }
  110. func::func()// 缺省构造函数,产生函数f(x)=x;
  111. {
  112. alg = new algo();
  113. }
  114. func::func(func & fn) // 拷贝构造函数
  115. {
  116. alg = fn.alg;
  117. alg->refnum++;
  118. }
  119. func::func(DOUBLE (*fun)(DOUBLE)) // 函数指针的构造函数
  120. {
  121. alg = new algofun(fun);
  122. }
  123. func::func(DOUBLE a) // 常函数构造函数
  124. {
  125. alg = new algo(a);
  126. }
  127. func::func(algo * a) // 算法的构造函数
  128. {
  129. if(a)
  130. alg = a;
  131. }
  132. func::func(algo& a) // 另一种算法构造函数
  133. {
  134. alg = a.clone(); // 克隆出一个同样的算法变量并将指针赋予alg.
  135. }
  136. func& func::operator=(func& fn) // 赋值运算符
  137. {
  138. if(this == &fn) return (*this); // 如果等于自己,干脆啥也别做
  139. if(alg) {
  140. alg->refnum--; // 原算法引用数减1
  141. if(!alg->refnum) // 如结果为0则删除原算法
  142. delete alg;
  143. }
  144. alg = fn.alg; // 将fn的算法移过来
  145. if(alg) alg->refnum++; // 引用数增加
  146. return (*this);
  147. }
  148. func& func::operator=(DOUBLE (*fn)(DOUBLE)) // 用函数指针的赋值运算符
  149. {
  150. if(alg) {
  151. alg->refnum--; // 原算法引用数减1
  152. if(!alg->refnum) // 如结果为0则删除原算法
  153. delete alg;
  154. }
  155. alg = new algofun(fn);
  156. return (*this);
  157. }
  158. func& func::operator=(DOUBLE a) // 常函数的赋值运算符
  159. {
  160. if(alg) {
  161. alg->refnum--; // 原算法引用数减1
  162. if(!alg->refnum) // 如结果为0则删除原算法
  163. delete alg;
  164. }
  165. alg = new algo(a);
  166. return (*this);
  167. }
  168. func& func::operator+=(func& fn) // 自身加一个函数
  169. {
  170. algo * a = new algojoin(alg, fn.alg, cadd);
  171. alg->refnum--; // 因为联合算法对两个算法都加了引用数,因此再减回来
  172. alg = a; // 将新指针赋给alg
  173. return (*this);
  174. }
  175. func& func::operator+=(DOUBLE (*f)(DOUBLE)) // 自身加一个函数指针
  176. {
  177. func fn(f); // 将函数指针包装为函数类
  178. operator+=(fn); // 实施加操作
  179. return (*this);
  180. }
  181. func func::operator+(func& fn) // 相加产生新函数
  182. {
  183. algo * a = new algojoin(alg, fn.alg, cadd);
  184. func f(a);
  185. return f;
  186. }
  187. func func::operator+(DOUBLE a) // 与常数相加产生新函数
  188. {
  189. func f(*this);
  190. f += a;
  191. return f;
  192. }
  193. func func::operator+(DOUBLE (*f)(DOUBLE)) // 加一个函数指针产生新函数
  194. {
  195. func ff(*this);
  196. ff += f;
  197. return ff;
  198. }
  199. func& func::neg() // 自身取负
  200. {
  201. alg=alg->neg();
  202. return (*this);
  203. }
  204. func func::operator-() // 产生负函数
  205. {
  206. func f(*this);
  207. f.neg();
  208. return f;
  209. }
  210. func& func::operator-=(func& fn) // 自身减一个函数
  211. {
  212. algo * a = new algojoin(alg, fn.alg, csub);
  213. alg->refnum--; // 因为联合算法对两个算法都加了引用数,因此再减回来
  214. alg = a; // 将新指针赋给alg
  215. return (*this);
  216. }
  217. func& func::operator-=(DOUBLE (*f)(DOUBLE)) // 自身减一个函数指针
  218. {
  219. func fn(f); // 将函数指针包装为函数类
  220. operator-=(fn); // 实施减操作
  221. return (*this);
  222. }
  223. func func::operator-(func& fn) // 相减产生新函数
  224. {
  225. algo * a = new algojoin(alg, fn.alg, csub);
  226. func f(a);
  227. return f;
  228. }
  229. func func::operator-(DOUBLE a) // 与常数相减产生新函数
  230. {
  231. func f(*this);
  232. f -= a;
  233. return f;
  234. }
  235. func operator-(DOUBLE a, func& f) // 常数减函数
  236. {
  237. return (-f)+a;
  238. }
  239. func func::operator-(DOUBLE (*f)(DOUBLE)) // 减一个函数指针产生新函数
  240. {
  241. func ff(*this);
  242. ff -= f;
  243. return ff;
  244. }
  245. func operator-(DOUBLE (*f)(DOUBLE),func& fn) // 函数指针减函数
  246. {
  247. func ff(f);
  248. ff -= fn;
  249. return ff;
  250. }
  251. func& func::operator*=(func& fn) // 自身乘一个函数
  252. {
  253. algo * a = new algojoin(alg, fn.alg, cmul);
  254. alg->refnum--; // 因为联合算法对两个算法都加了引用数,因此再减回来
  255. alg = a; // 将新指针赋给alg
  256. return (*this);
  257. }
  258. func& func::operator*=(DOUBLE (*f)(DOUBLE)) // 自身乘一个函数指针
  259. {
  260. func fn(f); // 将函数指针包装为函数类
  261. operator*=(fn); // 实施乘操作
  262. return (*this);
  263. }
  264. func func::operator*(func& fn) // 相乘产生新函数
  265. {
  266. algo * a = new algojoin(alg, fn.alg, cmul);
  267. func f(a);
  268. return f;
  269. }
  270. func func::operator*(DOUBLE a) // 与常数相乘产生新函数
  271. {
  272. func f(*this);
  273. f *= a;
  274. return f;
  275. }
  276. func func::operator*(DOUBLE (*f)(DOUBLE)) // 乘一个函数指针产生新函数
  277. {
  278. func ff(*this);
  279. ff *= f;
  280. return ff;
  281. }
  282. func& func::operator/=(func& fn) // 自身除以一个函数
  283. {
  284. algo * a = new algojoin(alg, fn.alg, cdiv);
  285. alg->refnum--; // 因为联合算法对两个算法都加了引用数,因此再减回来
  286. alg = a; // 将新指针赋给alg
  287. return (*this);
  288. }
  289. func& func::operator/=(DOUBLE (*f)(DOUBLE)) // 自身除以一个函数指针
  290. {
  291. func fn(f); // 将函数指针包装为函数类
  292. operator/=(fn); // 实施除法操作
  293. return (*this);
  294. }
  295. func func::operator/(func& fn) // 相除产生新函数
  296. {
  297. algo * a = new algojoin(alg, fn.alg, cdiv);
  298. func f(a);
  299. return f;
  300. }
  301. func func::operator/(DOUBLE a) // 与常数相除产生新函数
  302. {
  303. func f(*this);
  304. f /= a;
  305. return f;
  306. }
  307. func operator/(DOUBLE a, func& f) // 常数除以函数
  308. {
  309. func ff(a);
  310. return ff/f;
  311. }
  312. func func::operator/(DOUBLE (*f)(DOUBLE)) // 除以一个函数指针产生新函数
  313. {
  314. func ff(*this);
  315. ff /= f;
  316. return ff;
  317. }
  318. func operator/(DOUBLE (*f)(DOUBLE),func& fn) // 函数指针除以函数
  319. {
  320. func ff(f);
  321. ff /= fn;
  322. return ff;
  323. }
  324. void func::setxfactor(DOUBLE a) // 设置x因子为a
  325. {
  326. alg = alg->setxfactor(a);
  327. }
  328. void func::xroom(DOUBLE a)   // x方向扩大a倍
  329. {
  330. alg = alg->xroom(a);
  331. }
  332. func& func::power(func& f) // 函数的f次乘幂,函数自身改变
  333. {
  334. algo * a = new algojoin(alg, f.alg, cpow);
  335. alg->refnum--; // 因为联合算法对两个算法都加了引用数,因此再减回来
  336. alg = a; // 将新指针赋给alg
  337. return (*this);
  338. }
  339. func func::operator^(func& fn) // f次乘幂,产生新函数
  340. {
  341. algo * a = new algojoin(alg, fn.alg, cpow);
  342. func f(a);
  343. return f;
  344. }
  345. func& func::power(DOUBLE a) // 函数的a次幂,函数自身改变
  346. {
  347. func f(a);
  348. return power(f);
  349. }
  350. func func::operator^(DOUBLE a)  // 函数的a次幂,产生新函数,原函数不变
  351. {
  352. func f(a);
  353. func ff(*this);
  354. return ff.power(f);
  355. }
  356. func func::operator()(func & fn) // 复合函数,产生新的函数
  357. {
  358. algo * a = new algojoin(alg, fn.alg, ccom);
  359. func f(a);
  360. return f;
  361. }
  362. DOUBLE algopoly::calculate(DOUBLE x) // 实施函数算法
  363. {
  364. size_t i;
  365. DOUBLE u;
  366. size_t n=data.rownum-1;
  367. u=data(n,0);
  368. for (i=n; i>0; i--)
  369. u=u*x+data(i-1,0);
  370. return u;
  371. }
  372. algo * algopoly::clone() // 克隆自己
  373. {
  374. return new algopoly(*this);
  375. }
  376. DOUBLE algogass::calculate(DOUBLE x) // 实施函数算法
  377. {
  378. return gass(0,1,x);
  379. }
  380. algo * algogass::clone() // 克隆自己
  381. {
  382. return new algogass(*this);
  383. }
  384. func::func(DOUBLE a, DOUBLE d) // 产生正态分布函数a为均值,d为标准差
  385. {
  386. alg = new algogass(a,d);
  387. }
  388. func::func(matrix& m, funckind kind) // 构造数值相关函数,
  389. // 如kind = polyfunc, 则m为nX1矩阵,是n-1阶多项式系数,
  390. // 其中m(0,0)为常数项,m(n-1,0)为n-1次项。
  391. {
  392. if(kind == polyfunc)
  393. alg = new algopoly(m); // 产生多项式算法
  394. else if(kind == enter2func)
  395. alg = new algoenter2(m); // 产生一元全区间不等距插值
  396. }
  397. DOUBLE algoenter2::calculate(DOUBLE x) // 实施函数算法
  398. {
  399. size_t n = data.rownum;
  400. size_t i,j,k,m;
  401. double z,s;
  402. z=0.0;
  403. if (n<1) return(z);
  404. if (n==1) { z=data(0,1); return z;}
  405. if (n==2) {
  406. z = data(0,1)*(x-data(1,0))-data(1,1)*(x-data(0,0))/
  407. (data(0,0)-data(1,0));
  408.   return(z);
  409. }
  410. i=0;
  411. while ((i<n) && (data(i,0)<x)) i++; // ((x[i]<t)&&(i<n)) i=i+1;
  412. if (i<4) k=0;
  413. else k=i-4;
  414. m=i+3;
  415. if (m>n-1) m=n-1;
  416. for (i=k;i<=m;i++)
  417. { s=1.0;
  418. for (j=k;j<=m;j++)
  419. if (j!=i) s *= (x-data(j,0))/(data(i,0)-data(j,0)); //s=s*(t-x[j])/(x[i]-x[j]);
  420. z=z+s*data(i,1); // y[i];
  421. }
  422. return(z);
  423. }
  424. algo * algoenter2::clone() // 克隆自己
  425. {
  426. return new algoenter2(*this);
  427. }
  428. DOUBLE algoenter::calculate(DOUBLE x) // 实施函数算法
  429. {
  430. // double eelgr(x0,h,n,y,t)
  431. size_t n=data.rownum;
  432. //  double x0,h,t,y[];
  433. size_t i,j,k,m;
  434. DOUBLE z,s,xi,xj,p,q;
  435. z=0.0;
  436. if (n<1) return z;
  437. if (n==1) { z=data(0); return(z);}
  438. if (n==2)
  439. { z=(data(1)*(x-x0)-data(0)*(x-x0-h))/h;
  440. return z;
  441. }
  442. if (x>x0)
  443. { p=(x-x0)/h; q = floor(p); i=q;
  444. if (p>q) i++;
  445. }
  446. else i=0;
  447. k=i-4;
  448. if (i<4) k=0;
  449. else k=i-4;
  450. m=i+3;
  451. if (m>n-1) m=n-1;
  452. for (i=k;i<=m;i++)
  453. { s=1.0; xi=x0+i*h;
  454. for (j=k; j<=m; j++)
  455. if (j!=i)
  456. { xj=x0+j*h;
  457. s*=(x-xj)/(xi-xj);
  458. }
  459. z=z+s*data(i);
  460. }
  461. return z;
  462. }
  463. algo * algoenter::clone() // 克隆自己
  464. {
  465. return new algoenter(*this);
  466. }
  467. func::func(matrix& m, DOUBLE x0, DOUBLE h) // 构造等距插值函数
  468. // 其中m是nX1阶矩阵,代表n个y值,x0是起始点,h是步长(采样间隔)
  469. {
  470. alg = new algoenter(m,x0,h);
  471. }
  472. void func::setxshift(DOUBLE a) // 设置函数沿x轴平移a
  473. {
  474. alg = alg->setxshift(a);
  475. }
  476. void func::shiftxas(DOUBLE a) // 函数沿x轴右移a
  477. {
  478. alg = alg->xshiftas(a);
  479. }
  480. DOUBLE algo::integ(DOUBLE a, DOUBLE b, DOUBLE eps) // 在(a,b)区间积分
  481. // 采用勒让德高斯求积法
  482. {
  483.  size_t m,i,j;
  484.  DOUBLE s,p,ep,h,aa,bb,w,x,g;
  485.  static DOUBLE t[5]={-0.9061798459,-0.5384693101,0.0,
  486.  0.5384693101,0.9061798459};
  487.  static DOUBLE c[5]={0.2369268851,0.4786286705,0.5688888889,
  488. 0.4786286705,0.2369268851};
  489.  m=1;
  490.  h=b-a; s=fabs(0.001*h);
  491.  p=1.0e+35; ep=eps+1.0;
  492.  while ((ep>=eps)&&(fabs(h)>s))
  493. { g=0.0;
  494.   for (i=1;i<=m;i++)
  495.  { aa=a+(i-1.0)*h; bb=a+i*h;
  496. w=0.0;
  497. for (j=0;j<=4;j++)
  498.   { x=((bb-aa)*t[j]+(bb+aa))/2.0;
  499.  w=w+cal(x)*c[j];  //flrgsf(x)*c[j];
  500.   }
  501. g=g+w;
  502.  }
  503.   g *= h/2.0;
  504.   ep=fabs(g-p)/(1.0+fabs(g));
  505.   p=g; m=m+1; h=(b-a)/m;
  506. }
  507.  return g;
  508. }
  509. DOUBLE func::integ(DOUBLE a, DOUBLE b, DOUBLE eps)
  510. // 从a到b计算函数的定积分
  511. {
  512. return alg->integ(a,b,eps);
  513. }
  514. DOUBLE func::singleroot(DOUBLE x, DOUBLE eps)
  515. // 计算函数在x附近的一个单根
  516. {
  517. return getroot(*alg,x,eps);
  518. }
  519. DOUBLE algoinverse::calculate(DOUBLE x) // 实施反函数算法
  520. {
  521. algo * a = al->clone(); // 克隆一个一样的函数算法变量
  522. a->add(-x); // 形成函数f(t)-x
  523. DOUBLE t;
  524. t = getroot(*a); // 求f(t)-x=0的根
  525. delete a;
  526. return t;
  527. }
  528. algo * algoinverse::clone() // 克隆自己
  529. {
  530. return new algoinverse(*this);
  531. }
  532. func func::inverse() // 产生反函数
  533. {
  534. algo * a = new algoinverse(alg);
  535. func f;
  536. f.alg = a;
  537. return f;
  538. }