Решение систем нелинейных уравнений https://www.mapleprimes.com/users/one%20man/posts?page=1
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

funcdrag.cpp 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "sysdiffeqn.h"
  2. #include <stdexcept>
  3. #include <iostream>
  4. GiNaC::ex sys_diff_equation::eval_line(const GiNaC::ex &p1, const GiNaC::ex &p2)
  5. {
  6. if (p1.info(GiNaC::info_flags::posint) && p2.info(GiNaC::info_flags::posint))
  7. {
  8. int _p1=GiNaC::ex_to<GiNaC::numeric>(p1).to_int(), _p2=GiNaC::ex_to<GiNaC::numeric>(p2).to_int();
  9. vp_num.push_back(_p1);
  10. vp_num.push_back(_p2);
  11. // пока at, доделать проверку max(p1,p2)*dim_line<var_name.size() -1(+a)
  12. GiNaC::ex temp;
  13. for (unsigned i=0;i<dim_line;i++)
  14. temp += (var_name.at(_p1*dim_line-(i+1)) - var_name.at(_p2*dim_line-(i+1)))*(var_name.at(_p1*dim_line-(i+1)) - var_name.at(_p2*dim_line-(i+1)));
  15. return temp;
  16. }
  17. return 0;
  18. }
  19. GiNaC::ex sys_diff_equation::eval_circle(const GiNaC::ex &p1, const GiNaC::ex &p2, const GiNaC::ex &p3)
  20. {
  21. GiNaC::exvector p{p1,1,1,0,p2,p3,0};
  22. // GiNaC::ex temp=eval_ellipse3(p);
  23. // GiNaC::numeric _p1=GiNaC::ex_to<GiNaC::numeric>(p1), _p2=GiNaC::ex_to<GiNaC::numeric>(p2),
  24. // _p3=GiNaC::ex_to<GiNaC::numeric>(p3);
  25. // circ_num.push_back(_p1.to_int());
  26. // circ_coord.push_back(_p2.to_double());
  27. // circ_coord.push_back(_p3.to_double());
  28. return eval_ellipse3(p);
  29. }
  30. GiNaC::ex sys_diff_equation::eval_ellipse(const GiNaC::ex &p1, const GiNaC::ex &p2, const GiNaC::ex &p3, const GiNaC::ex &p4, const GiNaC::ex &p5)
  31. {
  32. GiNaC::exvector p{p1,p2,p3,0,p4,p5,0};
  33. return eval_ellipse3(p);
  34. }
  35. GiNaC::ex sys_diff_equation::eval_circle3(const GiNaC::ex &p1, const GiNaC::ex &p2, const GiNaC::ex &p3, const GiNaC::ex &p4)
  36. {
  37. int _ax1, _ax2;
  38. char _ch1, _ch2;
  39. std::vector<int> _temp_intax;
  40. std::stringstream _temp;
  41. GiNaC::exvector p{0,0,0,0,0,0,0};
  42. p2.print(GiNaC::print_dflt(_temp));
  43. _temp>>_ch1>>_ch2;
  44. _ax1 = _ch1-'w';
  45. _ax2 = _ch2-'w';
  46. p[0]=p1;
  47. p[_ax1]=1;
  48. p[_ax1+3]=p3;
  49. p[_ax2]=1;
  50. p[_ax2+3]=p4;
  51. return eval_ellipse3(p);
  52. }
  53. GiNaC::ex sys_diff_equation::eval_ellipse3(const GiNaC::exvector &p)
  54. {
  55. unsigned _check=0;
  56. unsigned _iscircle=0;
  57. if (p[0].info(GiNaC::info_flags::posint))
  58. {
  59. _check++;
  60. }
  61. for (unsigned i=1;i<dim_line+1;i++)
  62. if (p[i].info(GiNaC::info_flags::nonnegative))
  63. {
  64. _check++;
  65. if (p[i] == 1)
  66. _iscircle++;
  67. }
  68. if (_check >= 3)//1-номер, 2-мин кол-во осей
  69. {
  70. GiNaC::numeric _p0=GiNaC::ex_to<GiNaC::numeric>(p[0]);
  71. GiNaC::ex temp;
  72. if (_iscircle == 2)
  73. {
  74. circ_num.push_back(_p0.to_int());
  75. for (unsigned i=1;i<dim_line+1;i++)
  76. if (p[i] == 1 && GiNaC::is_a<GiNaC::numeric>(p[i+3]))
  77. circ_coord.push_back(GiNaC::ex_to<GiNaC::numeric>(p[i+3]).to_double());
  78. else circ_coord.push_back(0);
  79. }
  80. for (unsigned i=0;i<dim_line;i++)
  81. temp += p[i+1]*(var_name[_p0.to_int()*dim_line-(dim_line-i)]-p[4+i])*(var_name[_p0.to_int()*dim_line-(dim_line-i)]-p[4+i]);//c 4 начинаются координаты цента, 0 - номер точки, 1-3 -степень деформации
  82. return temp;
  83. }
  84. else
  85. throw std::invalid_argument("аргумент не подходящий");
  86. }
  87. // static void sys_diff_equation::print_line(const GiNaC::ex &p1, const GiNaC::ex &p2, const print_context & c)
  88. // {
  89. // c.s << "{|"; p1.print(c); c.s << "|}";
  90. // }
  91. REGISTER_FUNCTION(line, eval_func(sys_diff_equation::eval_line))
  92. REGISTER_FUNCTION(circle, eval_func(sys_diff_equation::eval_circle))
  93. REGISTER_FUNCTION(ellipse, eval_func(sys_diff_equation::eval_ellipse))
  94. REGISTER_FUNCTION(circle3, eval_func(sys_diff_equation::eval_circle3))
  95. REGISTER_FUNCTION(ellipse3, eval_func(sys_diff_equation::eval_ellipse3))