Interpolation.inl
上传用户:fxromeo
上传日期:2010-04-08
资源大小:89k
文件大小:27k
开发平台:

Visual C++

  1. // Interpolation.inl 插值函数定义(实现)头文件
  2. // Ver 1.0.0.0
  3. // 版权所有(C)  何渝(HE Yu) 2002
  4. // 最后修改: 2002.5.31.
  5. #ifndef _INTERPOLATION_INL //避免多次编译
  6. #define _INTERPOLATION_INL
  7. #include <valarray> //数组模板类标准头文件
  8. #include "Matrix.h"         //矩阵类头文件
  9. #include "comm.h" //公共头文件
  10. //一元全区间不等距插值
  11. template <class _Ty>
  12. _Ty Interpolation1VariableNotIsometry(valarray<_Ty>& x, 
  13. valarray<_Ty>& y, _Ty t)
  14. {
  15. int i,j,k,m;
  16.     _Ty z(0), s;
  17.     
  18. int n = x.size(); //插值点个数(x数组元素个数)
  19. if(n < 1) return(z);
  20.     
  21. if(n == 1) 
  22. {
  23. z = y[0]; 
  24. return(z);
  25. }
  26.     
  27. if(n == 2)
  28. {
  29. z = (y[0] * (t - x[1]) - y[1] * (t - x[0])) / (x[0] - x[1]);
  30.         return(z);
  31. }
  32.     
  33. i = 0;
  34.     
  35. while((x[i] < t) && (i < n)) i++;
  36.     
  37. k = i - 4;
  38.     
  39. if(k < 0) k = 0;
  40.     
  41. m = i + 3;
  42.     
  43. if(m > (n - 1)) m = n - 1;
  44.     
  45. for(i = k; i <= m; i ++)
  46. {
  47. s = 1.0;
  48.         for(j = k; j <= m; j ++)
  49. {
  50. if(j != i)
  51. s = s * (t - x[j]) / (x[i] - x[j]);
  52. }
  53. z = z + s * y[i];
  54. }
  55.     return(z);
  56. }
  57. //一元全区间等距插值
  58. template <class _Ty>
  59. _Ty Interpolation1VariableIsometry(_Ty x0, _Ty h, valarray<_Ty>& y, _Ty t)
  60. {
  61. int i, j, k, m;
  62.     _Ty z(0), s, xi, xj, p, q;
  63.     
  64. int n =  y.size(); //等距结点的个数
  65.     if(n < 1) return(z);
  66.     
  67. if(n == 1) 
  68. {
  69. z = y[0];
  70. return(z);
  71. }
  72.     
  73. if(n == 2)
  74. z = (y[1] * (t - x0) - y[0] * (t - x0 - h)) / h;
  75. return(z);
  76. }
  77.     
  78. if(t > x0)
  79. p = (t - x0) / h;
  80. i = (int)p; 
  81. q = (float)i;
  82.         if(p > q) i++;
  83. }
  84.     else i = 0;
  85.     
  86. k = i - 4;
  87.     if(k < 0) k = 0;
  88.     m = i + 3;
  89.     if(m > (n-1)) m = n - 1;
  90.     for(i = k; i<=m; i ++)
  91. {
  92. s = 1.0;
  93. xi = x0 + i * h;
  94.         for(j = k; j<=m; j++)
  95. if(j != i)
  96.             {
  97. xj = x0 + j * h;
  98. s = s * (t - xj) / (xi - xj);
  99.             }
  100. z = z + s * y[i];
  101. }
  102.     return(z);
  103. }
  104. //一元三点不等距插值
  105. template <class _Ty>
  106. _Ty Interpolation1Variable3PointsNotIsometry(valarray<_Ty>& x, 
  107. valarray<_Ty>& y, _Ty t)
  108. {
  109. int i, j, k, m;
  110. _Ty z(0.0), s;
  111. int n =  x.size(); //给定不等距结点的个数
  112. if(n < 1) return(z);
  113. if(n==1)
  114. {
  115. z = y[0];
  116. return(z);
  117. }
  118. if(n == 2)
  119. z = (y[0] * (t - x[1]) - y[1] * (t - x[0])) / (x[0] - x[1]);
  120. return(z);
  121. }
  122. if(t <= x[1]) 
  123. {
  124. k = 0;
  125. m = 2;
  126. }
  127. else if(t >= x[n-2])
  128. {
  129. k = n - 3;
  130. m = n - 1;
  131. }
  132. else
  133. k = 1;
  134. m = n;
  135. while((m-k) != 1)
  136. i = (k + m) / 2;
  137. if(t < x[i - 1]) m = i;
  138. else k = i;
  139. }
  140. k = k - 1;
  141. m = m - 1;
  142. if(Abs(t - x[k]) < Abs(t - x[m]))
  143. k = k - 1;
  144. else
  145. m = m + 1;
  146. }
  147. z = 0.0;
  148. for(i = k; i <= m; i ++)
  149. {
  150. s = 1.0;
  151. for(j = k;j <= m; j ++)
  152. if(j != i) s = s * (t - x[j]) / (x[i] - x[j]);
  153. z = z + s * y[i];
  154. }
  155. return(z);
  156. }
  157. //一元三点等距插值
  158. template <class _Ty>
  159. _Ty Interpolation1Variable3PointsIsometry(_Ty x0, _Ty h, 
  160. valarray<_Ty>& y, _Ty t)
  161. {
  162. int i, j, k, m;
  163.     _Ty z(0.0), s, xi, xj;
  164. int n =  y.size(); //给定等距结点的个数
  165.     if(n < 1) return(z);
  166.     if(n == 1) 
  167. {
  168. z = y[0];
  169. return(z);
  170. }
  171.     
  172. if(n == 2)
  173. {
  174. z = (y[1] * (t - x0) - y[0] * (t - x0 - h)) / h;
  175. return(z);
  176. }
  177.     
  178. if(t <= (x0 + h))
  179. k = 0;
  180. m = 2;
  181. }
  182.     
  183. else if(t >= (x0+(n-3)*h))
  184. {
  185. k = n -3 ; 
  186. m = n - 1;
  187. }
  188.     
  189. else
  190. {
  191. i = (int)((t - x0) / h) + 1;
  192.         
  193. if(Abs(t - x0 - i * h) >= Abs(t - x0 - (i - 1) * h))
  194. {
  195. k = i - 2; 
  196. m = i;
  197. }
  198.         else
  199. {
  200. k = i - 1;
  201. m = i + 1;
  202. }
  203. }
  204.     
  205. z = 0.0;
  206.     for(i = k; i <= m; i ++)
  207. {
  208. s = 1.0;
  209. xi = x0 + i * h;
  210.         for(j = k; j <= m; j++)
  211. if(j != i)
  212.             {
  213. xj = x0 + j * h;
  214. s = s * (t - xj) / (xi - xj);
  215. }
  216.         z = z + s * y[i];
  217. }
  218.  
  219. return(z);
  220. }
  221. //连分式不等距插值
  222. template <class _Ty>
  223. _Ty InterpolationFractionNotIsometry(valarray<_Ty>& x, 
  224. valarray<_Ty>& y, _Ty t)
  225. {
  226. int i,j,k,m,l;
  227. _Ty z(0), h, b[8];
  228. int n = x.size(); //给定不等距结点的个数
  229. if(n < 1) return(z);
  230. if(n == 1)
  231. {
  232. z = y[0];
  233. return(z);
  234. }
  235. if(n <= 8) 
  236. {
  237. k = 0;
  238. m = n;
  239. }
  240. else if(t < x[4])
  241. {
  242. k = 0; 
  243. m = 8;
  244. }
  245. else if(t > x[n - 5])
  246. {
  247. k= n - 8; 
  248. m = 8;
  249. }
  250. else
  251. {
  252. k = 1; 
  253. j = n;
  254. while((j-k) != 1)
  255. {
  256. i = (k + j) / 2;
  257. if(t < x[i - 1]) j = i;
  258. else k = i;
  259. }
  260. k = k - 4; 
  261. m = 8;
  262. }
  263. b[0] = y[k];
  264. for(i = 2; i <= m; i ++)
  265. {
  266. h = y[i + k - 1];
  267. l = 0;
  268. j = 1;
  269. while((l == 0) && (j <= i - 1))
  270. {
  271. if((Abs(h - b[j - 1]) + 1.0) == 1.0) l = 1;
  272. else h = (x[i + k - 1] - x[j + k - 1]) / (h - b[j - 1]);
  273. j = j + 1;
  274. }
  275. b[i - 1] = h;
  276. if(l != 0) 
  277. {
  278. b[i - 1] = 1.0e+35;
  279. }
  280. }
  281. z = b[m - 1];
  282. for(i = m - 1; i >= 1; i --)
  283. {
  284. z = b[i - 1] + (t - x[i + k - 1]) / z;
  285. }
  286. return(z);
  287. }
  288. //连分式等距插值
  289. template <class _Ty>
  290. _Ty InterpolationFractionIsometry(_Ty x0, _Ty h, valarray<_Ty>& y, _Ty t)
  291. {
  292. int i,j,k,m,l;
  293. _Ty z(0.0), hh, xi, xj, b[8];
  294. int n = y.size(); //给定等距结点的个数
  295. if(n < 1) return(z);
  296. if(n == 1)
  297. {
  298. z = y[0];
  299. return(z);
  300. }
  301. if(n <= 8)
  302. {
  303. k = 0;
  304. m = n;
  305. }
  306. else if(t < (x0 + 4.0 * h)) 
  307. {
  308. k = 0; 
  309. m = 8;
  310. }
  311. else if(t > (x0 + (n - 5) * h)) 
  312. {
  313. k = n - 8;
  314. m = 8;
  315. }
  316. else
  317. {
  318. k = (int)((t - x0) / h) - 3;
  319. m = 8;
  320. }
  321. b[0] = y[k];
  322. for(i = 2; i <= m; i ++)
  323. hh = y[i + k - 1];
  324. l = 0;
  325. j = 1;
  326.  
  327. while((l == 0) && (j <= (i - 1)))
  328. {
  329. if((Abs(hh - b[j - 1]) + 1.0) == 1.0 )
  330. {
  331. l=1;
  332. }
  333. else
  334. {
  335. xi = x0 + (i + k - 1) * h;
  336. xj = x0 + (j + k - 1) * h;
  337. hh = (xi - xj) / (hh - b[j - 1]);
  338. }
  339. j = j + 1;
  340. }
  341. b[i - 1] = hh;
  342. if(l != 0) 
  343. {
  344. b[i - 1] = 1.0e+35;
  345. }
  346. }
  347. z = b[m - 1];
  348. for(i = m - 1; i >= 1; i --)
  349. {
  350. z = b[i - 1] + (t - (x0 + (i + k - 1) * h)) / z;
  351. }
  352. return(z);
  353. }
  354. //埃尔米特不等距插值
  355. template <class _Ty>
  356. _Ty InterpolationHermiteNotIsometry(valarray<_Ty>& x, 
  357. valarray<_Ty>& y, valarray<_Ty>& dy, _Ty t)
  358. {
  359. int i,j;
  360. _Ty z(0.0), p, q, s;
  361. int n =  y.size(); //给定不等距结点的个数
  362. for(i = 1; i<=n; i ++)
  363. {
  364. s = 1.0;
  365. for(j = 1; j <= n;j ++)
  366. if(j != i)
  367. {
  368. s = s * (t - x[j - 1]) / (x[i - 1] - x[j - 1]);
  369. }
  370. s = s * s;
  371. p = 0.0;
  372. for(j = 1; j <= n; j++)
  373. if(j!=i) 
  374. {
  375. p = p + 1.0 / (x[i - 1] - x[j - 1]);
  376. }
  377. q = y[i - 1] + (t - x[i - 1]) * (dy[i - 1] - 2.0 * y[i - 1] * p);
  378. z = z + q * s;
  379. }
  380. return(z);
  381. }
  382. //埃尔米特等距插值
  383. template <class _Ty>
  384. _Ty InterpolationHermiteIsometry(_Ty x0, _Ty h, 
  385. valarray<_Ty>& y, valarray<_Ty>& dy, _Ty t)
  386. int i, j;
  387. _Ty z(0.0), s, p, q;
  388. int n =  y.size(); //给定等距结点的个数
  389. for(i = 1; i <= n; i ++)
  390. {
  391. s = 1.0;
  392. q = x0 + (i - 1) * h;
  393. for(j = 1; j <= n; j ++)
  394. {
  395. p = x0 + (j - 1) * h;
  396. if(j != i) s = s * (t - p) / (q - p);
  397. }
  398. s = s * s;
  399. p = 0.0;
  400. for(j = 1; j <= n; j ++)
  401. {
  402. if(j != i) 
  403. {
  404. p = p + 1.0 / (q - (x0 + (j - 1) * h));
  405. }
  406. }
  407. q = y[i - 1] + (t - q) * (dy[i - 1] - 2.0 * y[i - 1] * p);
  408. z = z + q * s;
  409. }
  410. return(z);
  411. }
  412. //埃特金不等距逐步插值
  413. template <class _Ty>
  414. _Ty InterpolationAitkenNotIsometry(valarray<_Ty>& x, 
  415. valarray<_Ty>& y, _Ty t, _Ty eps)
  416. {
  417. int i,j,k,m,l;
  418. _Ty z(0), xx[10], yy[10];
  419. int n =  y.size(); //给定不等距结点的个数
  420. if(n <1 ) return(z);
  421. if(n == 1)
  422. {
  423. z = y[0];
  424. return(z);
  425. }
  426. m = 10;
  427. if(m > n) m = n;
  428. if(t <= x[0]) k = 1;
  429. else if(t >= x[n - 1]) k=n;
  430. else
  431. {
  432. k = 1;
  433. j = n;
  434. while(((k - j) != 1) && ((k - j) != -1))
  435. {
  436. l = (k + j) / 2;
  437. if(t < x[l - 1]) j = l;
  438. else k = l;
  439. }
  440. if(Abs(t - x[l - 1]) > Abs (t - x[j - 1])) k = j;
  441. }
  442. j = 1;
  443. l = 0;
  444. for(i = 1; i <= m; i ++)
  445. {
  446. k = k + j * l;
  447. if((k < 1) || (k > n))
  448. {
  449. l = l + 1; 
  450. j = -j;
  451. k = k + j * l;
  452. }
  453. xx[i - 1] = x[k - 1];
  454. yy[i - 1] = y[k - 1];
  455. l = l + 1;
  456. j = -j;
  457. }
  458. i = 0;
  459. do
  460. {
  461. i = i + 1;
  462. z = yy[i];
  463. for(j = 0; j <= i - 1; j ++)
  464. {
  465. z = yy[j] + (t - xx[j]) * (yy[j] - z) / (xx[j] - xx[i]);
  466. }
  467. yy[i] = z;
  468. }while((i != (m - 1)) && (Abs(yy[i] - yy[i - 1]) > eps));
  469. return(z);
  470. }
  471. //埃特金等距逐步插值
  472. template <class _Ty>
  473. _Ty InterpolationAitkenIsometry(_Ty x, _Ty h, 
  474. valarray<_Ty>& y, _Ty t, _Ty eps)
  475. {
  476. int i, j, k, m, l;
  477. _Ty z(0), xx[10], yy[10];
  478. int n =  y.size(); //给定等距结点的个数
  479. if (n < 1)
  480. return z;
  481. if (n == 1)
  482. z = y[0];
  483. return z;
  484. }
  485. m = 10;
  486. if (m > n)
  487. m = n;
  488. if (t <= x)
  489. k = 1;
  490. else
  491. {
  492. if (t >= (x + (n - 1) * h))
  493. k = n;
  494. else
  495. {
  496. k = 1;
  497. j = n;
  498. while ((k - j != 1) && (k - j != -1))
  499. {
  500. l = (k + j) / 2;
  501. if (t < (x + (l - 1) * h))
  502. j = l;
  503. else
  504. k = l;
  505. }
  506. if (Abs(t - (x + (l - 1) * h)) > Abs(t - (x + (j - 1) * h)))
  507. k = j;
  508. }
  509. }
  510. j = 1;
  511. l = 0;
  512. for (i = 1; i <= m; ++ i)
  513. {
  514. k = k + j * l;
  515. if ((k < 1) || (k > n))
  516. {
  517. l = l + 1;
  518. j = -j;
  519. k = k + j * l;
  520. }
  521. xx[i - 1] = x + (k - 1) * h;
  522. yy[i - 1] = y[k - 1];
  523. l = l + 1;
  524. j = -j;
  525. }
  526. i = 0;
  527. do
  528. {
  529. i = i + 1; 
  530. z = yy[i];
  531. for (j = 0; j <= i - 1; ++ j)
  532. z = yy[j] + (t - xx[j]) * (yy[j] - z) / (xx[j] - xx[i]);
  533. yy[i] = z;
  534. }while ((i != m - 1) && (Abs(yy[i] - yy[i - 1]) > eps));
  535. return z;
  536. }
  537. //光滑不等距插值
  538. template <class _Ty>
  539. void InterpolationSmoothNotIsometry(valarray<_Ty>& x, valarray<_Ty>& y, 
  540. int k, _Ty t, valarray<_Ty>& s)
  541. {
  542. int kk, m, l;
  543. _Ty u[5], p, q;
  544. int n =  y.size(); //给定不等距结点的个数
  545. for(m=0; m<5; m++) s[m] = 0.0;
  546. if(n < 1) goto END;
  547. if(n == 1)
  548. s[0] = y[0];
  549. s[4] = y[0];
  550. goto END;
  551. }
  552. if(n == 2)
  553. {
  554. s[0] = y[0]; 
  555. s[1] = (y[1] - y[0]) / (x[1] - x[0]);
  556. if(k < 0)
  557. {
  558. s[4] = (y[0] * (t - x[1]) - y[1] * (t - x[0])) / (x[0] - x[1]);
  559. }
  560. goto END;
  561. }
  562. if(k < 0)
  563. {
  564. if(t <= x[1]) kk = 0;
  565. else 
  566. if(t >= x[n - 1]) kk = n - 2;
  567.         else
  568. {
  569. kk = 1;
  570. m = n;
  571. while(((kk - m) != 1) && ((kk - m) != -1))
  572. {
  573. l = (kk + m) / 2;
  574. if(t < x[l - 1]) m = l;
  575. else kk = l;
  576. }
  577. kk = kk - 1;
  578. }
  579. }
  580. else kk = k;
  581. if(kk >= n-1) kk = n - 2;
  582. u[2] = (y[kk + 1] - y[kk]) / (x[kk + 1] - x[kk]);
  583. if(n == 3)
  584. {
  585. if(kk == 0)
  586. {
  587. u[3] = (y[2] - y[1]) / (x[2] - x[1]);
  588. u[4] = 2.0 * u[3] - u[2];
  589. u[1] = 2.0 * u[2] - u[3];
  590. u[0] = 2.0 * u[1] - u[2];
  591. }
  592. else
  593. {
  594. u[1] = (y[1] - y[0]) / (x[1] - x[0]);
  595. u[0] = 2.0 * u[1] - u[2];
  596. u[3] = 2.0 * u[2] - u[1];
  597. u[4] = 2.0 * u[3] - u[2];
  598. }
  599. }
  600. else
  601. if(kk <= 1)
  602. {
  603. u[3] = (y[kk + 2] - y[kk + 1]) / (x[kk + 2] - x[kk + 1]);
  604. if(kk == 1)
  605. {
  606. u[1] = (y[1] - y[0]) / (x[1] - x[0]);
  607. u[0] = 2.0 * u[1] - u[2];
  608. if(n == 4) u[4] = 2.0 * u[3] - u[2];
  609. else u[4] = (y[4] - y[3]) / (x[4] - x[3]);
  610. }
  611. else
  612. {
  613. u[1] = 2.0 * u[2] - u[3];
  614. u[0] = 2.0 * u[1] - u[2];
  615. u[4] = (y[3] - y[2]) / (x[3] - x[2]);
  616. }
  617. }
  618. else if(kk >= (n - 3))
  619. {
  620. u[1]  = (y[kk] - y[kk - 1]) / (x[kk] - x[kk - 1]);
  621. if(kk == (n - 3))
  622. {
  623. u[3] = (y[n - 1] - y[n - 2]) / (x[n - 1]- x[n - 2]);
  624. u[4] = 2.0 * u[3] - u[2];
  625. if(n == 4) u[0] = 2.0 * u[1] - u[2];
  626. else u[0] = (y[kk - 1] - y[kk - 2]) / (x[kk - 1] - x[kk - 2]);
  627. }
  628. else
  629. {
  630. u[3] = 2.0 * u[2] - u[1];
  631. u[4] = 2.0 * u[3] - u[2];
  632. u[0] = (y[kk - 1] - y[kk - 2]) / (x[kk - 1] - x[kk - 2]);
  633. }
  634. }
  635. else
  636. {
  637. u[1] = (y[kk] - y[kk - 1]) / (x[kk] - x[kk - 1]);
  638. u[0] = (y[kk - 1] - y[kk - 2]) / (x[kk - 1] - x[kk - 2]);
  639. u[3] = (y[kk + 2] - y[kk + 1]) / (x[kk + 2] - x[kk + 1]);
  640. u[4] = (y[kk + 3] - y[kk + 2]) / (x[kk + 3] - x[kk + 2]);
  641. }
  642. }
  643. s[0] =  Abs(u[3] - u[2]);
  644. s[1] =  Abs(u[0] - u[1]);
  645. if(FloatEqual(s[0],0) && FloatEqual(s[1],0)) p = (u[1] + u[2]) / 2.0;
  646. else p = (s[0] * u[1] + s[1] * u[2]) / (s[0] + s[1]);
  647. s[0] = Abs(u[3] - u[4]);
  648. s[1] = Abs(u[2] - u[1]);
  649. if(FloatEqual(s[0],0) && FloatEqual(s[1],0)) q = (u[2] + u[3]) / 2.0;
  650. else q = (s[0] * u[2] + s[1] * u[3]) / (s[0] + s[1]);
  651. s[0] = y[kk];
  652. s[1] = p;
  653. s[3] = x[kk + 1] - x[kk];
  654. s[2] = (3.0 * u[2] - 2.0 * p - q) / s[3];
  655. s[3] = (q + p - 2.0 * u[2]) / (s[3] * s[3]);
  656. if(k < 0)
  657. p = t - x[kk];
  658. s[4] = s[0] + s[1] * p + s[2] * p * p + s[3] * p * p * p;
  659. }
  660. END: ;
  661. }
  662. //光滑等距插值
  663. template <class _Ty>
  664. void InterpolationSmoothIsometry(_Ty x0, _Ty h, 
  665. valarray<_Ty>& y, int k, _Ty t, valarray<_Ty>& s)
  666. {
  667. int kk, m, l;
  668.     _Ty u[5], p, q;
  669. int n =  y.size(); //给定等距结点的个数
  670.     
  671. for(m=0; m<5; m++) s[m] = 0.0;
  672.     
  673. if(n < 1) goto END;
  674.     if(n == 1) 
  675. {
  676. s[0] = y[0];
  677. s[4] = y[0]; 
  678. goto END;
  679. }
  680.     if(n == 2)
  681. {
  682. s[0] = y[0];
  683. s[1] = (y[1] - y[0]) / h;
  684.         
  685. if(k < 0) s[4] = (y[1] * (t - x0) - y[0] * (t - x0 - h)) / h;
  686.         
  687. goto END;
  688. }
  689.     
  690. if(k < 0)
  691. {
  692. if(t <= x0 + h) kk = 0;
  693. else 
  694. if(t >= x0 + (n - 1) * h) kk = n - 2;
  695. else
  696. {
  697. kk = 1;
  698. m = n;
  699. while(((kk - m) != 1) && ((kk - m) != -1))
  700. {
  701. l = (kk + m) / 2;
  702.                 
  703. if(t < x0 + (l - 1) * h) m = l;
  704. else kk = l;
  705. }
  706.             
  707. kk = kk - 1;
  708. }
  709. }
  710. else kk = k;
  711.   
  712. if(kk >= n - 1) kk = n - 2;
  713.     
  714. u[2] = (y[kk + 1]- y [kk]) / h;
  715. if(n == 3)
  716. {
  717. if(kk == 0)
  718. {
  719. u[3] = (y[2] - y[1]) / h;
  720.             u[4] = 2.0 * u[3] - u[2];
  721.             u[1] = 2.0 * u[2] - u[3];
  722.             u[0] = 2.0 * u[1] - u[2];
  723. }
  724.         
  725. else
  726. u[1] = (y[1] - y[0]) / h;
  727.             u[0] = 2.0 * u[1] - u[2];
  728.             u[3] = 2.0 * u[2] - u[1];
  729.             u[4] = 2.0 * u[3] - u[2];
  730. }
  731. }  
  732. else
  733. {
  734. if(kk <= 1)
  735. {
  736. u[3] = (y[kk + 2] -y[kk + 1]) / h;
  737.             
  738. if(kk == 1)
  739. {
  740. u[1] = (y[1] - y[0]) / h;
  741.                 u[0] = 2.0 * u[1] - u[2];
  742.                 
  743. if(n == 4) u[4] = 2.0 * u[3] - u[2];
  744. else u[4] = (y[4] - y[3]) / h;
  745. }
  746.             else
  747. u[1] = 2.0 *u[2] - u[3];
  748.                 u[0] = 2.0 *u[1] - u[2];
  749.                 u[4] = (y[3] - y[2]) / h;
  750. }
  751. }
  752. else if(kk >= (n - 3))
  753. {
  754. u[1] = (y[kk] - y[kk - 1]) / h;
  755.             
  756. if(kk == (n - 3))
  757. {
  758. u[3] = (y[n - 1] - y[n - 2]) / h;
  759.                 u[4] = 2.0 * u[3] - u[2];
  760.                 
  761. if(n == 4) u[0] = 2.0 * u[1] - u[2];
  762.                 else u[0] = (y[kk - 1] - y[kk - 2]) / h;
  763. }   
  764. else
  765. {
  766. u[3] = 2.0 * u[2] - u[1];
  767.                 u[4] = 2.0 * u[3] - u[2];
  768.                 u[0] = (y[kk - 1] - y[kk - 2]) / h;
  769. }
  770. }
  771. else
  772. {
  773. u[1] = (y[kk] - y[kk - 1]) / h;
  774.             u[0] = (y[kk - 1] - y[kk - 2]) / h;
  775.             u[3] = (y[kk + 2] - y[kk + 1]) / h;
  776.             u[4] = (y[kk + 3] - y[kk + 2]) / h;
  777. }
  778. }
  779.      
  780. s[0] = Abs(u[3] - u[2]);
  781.     s[1] = Abs(u[0] - u[1]);
  782.     
  783. if(FloatEqual(s[0],0) && FloatEqual(s[1],0))
  784. p = (u[1] + u[2]) / 2.0;
  785. else
  786. p = (s[0] * u[1] + s[1] * u[2]) / (s[0] + s[1]);
  787.     
  788. s[0] = Abs(u[3] - u[4]);
  789.     s[1] = Abs(u[2] - u[1]);
  790.     
  791. if(FloatEqual(s[0],0) && FloatEqual(s[1],0))
  792. q = (u[2] + u[3]) / 2.0;
  793. else
  794. q = (s[0] * u[2] + s[1] * u[3]) / (s[0] + s[1]);
  795.   
  796. s[0] = y[kk];
  797.     s[1] = p;
  798.     s[3] = h;
  799.     s[2] = (3.0 * u[2] - 2.0 * p - q) / s[3];
  800.     s[3] = (q+p - 2.0 * u[2]) / (s[3] * s[3]);
  801.     
  802. if(k < 0)
  803. {
  804. p = t - (x0 + kk * h);
  805.         s[4] = s[0] + s[1] * p + s[2] * p * p + s[3] * p * p * p;
  806. }
  807.     
  808. END: ;
  809. }
  810. //第一种边界条件的三次样条函数插值、微商与积分
  811. template <class _Ty>
  812. _Ty Interpolation3Spooling1stBoundary(valarray<_Ty>& x, 
  813. valarray<_Ty>& y, valarray<_Ty>& dy, valarray<_Ty>& ddy, 
  814. valarray<_Ty>& t, valarray<_Ty>& z, valarray<_Ty>& dz, 
  815. valarray<_Ty>& ddz)
  816. {
  817. int i, j;
  818.     _Ty h0, h1, alpha, beta, g;
  819. int n =  y.size(); //数组y的长度(元素个数),给定结点个数
  820. int m =  t.size(); //指定插值点的个数
  821.     
  822. valarray<_Ty> s(n);
  823.     s[0] = dy[0];
  824. dy[0] = 0.0;
  825.     h0 = x[1] - x[0];
  826.     for(j = 1; j < n - 1; j ++)
  827. {
  828. h1 = x[j + 1] - x[j];
  829.         alpha = h0 / (h0 + h1);
  830.         
  831. beta = (1.0 - alpha) * (y[j] - y[j - 1]) / h0;
  832.         beta = 3.0 * (beta + alpha * (y[j + 1] - y[j]) / h1);
  833.         
  834. dy[j] = -alpha / (2.0 + (1.0 - alpha) * dy[j - 1]);
  835.         s[j] = (beta - (1.0 - alpha) * s[j - 1]);
  836.         s[j] = s[j] / (2.0 + (1.0 - alpha) * dy[j - 1]);
  837.         
  838. h0 = h1;
  839. }
  840.     
  841. for(j = n - 2; j >= 0; j --)
  842. {
  843. dy[j] = dy[j] * dy[j + 1] + s[j];
  844. }
  845.     for(j = 0; j < n - 1; j ++) 
  846. {
  847. s[j] = x[j + 1] - x[j];
  848. }
  849.     
  850. for(j = 0 ; j < n - 1; j ++)
  851. {
  852. h1 = s[j] * s[j];
  853.         ddy[j] = 6.0 * (y[j + 1] - y[j]) / h1 - 2.0 * (2.0 * dy[j] + dy[j + 1]) / s[j];
  854. }
  855.     h1 = s[n - 2] * s[n - 2];
  856.     ddy[n - 1] = 6.0 * (y[n - 2] - y[n - 1]) / h1 + 2.0 * (2.0 * dy[n - 1] 
  857.          + dy[n - 2]) / s[n - 2];
  858.     g = 0.0;
  859.     
  860. for(i = 0;i < n - 1; i ++)
  861. {
  862. h1 = 0.5 * s[i] * (y[i] + y[i + 1]);
  863.         h1 = h1 - s[i] * s[i] * s[i] * (ddy[i] + ddy[i + 1]) / 24.0;
  864.         g = g + h1;
  865. }
  866.     
  867. for(j = 0; j <= m - 1; j ++)
  868. {
  869. if(t[j] >= x[n - 1]) i = n - 2;
  870.         else
  871. {
  872. i = 0;
  873.             while(t[j] > x[i + 1]) i ++;
  874. }
  875.         
  876. h1 = (x[i + 1] - t[j]) / s[i];
  877.         h0 = h1 * h1;
  878.         
  879. z[j] = (3.0 * h0 - 2.0 * h0 * h1) * y[i];
  880.         z[j] = z[j] + s[i] * (h0 - h0 * h1) * dy[i];
  881.         
  882. dz[j] = 6.0 * (h0 - h1) * y[i] / s[i];
  883.         dz[j] = dz[j] + (3.0 * h0 - 2.0 * h1) * dy[i];
  884.         
  885. ddz[j] = (6.0 - 12.0 * h1) * y[i] / (s[i] * s[i]);
  886.         ddz[j] = ddz[j] + (2.0 - 6.0 * h1) * dy[i] / s[i];
  887.         
  888. h1 = (t[j] - x[i]) / s[i];
  889.         h0 = h1 * h1;
  890.         
  891. z[j] = z[j] + (3.0 * h0 -2.0 * h0 * h1) * y[i + 1];
  892.         z[j] = z[j] - s[i] * (h0 - h0 * h1) * dy[i + 1];
  893.         
  894. dz[j] = dz[j] - 6.0 * (h0 - h1) * y[i + 1] / s[i];
  895.         dz[j] = dz[j] + (3.0 * h0 - 2.0 * h1) * dy[i + 1];
  896.         
  897. ddz[j] = ddz[j] + (6.0 - 12.0 * h1) * y[i + 1] / (s[i] * s[i]);
  898.         ddz[j] = ddz[j] - (2.0 - 6.0 * h1) * dy[i + 1] / s[i];
  899. }
  900.     
  901. return(g);
  902. }
  903. //第二种边界条件的三次样条函数插值、微商与积分
  904. template <class _Ty>
  905. _Ty Interpolation3Spooling2ndBoundary(valarray<_Ty>& x, 
  906. valarray<_Ty>& y, valarray<_Ty>& dy, valarray<_Ty>& ddy, 
  907. valarray<_Ty>& t, valarray<_Ty>& z, valarray<_Ty>& dz, 
  908. valarray<_Ty>& ddz)
  909. {
  910. int i, j;
  911.     _Ty h0, h1, alpha, beta, g;
  912. int n =  y.size(); //数组y的长度(元素个数),给定结点个数
  913. int m =  t.size(); //指定插值点的个数
  914.     
  915. valarray<_Ty> s(n);
  916.     
  917. dy[0] = -0.5;
  918.     h0 = x[1] - x[0];
  919.     s[0] = 3.0 * (y[1] - y[0]) / (2.0 * h0) - ddy[0] * h0 / 4.0;
  920.     
  921. for(j = 1; j < n - 1; j ++)
  922. {
  923. h1 = x[j + 1] - x[j];
  924.         alpha = h0 / (h0 + h1);
  925.         
  926. beta = (1.0 - alpha) * (y[j] - y[j - 1]) / h0;
  927.         beta = 3.0 * (beta + alpha * (y[j + 1] - y[j]) / h1);
  928.         
  929. dy[j] = -alpha / (2.0 + (1.0 - alpha) * dy[j - 1]);
  930.         s[j] = (beta - (1.0 - alpha) * s[j - 1]);
  931.         s[j] = s[j] / (2.0 + (1.0 - alpha) * dy[j - 1]);
  932.         
  933. h0 = h1;
  934. }
  935.     
  936. dy[n - 1] = (3.0 * (y[n - 1] - y[n - 2]) / h1 + ddy[n - 1] * h1 
  937.         / 2.0 - s[n - 2]) / (2.0 + dy[n - 2]);
  938.     
  939. for(j = n - 2; j >= 0; j --)
  940. {
  941. dy[j] = dy[j] * dy[j + 1 ] + s[j];
  942. }
  943.     
  944. for(j =0; j < n - 1; j ++)
  945. {
  946. s[j] = x[j + 1] - x[j];
  947. }
  948.     for(j =0; j < n - 1; j ++)
  949. {
  950. h1 = s[j] * s[j];
  951.         ddy[j] = 6.0 * (y[j + 1] - y [j]) / h1 - 2.0 * (2.0 * dy[j] + dy[j + 1]) / s[j];
  952. }
  953.     
  954. h1 = s[n - 2] * s[n - 2];
  955.     ddy[n - 1]= 6.0 * (y[n - 2] - y[n - 1]) / h1 + 2.0 * (2.0 * dy[n - 1] 
  956.         + dy[n - 2]) / s[n - 2];
  957.     g = 0.0;
  958.     
  959. for(i = 0; i < n - 1; i ++)
  960. {
  961. h1 = 0.5 * s[i] * (y[i] + y[i + 1]);
  962.         h1 = h1 - s[i] * s[i] * s[i] * (ddy[i] + ddy[i + 1]) / 24.0;
  963.         g = g + h1;
  964. }
  965.     
  966. for(j = 0; j <= m - 1; j ++)
  967. {
  968. if(t[j] >= x[n - 1]) i = n - 2;
  969.         else
  970. {
  971. i = 0;
  972.             while(t[j] > x[i + 1]) i = i + 1;
  973. }
  974.         
  975. h1 = (x[i + 1] - t[j]) / s[i];
  976.         h0 = h1 * h1;
  977.         
  978. z[j] = (3.0 * h0 - 2.0 * h0 * h1) * y[i];
  979.         z[j] = z[j] + s[i] * (h0 - h0 * h1) * dy[i];
  980.         
  981. dz[j] = 6.0 * (h0 - h1) * y[i] / s[i];
  982.         dz[j] = dz[j] + (3.0 * h0 - 2.0 * h1) * dy[i];
  983.         
  984. ddz[j] = (6.0 - 12.0 * h1) * y[i] / (s[i] * s[i]);
  985.         ddz[j] = ddz[j] + (2.0 - 6.0 * h1) * dy[i] / s[i];
  986.         
  987. h1 = (t[j] - x[i]) / s[i];
  988.         h0 = h1 * h1;
  989.         
  990. z[j] = z[j] + (3.0 * h0 - 2.0 * h0 * h1) * y[i + 1];
  991.         z[j] = z[j] - s[i] * (h0 - h0 * h1)* dy[i + 1];
  992.         
  993. dz[j] = dz[j] - 6.0 * (h0 - h1) * y[i + 1] / s[i];
  994.         dz[j] = dz[j] + (3.0 * h0 - 2.0 * h1) * dy[i + 1];
  995.         
  996. ddz[j] = ddz[j] + (6.0 - 12.0 * h1) * y[i + 1] / (s[i] * s[i]);
  997.         ddz[j] = ddz[j] - (2.0 - 6.0 * h1) * dy[i + 1] / s[i];
  998. }
  999.     
  1000.     return(g);
  1001. }
  1002. //第三种边界条件的三次样条函数插值、微商与积分
  1003. template <class _Ty>
  1004. _Ty Interpolation3Spooling3thBoundary(valarray<_Ty>& x, 
  1005. valarray<_Ty>& y, valarray<_Ty>& dy, valarray<_Ty>& ddy, 
  1006. valarray<_Ty>& t, valarray<_Ty>& z, valarray<_Ty>& dz, 
  1007. valarray<_Ty>& ddz)
  1008. {
  1009. int i, j;
  1010.     _Ty h0, y0, h1, y1, alpha, beta, u, g;
  1011. int n =  y.size(); //数组y的长度(元素个数),给定结点个数
  1012. int m =  t.size(); //指定插值点的个数
  1013.     
  1014. valarray<_Ty> s(n);
  1015.     
  1016. h0 = x[n -1 ] - x[n - 2];
  1017.     y0 = y[n - 1] - y[n - 2];
  1018.     
  1019. dy[0] = 0.0;
  1020. ddy[0] = 0.0;
  1021. ddy[n - 1] = 0.0;
  1022.     s[0] = 1.0;
  1023. s[n - 1] = 1.0;
  1024.     
  1025. for(j = 1; j < n; j ++)
  1026. {
  1027. h1 = h0;
  1028. y1 = y0;
  1029.         h0 = x[j] - x[j - 1];
  1030.         y0 = y[j] - y[j - 1];
  1031.         
  1032. alpha = h1 / (h1 + h0);
  1033.         beta = 3.0 * ((1.0 - alpha) * y1 / h1 + alpha * y0 / h0);
  1034.         
  1035. if(j < n - 1)
  1036. {
  1037. u = 2.0 + (1.0 - alpha) * dy[j - 1];
  1038.             dy[j] = -alpha / u;
  1039.             s[j] = (alpha - 1.0) * s[j - 1] / u;
  1040.             ddy[j] = (beta - (1.0 - alpha) * ddy[j - 1]) / u;
  1041. }
  1042. }
  1043.     
  1044. for(j = n - 2; j >= 1; j--)
  1045. {
  1046. s[j] = dy[j] * s[j + 1] + s[j];
  1047.         ddy[j] = dy[j] * ddy[j + 1] + ddy[j];
  1048. }
  1049.     
  1050. dy[n-2] = (beta - alpha * ddy[1] - (1.0 - alpha) * ddy[n - 2])
  1051.       / (alpha * s[1] + (1.0 - alpha)* s[n - 2] + 2.0);
  1052.     
  1053. for(j = 2; j < n; j ++)
  1054. {
  1055.         dy[j-2]=s[j-1]*dy[n-2]+ddy[j-1];
  1056. }
  1057. dy[n - 1] = dy[0];
  1058.     
  1059. for(j = 0; j < n - 1; j++)
  1060. {
  1061. s[j] = x[j + 1] - x[j];
  1062. }
  1063.     for(j = 0; j < n - 1; j++)
  1064. {
  1065. h1 = s[j] * s[j];
  1066.         ddy[j] = 6.0 * (y[j + 1] - y[j]) / h1 - 2.0 
  1067.      * (2.0 * dy[j] + dy[j + 1]) / s[j];
  1068. }
  1069.     h1 = s[n - 2] * s[n - 2];
  1070.     ddy[n - 1] = 6.0 * (y[n - 2] - y[n - 1]) / h1 
  1071.          + 2.0 * (2.0 * dy[n - 1] + dy[n - 2]) / s[n - 2];
  1072.     g = 0.0;
  1073. for(i = 0; i < n - 1; i++)
  1074.     {
  1075. h1 = 0.5 * s[i] * (y[i] + y[i + 1]);
  1076.         h1 = h1 - s[i] * s[i] * s[i] * (ddy[i] + ddy[i + 1]) / 24.0;
  1077.         g = g + h1;
  1078. }
  1079.     
  1080. for(j = 0; j <= m - 1; j++)
  1081. {
  1082. h0 = t[j];
  1083.         
  1084. while(h0 >= x[n - 1])
  1085. {
  1086. h0 = h0 - (x[n - 1] - x[0]);
  1087. }
  1088.         while(h0 < x[0])
  1089. {
  1090. h0 = h0 + (x[n - 1] - x[0]);
  1091. }
  1092.        
  1093. i = 0;
  1094.         
  1095. while(h0 > x[i + 1]) i++;
  1096.         
  1097. u = h0;
  1098.         h1 = (x[i + 1] -u ) / s[i];
  1099.         h0 = h1 * h1;
  1100.         
  1101. z[j] = (3.0 * h0 - 2.0 * h0 * h1) * y[i];
  1102.         z[j] = z[j] + s[i] * (h0 - h0 * h1) * dy[i];
  1103.          
  1104. dz[j] = 6.0 * (h0 - h1) * y[i] / s[i];
  1105.         dz[j] = dz[j] + (3.0 * h0 - 2.0 * h1) * dy[i];
  1106.         
  1107. ddz[j] = (6.0 - 12.0 * h1) * y[i] / (s[i] * s[i]);
  1108.         ddz[j] = ddz[j] + (2.0 - 6.0 * h1) * dy[i] / s[i];
  1109.         
  1110. h1 = (u - x[i]) / s[i];
  1111.         h0 = h1 * h1;
  1112.         
  1113. z[j] = z[j] + (3.0 * h0 - 2.0 * h0 * h1) * y[i + 1];
  1114.         z[j] = z[j] - s[i] * (h0 - h0 * h1) * dy[i + 1];
  1115.         
  1116. dz[j] = dz[j] - 6.0 * (h0 - h1) * y[i + 1] / s[i];
  1117.         dz[j] = dz[j] + (3.0 * h0 - 2.0 * h1) * dy[i + 1];
  1118.         
  1119. ddz[j] = ddz[j] + (6.0 - 12.0 * h1) * y[i + 1] / (s[i] * s[i]);
  1120.         ddz[j] = ddz[j] - (2.0 - 6.0 * h1) * dy[i + 1] / s[i];
  1121. }
  1122.     
  1123. return(g);
  1124. }
  1125. //二元三点插值
  1126. template <class _Ty>
  1127. _Ty Interpolation2Variable3Points(valarray<_Ty>& x, valarray<_Ty>& y, 
  1128. matrix<_Ty> z, _Ty u, _Ty v)
  1129. {
  1130. int nn(3),mm,ip,iq,i,j,k,l;
  1131.     _Ty b[3],h,w;
  1132. int n =  x.size(); //给定结点X方向上的坐标个数
  1133. int m =  y.size(); //给定结点Y方向上的坐标个数
  1134.     
  1135. if(n < 4)
  1136. {
  1137. ip = 0;
  1138. nn = n;
  1139. }
  1140.     else if(u <= x[1]) ip = 0;
  1141.     else if(u >= x[n - 2]) ip = n - 3;
  1142.     else
  1143. {
  1144. i = 1;
  1145. j = n;
  1146.         
  1147. while( ((i - j) != 1) && ((i - j) != -1) )
  1148. {
  1149. l = (i + j) / 2;
  1150.             
  1151. if(u < x[l - 1]) j = l;
  1152.             else i = l;
  1153. }
  1154.         
  1155. if(Abs(u - x[i - 1]) < Abs(u - x[j - 1])) ip = i - 2;
  1156.         else ip = i-1;
  1157.       }
  1158.     mm = 3;
  1159.     
  1160. if(m < 4)
  1161. {
  1162. iq = 0;
  1163. mm = m;
  1164. }
  1165.     else if(v <= y[1]) iq = 0;
  1166.     else if(v >= y[m - 2]) iq = m - 3;
  1167.     else
  1168. {
  1169. i = 1;
  1170. j = m;
  1171.         
  1172. while( ((i - j) != 1) && ((i - j) != -1) )
  1173. {
  1174. l = (i + j) / 2;
  1175.             if(v < y[l - 1]) j = l;
  1176.             else i = l;
  1177. }
  1178.         
  1179. if(Abs(v - y[i - 1]) < Abs(v - y[j - 1])) iq = i - 2;
  1180.         else iq = i - 1;
  1181. }
  1182.     
  1183. for(i = 0; i < nn; i ++)
  1184. {
  1185. b[i] = 0.0;
  1186.         for(j = 0; j < mm; j ++)
  1187. {
  1188. h = z(ip + i,iq +j);
  1189.             for(k = 0; k < mm; k ++)
  1190. {
  1191. if(k != j)
  1192. h = h * (v - y[iq + k]) / (y[iq + j] - y[iq + k]);
  1193. }
  1194. b[i] = b[i] + h;
  1195. }
  1196. }
  1197.     
  1198. w = 0.0;
  1199.     
  1200. for(i = 0; i < nn; i ++)
  1201. {
  1202. h = b[i];
  1203.         
  1204. for(j = 0; j < nn; j ++)
  1205. {
  1206. if(j != i)
  1207. h = h * (u - x[ip + j]) / (x[ip + i] - x[ip + j]);
  1208. }
  1209. w = w + h;
  1210. }
  1211.     
  1212. return(w);
  1213. }
  1214. //二元全区间插值
  1215. template <class _Ty>
  1216. _Ty Interpolation2VariableWholeInterval(valarray<_Ty>& x, 
  1217. valarray<_Ty>& y, matrix<_Ty> z, _Ty u, _Ty v)
  1218. {
  1219. int ip, ipp, i, j, l, iq, iqq, k;
  1220.     _Ty h, w;
  1221. valarray<_Ty> b(10);
  1222. int n =  x.size(); //给定结点X方向上的坐标个数
  1223. int m =  y.size(); //给定结点Y方向上的坐标个数
  1224. if(u<x[0]||FloatEqual(u,x[0]))
  1225. {
  1226. ip = 1;
  1227. ipp = 4;
  1228. }
  1229.     else if(u>x[n-1]||FloatEqual(u,x[n-1]))
  1230. {
  1231. ip = n - 3;
  1232. ipp = n;
  1233. }
  1234.     else
  1235. {
  1236. i = 1;
  1237. j = n;
  1238.         
  1239. while(((i - j) != 1) && ((i - j) != -1))
  1240. {
  1241. l = (i + j) / 2;
  1242.             
  1243. if(u < x[l - 1]) j = l;
  1244.             else i = l;
  1245. }
  1246.         
  1247. ip = i - 3; 
  1248. ipp = i + 4;
  1249. }
  1250.     
  1251. if(ip < 1) ip = 1;
  1252.     if(ipp > n) ipp = n;
  1253.     if(v < y[0] || FloatEqual(v, y[0]))
  1254. iq = 1;
  1255. iqq = 4; 
  1256. }
  1257.     else if(v > y[m - 1] || FloatEqual(v, y[m - 1]))
  1258. {
  1259. iq = m - 3;
  1260. iqq = m;
  1261. }
  1262.     else
  1263. {
  1264. i = 1;
  1265. j =m;
  1266.         
  1267. while(((i - j) != 1) && ((i - j) != -1))
  1268. {
  1269. l = (i + j) / 2;
  1270.             
  1271. if(v <y [l - 1]) j = l;
  1272.             else i = l;
  1273. }
  1274.         
  1275. iq = i - 3;
  1276. iqq = i + 4;
  1277. }
  1278.     
  1279. if(iq < 1) iq = 1;
  1280.     if(iqq > m) iqq = m;
  1281.     
  1282. for(i = ip - 1; i < ipp; i ++)
  1283. {
  1284. b[i -ip + 1] = 0.0;
  1285.         
  1286. for(j = iq - 1; j < iqq; j ++)
  1287. {
  1288. h = z(i,j);
  1289.             
  1290. for(k = iq - 1; k < iqq; k ++)
  1291. {
  1292. if(k != j)
  1293. h = h * (v - y[k]) / (y[j] - y[k]);
  1294. }
  1295. b[i- ip + 1] = b[i - ip + 1] + h;
  1296. }
  1297. }
  1298.     
  1299. w = 0.0;
  1300.     
  1301. for(i = ip - 1; i < ipp; i ++)
  1302. {
  1303. h = b[i - ip + 1];
  1304.         
  1305. for(j = ip - 1; j < ipp; j ++)
  1306. {
  1307. if(j != i)
  1308. h = h * (u - x[j]) / (x[i] - x[j]);
  1309. }
  1310.         
  1311. w =w + h;
  1312. }
  1313.     
  1314. return(w);
  1315. }
  1316. //#include "Interpolation.inl" //类及相关函数的定义头文件
  1317. #endif //_INTERPOLATION_INL