DLagrange_point.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // 函数功能: 求解拉格朗日微分矩阵在tk处的值在第i个配置点上的分量
  2. // 输入: point:n * 1维矩阵,是插值点的时间维度,n为插值节点数目(升序)
  3. // k0:为当前点的标号
  4. // j:以1开始的标号
  5. // 输出: f当前点的导数值
  6. // 方法: 拉格朗日微分矩阵的基本公式
  7. // 编写: 李兆亭,2019 / 11 / 12
  8. // 李兆亭, 2019 / 12 / 23修改程序说明
  9. // 李兆亭, 2019 / 12 / 23修改tk为k0,适用于配置点的编程计算,原式更适用于一般情况
  10. #include "GPM.h"
  11. int DLagrange_point(mat* point1, int *k0, int *j, double *f) {
  12. // 初始化
  13. int row_len = (size(*point1))(0);
  14. double b = 1.0, a_sum = 0;
  15. double tj, ti, a, tk;
  16. // 分母计算, 分母与标号L无关
  17. for (int L = 0; L < row_len; L++) {
  18. if (L != *j) {
  19. // (*point1).print("(*point1)");
  20. tj = (*point1)(L, 0);
  21. ti = (*point1)(*j, 0);
  22. b = b*(ti - tj);
  23. }
  24. }
  25. // 分子计算,分子与标号有关
  26. for (int i0 = 0; i0 < row_len; i0++) {
  27. if (i0 == *j) {
  28. a = 0;
  29. }
  30. else {
  31. a = 1;
  32. for (int L = 0; L < row_len; L++) {
  33. if (L == *j || L == i0) {
  34. }
  35. else {
  36. tj = (*point1)(L, 0);
  37. tk = (*point1)(*k0, 0);
  38. a = a*(tk - tj);
  39. }
  40. }
  41. }
  42. a_sum = a_sum + a;
  43. }
  44. // 相除得结果
  45. *f = a_sum / b;
  46. return 1;
  47. }