12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // 函数功能: 求解拉格朗日三阶微分矩阵在tk处的值在第i个配置点上的分量
- // 输入:point:n * 1维矩阵,是插值点的时间维度,n为插值节点数目(升序)
- // k0:为当前点的标号
- // j:以1开始的标号
- // 输出:f当前点的三阶导数值
- // 方法:拉格朗日微分矩阵的基本公式及其推导
- // 编写: 2021/08/16
- #include "GPM.h"
- double D3Lagrange_point(mat point1, int k0, int j) {
- // 初始化
- int N = (size(point1))(0);
- double b = 1.0, a_sum = 0;
- double tj, ti, a, tk, b1 ,c1;
- // 分母计算, 分母与标号L无关
- for (int L = 0; L < N; L++) {
- if (L != j) {
- tj = (point1)(L, 0);
- ti = (point1)(j, 0);
- b = b*(ti - tj);
- }
- }
- // 分子计算,分子与标号有关
- for (int i0 = 0; i0 < N; i0++) {
- if (i0 == j) {
- a = 0;
- }
- else {
- a = 0;
- for (int m = 0; m < N; m++) {
- if (m == j || m == i0) {}
- else {
- b1 = 0;
- for (int n = 0; n < N; n++) {
- if (n == j || n == i0 || n == m) {}
- else {
- c1 = 1;
- for (int L = 0; L < N; L++) {
- if (L == j || L == i0 || L == m || L == n) {}
- else {
- tj = (point1)(L, 0);
- tk = (point1)(k0, 0);
- c1 = c1*(tk - tj);
- }
- }
- b1 = b1 + c1;
- }
- }
- a = a + b1;
- }
- }
- }
- a_sum = a_sum + a;
- }
- // 相除得结果
- double f = a_sum / b;
- return f;
- }
|