IZstruct.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. % 函数功能:
  3. % 判断积分矩阵对于自变量Z的依赖关系
  4. % 输入:
  5. % Z0:自变量
  6. % Z_num:状态、控制、积分、时间的起止序号
  7. % Dynamics:动力学方程函数句柄
  8. % Objective: 性能指标函数句柄
  9. % Scal:归一化标识
  10. % Sca_UY:状态控制量归一化系数
  11. % Sca_t:时间归一化系数
  12. % deta_t_in_col:配点所对应时间段大小
  13. % Col_total:总配点数目
  14. % auxdata:其他参数
  15. % W_phase:积分权重矩阵
  16. % length_state:状态长度
  17. % length_control:控制量长度
  18. % eps0:求导步长
  19. % 输出:
  20. % I_Z_struct0:积分依赖性向量
  21. % 编写:
  22. % 李兆亭,2020/07/03
  23. % C ++: 李兆亭,2020/09/23
  24. % 修改:
  25. % 基于积分的特殊性,修改为关于维度的相关结构
  26. */
  27. #include <iostream>
  28. #include <armadillo>
  29. #include <time.h>
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include "GPM.h"
  33. using namespace std;
  34. using namespace arma;
  35. int IZstruct(vec Z0, int Col_total, int length_state, int length_control, int length_integral, mat W_phase, auxdata1 auxdata, sp_mat*I_Z_struct0,
  36. int(*Dynamics_ptr)(mat* StateVar, mat* ControlVar, auxdata1 auxdata, mat* dState, mat* integrand, mat* path)) {
  37. // 初始化
  38. int DIM_all = length_state + length_control + 2;
  39. mat I_Z_struct01 = zeros(length_integral, DIM_all);
  40. // 计算依赖性矩阵
  41. int num;
  42. vec Z1, I1;
  43. for (int i = 1; i <= DIM_all; i++) {
  44. if (i <= length_state) {
  45. num = 1 + (i - 1)*(Col_total + 1) - 1;
  46. }
  47. else if (i > length_state && i <= length_state + length_control) {
  48. num = length_state*(Col_total + 1) + 1 + (i - 1 - length_state)*Col_total - 1;
  49. }
  50. else if (i > length_state + length_control) {
  51. num = length_state*(Col_total + 1) + length_control*Col_total + (i - length_control - length_state) - 1;
  52. }
  53. Z1 = Z0;
  54. Z1(num) = datum::nan;
  55. Istruct(Z1, Col_total, length_state, length_control, length_integral, W_phase, auxdata, Dynamics_ptr, &I1);
  56. I_Z_struct01.col(i - 1) = I1;
  57. }
  58. I_Z_struct01.elem(find_finite(I_Z_struct01)).zeros(); // 不相关设为0
  59. I_Z_struct01.elem(find_nonfinite(I_Z_struct01)).ones(); // 相关设为1
  60. (*I_Z_struct0) = sp_mat(I_Z_struct01);
  61. return 1;
  62. }