瀏覽代碼

управляющий параметр можно только объявлять

master
gvitbsord 2 月之前
父節點
當前提交
4edecc1212
共有 5 個檔案被更改,包括 24 行新增13 行删除
  1. 2
    2
      main.cpp
  2. 17
    9
      sysdiffeqn.cpp
  3. 1
    1
      sysdiffeqn.h
  4. 1
    0
      sysosndan.cpp
  5. 3
    1
      sysosndan.h

+ 2
- 2
main.cpp 查看文件

@@ -47,7 +47,7 @@ DEFUN_DLD (draghilev_oct, args, , "Draghilev method")
double N=DATA.get_par_diff().N;
int N_var=DATA.get_par_diff().nv;
double dt=DATA.get_par_diff().dt;
int N_upr=DATA.get_par_diff().up.size();//число управляющих параметро
int N_upr=DATA.get_par_diff().up.size();//число управляющих параметров

if ( args.length() == 2)
{
@@ -71,7 +71,7 @@ DEFUN_DLD (draghilev_oct, args, , "Draghilev method")
retval(0)=res_matrix;
retval(1)=dt;

if (N_upr != 0 )
if (N_upr != 0)
{
int t=0;
Matrix upr_matrix(nrow, N_upr);

+ 17
- 9
sysdiffeqn.cpp 查看文件

@@ -79,7 +79,8 @@ sys_diff_equation::sys_diff_equation(sys_osn_dan &sod_): sod(&sod_)
for (size_t j=0; j<uprav_par_ex.size(); j++)
est_uprav=est_uprav || GiNaC::has(expr_svob.back(),uprav_par_ex[j]);
}

sod->est_upr_par(est_uprav);
if (x.size()-expr_in.size() != 1 && (expr_svob.size() == 0 || expr_svob.size() % (x.size()-expr_in.size()-1) != 0))
{
_isstemp.str("");
@@ -104,15 +105,22 @@ void sys_diff_equation::det_comp()
{
std::ofstream ofst{"test.cpp"}; // текстовая форма сду

if (uprav_par_naz.size()>0 && !est_uprav)
{
ofst <<"//Не используется управляемый параметр" << std::endl;
// _isstemp.str("");
// _isstemp << "Не используется управляемый параметр";
// throw std::invalid_argument(_isstemp.str());
}
ofst << "#include <cmath> " << std::endl;
ofst << "#include \"virteqn.h\"" << '\n' << std::endl;
ofst << "class funcinst : public diffeqninterface {" << std::endl << "public:" <<std::endl;
ofst << "virtual std::vector<syseqn> funcv();" << std::endl;
ofst << "virtual state_type get_upr_par()";

if (!est_uprav)
ofst << " {return {};}" << std::endl;
else
// if (!est_uprav)
// ofst << " {return {};}" << std::endl;
//else
ofst << ";" << std::endl;

ofst << "private:" << std::endl;
@@ -136,16 +144,16 @@ void sys_diff_equation::det_comp()
ofst << "extern \"C\" diffeqninterface* create() {" << "return new funcinst;" << "}"<<std::endl;

ofst << "extern \"C\" void destroy(diffeqninterface *p) {" << "delete p;" << "}"<<std::endl <<std::endl;
for (auto it = uprav_par_naz.begin(); it != uprav_par_naz.end() && est_uprav; it++)
for (auto it = uprav_par_naz.begin(); it != uprav_par_naz.end(); it++)
ofst << "double funcinst::"<< *it << "=0;" << std::endl;

if (est_uprav)
{
// if (est_uprav)
// {
ofst << "state_type funcinst::get_upr_par() {" << std::endl << "state_type _upr_par;" << std::endl;
for (auto it = uprav_par_naz.begin(); it != uprav_par_naz.end() && est_uprav; it++)
for (auto it = uprav_par_naz.begin(); it != uprav_par_naz.end(); it++)
ofst << "_upr_par.push_back("<< *it << ");" << std::endl;
ofst << "return _upr_par;" << std::endl << "}" << std::endl << std::endl;
}
// }
ofst << "std::vector<syseqn> funcinst::funcv() {" << std::endl;
ofst << "std::vector<syseqn> temp_;" << std::endl;
for (int k=0; k < n_svob;k++)

+ 1
- 1
sysdiffeqn.h 查看文件

@@ -58,7 +58,7 @@ class sys_diff_equation
int n_svob; //число свободных переменных
int N_var;
int N_ex; //число уравнений
bool est_uprav;//Наличие управляющих параметров
bool est_uprav;//Наличие управляющих параметров в уравнениях
sys_osn_dan *sod;
};


+ 1
- 0
sysosndan.cpp 查看文件

@@ -63,6 +63,7 @@ soldif &sys_osn_dan::get_par_diff()
A.npp=nocpp;
A.noc=nocomp;
A.up=uprav_par_naz;
A.esup=est_up;
return A;
}


+ 3
- 1
sysosndan.h 查看文件

@@ -21,6 +21,7 @@ struct soldif
std::vector<std::string> eqn; //уравнения
std::vector<std::string> eqn_svob; //уравнения свободных недоопределенной системы число степеней свободы больше единицы; nsv=2,3..
std::vector<std::string> up; //управляющие параметры
bool esup; // наличие управляющих параметров в уранвнениях
bool npp; //не перезаписывать cpp-файл
bool noc; //не компилировать cpp-файл
};
@@ -31,6 +32,7 @@ class sys_osn_dan
sys_osn_dan(std::stringstream &, const bool, const bool); // исходные данные
//sys_osn_dan(draghilevinout &); // исходные данные
void set_par_diff(double &_N, double &_dt){N=_N; dt=_dt;};
void est_upr_par(bool &_est_up){est_up=_est_up;};
void set_coord(state_type &_x) {x=_x;};
void set_resIN(state_type &_coord) {res=_coord;};
void set_uprIN(state_type &_upr_) {upr_par=_upr_;};
@@ -47,7 +49,7 @@ class sys_osn_dan
static unsigned dim_line;
state_type x, res, upr_par;//res - полученное решение
double dt, N;
bool nocomp, nocpp;
bool nocomp, nocpp, est_up;
std::vector<std::string> equations, equations_svob, uprav_par_naz;
};


Loading…
取消
儲存