Legendre.cpp 689 B

123456789101112131415161718192021222324252627282930313233343536
  1. // 求勒让德多项式在当前点的值
  2. // 输入:n:多项式的阶数
  3. // x:当前点的值
  4. // 方法:正交多项式的三维递推公式
  5. // 编写:李兆亭
  6. // 时间:2019 / 11 / 04
  7. // 其他:适用于求解单点处函数值
  8. #include "GPM.h"
  9. int Legendre(int* n, double* x0, double* f)
  10. {
  11. if (*n == 0) {
  12. *f = 0;
  13. }
  14. else if (*n == 1) {
  15. *f = *x0;
  16. }
  17. else {
  18. // 公式递推
  19. double L0 = 1;
  20. vec L(*n, fill::zeros);
  21. L(0) = *x0;
  22. for (int i = 0; i < (*n) - 1; i++ ) {
  23. // cout << i << endl;
  24. if (i == 0) {
  25. L(i + 1) = ((2 * (i + 1) + 1)*(*x0)*L(i) - (i + 1)*L0) / (i + 2);
  26. }
  27. else {
  28. L(i + 1) = ((2 * (i + 1) + 1)*(*x0)*L(i) - (i + 1)*L(i - 1)) / (i + 2);
  29. }
  30. // L.print("L");
  31. }
  32. *f = L((*n) - 1);
  33. }
  34. }