Решение систем нелинейных уравнений 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.

solver.cpp 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "solver.h"
  2. solver_diff_eqn::solver_diff_eqn(sys_osn_dan &sod_, double exit_tol):sod(&sod_)
  3. {
  4. N=sod->get_par_diff().N;
  5. dt=sod->get_par_diff().dt;
  6. x=sod->get_par_diff().x0;
  7. n_svob=sod->get_par_diff().nsv;
  8. not_comp_=sod->get_par_diff().noc;
  9. std::ifstream stream("test.so");
  10. if ( !(stream.good() && not_comp_) )
  11. {
  12. int systemErr=system("g++ -fPIC -shared -o test.so test.cpp -O2");
  13. if (systemErr == -1)
  14. std::cerr<<"Ошибка компилирования"<<std::endl;
  15. }
  16. stream.close();
  17. shared_object = dlopen("./test.so", RTLD_NOW);
  18. create_t* load_sys = (create_t*) dlsym(shared_object, "create");
  19. destroy_t* unload_sys = (destroy_t*) dlsym(shared_object, "destroy");
  20. diffeqninterface* func_sys=load_sys();
  21. func=func_sys->funcv();
  22. // std::vector<double> temvec{-.6,.2,-2};
  23. double l_dt=0, r_dt=dt, mc_pos, mv_pos;
  24. state_type::iterator mc_diff, mv_diff;;
  25. coordinate.insert(coordinate.end(), x.begin(), x.end());
  26. const state_type x0=x;//начальная точка
  27. state_type v0(x.size());//начальная скорость
  28. state_type v(x.size()), v_diff(x.size()), c_diff(x.size());
  29. state_type _upr_par={0};
  30. if ( exit_tol>0 )
  31. func[0](x0,v0,l_dt);
  32. for (double i=0;i<N;)
  33. for (int k=0; k<n_svob && i<N; k++)
  34. {
  35. i++;
  36. rk.do_step( std::ref(func[k]) , x , l_dt , r_dt );
  37. coordinate.insert(coordinate.end(), x.begin(), x.end());
  38. for (size_t j = 0; j < sod->get_par_diff().up.size(); j++)
  39. _upr_par.push_back(func_sys->get_upr_par()[j]);
  40. if ( exit_tol>0 )
  41. {
  42. for (size_t j = 0; j < x.size(); j++)
  43. {
  44. c_diff[j]=fabs(x[j]-x0[j]);
  45. func[k](x,v,l_dt);
  46. v_diff[j]=fabs(v[j]-v0[j]);
  47. }
  48. mc_diff=std::max_element(c_diff.begin(), c_diff.end());//максимальная разность координаты
  49. mc_pos=std::distance(c_diff.begin(), mc_diff);//номер координаты
  50. mv_diff=std::max_element(v_diff.begin(), v_diff.end());//максимальная разность скорости
  51. mv_pos=std::distance(v_diff.begin(), mv_diff);//номер координаты
  52. if ( *mc_diff < exit_tol*fabs(x0[mc_pos]) && *mv_diff < 0.2*fabs(v0[mv_pos]) ) //20% на изменение скорости
  53. {
  54. i=N;
  55. sod->set_par_diff(N,dt);
  56. // std::cout<<"C "<< *mc_diff <<' '<< exit_tol*fabs(x0[mc_pos]) <<std::endl;
  57. // std::cout<<"V "<< *mv_diff <<' '<< .2*fabs(v0[mv_pos]) <<std::endl;
  58. }
  59. }
  60. }
  61. sod->set_resIN(coordinate);
  62. sod->set_uprIN(_upr_par);
  63. unload_sys(func_sys);
  64. closeso=true; //исправить sysosndan
  65. // if (closeso)
  66. // dlclose(shared_object);
  67. // for (size_t i=0; i<_upr_par.size();i++)
  68. // std::cout<<_upr_par[i]<<std::endl;
  69. }
  70. solver_diff_eqn::~solver_diff_eqn(){ dlclose(shared_object); }//вызывает segmentation fault