D3Lagrange_point.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // 函数功能: 求解拉格朗日三阶微分矩阵在tk处的值在第i个配置点上的分量
  2. // 输入:point:n * 1维矩阵,是插值点的时间维度,n为插值节点数目(升序)
  3. // k0:为当前点的标号
  4. // j:以1开始的标号
  5. // 输出:f当前点的三阶导数值
  6. // 方法:拉格朗日微分矩阵的基本公式及其推导
  7. // 编写: 2021/08/16
  8. #include "GPM.h"
  9. double D3Lagrange_point(mat point1, int k0, int j) {
  10. // 初始化
  11. int N = (size(point1))(0);
  12. double b = 1.0, a_sum = 0;
  13. double tj, ti, a, tk, b1 ,c1;
  14. // 分母计算, 分母与标号L无关
  15. for (int L = 0; L < N; L++) {
  16. if (L != j) {
  17. tj = (point1)(L, 0);
  18. ti = (point1)(j, 0);
  19. b = b*(ti - tj);
  20. }
  21. }
  22. // 分子计算,分子与标号有关
  23. for (int i0 = 0; i0 < N; i0++) {
  24. if (i0 == j) {
  25. a = 0;
  26. }
  27. else {
  28. a = 0;
  29. for (int m = 0; m < N; m++) {
  30. if (m == j || m == i0) {}
  31. else {
  32. b1 = 0;
  33. for (int n = 0; n < N; n++) {
  34. if (n == j || n == i0 || n == m) {}
  35. else {
  36. c1 = 1;
  37. for (int L = 0; L < N; L++) {
  38. if (L == j || L == i0 || L == m || L == n) {}
  39. else {
  40. tj = (point1)(L, 0);
  41. tk = (point1)(k0, 0);
  42. c1 = c1*(tk - tj);
  43. }
  44. }
  45. b1 = b1 + c1;
  46. }
  47. }
  48. a = a + b1;
  49. }
  50. }
  51. }
  52. a_sum = a_sum + a;
  53. }
  54. // 相除得结果
  55. double f = a_sum / b;
  56. return f;
  57. }