// // russian : cp1251 encoding // http://mech.math.msu.su/~iliagri/ext_value.htm // version 25.10.2023 // #include #include using namespace std; class ext_value3 { int n_var; double val, // значение *der_1, // массив первых производных *der_2, // массив вторых производных *der_3; // массив третьих производных public: // конструктор по-умолчанию для создания массива объектов ext_value3() { n_var=0; val=0; der_1=der_2=der_3=NULL; } // деструктор: нужно удалять динамически выделенную память (иначе утечка памяти) ~ext_value3() { if(der_1)delete [] der_1; if(der_2) delete [] der_2; if(der_3) delete [] der_3; n_var=0; } // конструктор копирования ext_value3(const ext_value3 &ob); // конструктор для создания независимой переменной или константы ext_value3(int n, double a=0.0, int m=-1); // установка размерности (для использования конструктора по-умолчанию) void set_dim(int n); // установка значения void set(double a){ val=a; } // установка значения i-й компоненты первой производной void set(double a,int i); // установка значения i,j-й компоненты второй производной void set(double a,int i,int j); // установка значения i,j,k-й компоненты третьей производной void set(double a,int i,int j,int k); // получить значение double get() { return val; } // получить значение i-й компоненты первой производной double get(int i); // получить значение i,j-й компоненты второй производной double get(int i,int j); // получить значение i,j,k-й компоненты третьей производной double get(int i,int j,int k); ext_value3& operator =(const ext_value3 &a); ext_value3& operator +=(const ext_value3 &a); ext_value3& operator +=(double a); ext_value3 operator +(const ext_value3 &a); ext_value3 operator +(double a); friend ext_value3 operator +(double b,const ext_value3 &a); ext_value3& operator *=(const ext_value3 &a); ext_value3& operator *=(double a); ext_value3 operator *(const ext_value3 &a); ext_value3 operator *(double a); friend ext_value3 operator *(double b,const ext_value3 &a); ext_value3& operator -=(const ext_value3 &a); ext_value3& operator -=(double a); ext_value3 operator -(const ext_value3 &a); ext_value3 operator -(double a); friend ext_value3 operator -(double b,const ext_value3 &a); // унарный минус: ext_value3 operator -(); // унарный плюс не реализован. Нужен? ext_value3 operator /(const ext_value3 &a); ext_value3 operator /(double a); ext_value3& operator /=(const ext_value3 &a); ext_value3& operator /=(double a); friend ext_value3 operator /(double b,const ext_value3 &a); friend ext_value3 sin(const ext_value3 &a); friend ext_value3 cos(const ext_value3 &a); friend ext_value3 sqrt(const ext_value3 &a); friend ext_value3 exp(const ext_value3 &a); friend ext_value3 atan2(const ext_value3 &a,const ext_value3 &b); friend ext_value3 asin(const ext_value3 &a); friend ext_value3 acos(const ext_value3 &a); }; class ext_value2 { int n_var; double val, // значение *der_1, // массив первых производных *der_2; // массив вторых производных public: // конструктор по-умолчанию для создания массива объектов ext_value2() { n_var=0; val=0; der_1=der_2=NULL; } // деструктор: нужно удалять динамически выделенную память (иначе утечка памяти) ~ext_value2() { if(der_1)delete [] der_1; if(der_2) delete [] der_2; n_var=0; } // конструктор копирования ext_value2(const ext_value2 &ob); // конструктор для создания независимой переменной или константы ext_value2(int n, double a=0.0, int m=-1); // установка размерности (для использования конструктора по-умолчанию) void set_dim(int n); // установка значения void set(double a){ val=a; } // установка значения i-й компоненты первой производной void set(double a,int i); // установка значения i,j-й компоненты второй производной void set(double a,int i,int j); // получить значение double get() { return val; } // получить значение i-й компоненты первой производной double get(int i); // получить значение i,j-й компоненты второй производной double get(int i,int j); ext_value2& operator =(const ext_value2 &a); ext_value2& operator +=(const ext_value2 &a); ext_value2& operator +=(double a); ext_value2 operator +(const ext_value2 &a); ext_value2 operator +(double a); friend ext_value2 operator +(double b,const ext_value2 &a); ext_value2& operator *=(const ext_value2 &a); ext_value2& operator *=(double a); ext_value2 operator *(const ext_value2 &a); ext_value2 operator *(double a); friend ext_value2 operator *(double b,const ext_value2 &a); ext_value2& operator -=(const ext_value2 &a); ext_value2& operator -=(double a); ext_value2 operator -(const ext_value2 &a); ext_value2 operator -(double a); friend ext_value2 operator -(double b,const ext_value2 &a); // унарный минус: ext_value2 operator -(); ext_value2 operator /(const ext_value2 &a); ext_value2 operator /(double a); ext_value2& operator /=(const ext_value2 &a); ext_value2& operator /=(double a); friend ext_value2 operator /(double b,const ext_value2 &a); friend ext_value2 sin(const ext_value2 &a); friend ext_value2 cos(const ext_value2 &a); friend ext_value2 sqrt(const ext_value2 &a); friend ext_value2 exp(const ext_value2 &a); friend ext_value2 atan2(const ext_value2 &a,const ext_value2 &b); friend ext_value2 asin(const ext_value2 &a); friend ext_value2 acos(const ext_value2 &a); }; class ext_value1 { int n_var; double val, // значение *der_1; // массив первых производных public: // конструктор по-умолчанию для создания массива объектов ext_value1() { n_var=0; val=0; der_1=NULL; } // деструктор: нужно удалять динамически выделенную память (иначе утечка памяти) ~ext_value1() { if(der_1)delete [] der_1; n_var=0; } // конструктор копирования ext_value1(const ext_value1 &ob); // конструктор для создания независимой переменной или константы ext_value1(int n, double a=0.0, int m=-1); // установка размерности (для использования конструктора по-умолчанию) void set_dim(int n); // установка значения void set(double a){ val=a; } // установка значения i-й компоненты первой производной void set(double a,int i); // получить значение double get() { return val; } // получить значение i-й компоненты первой производной double get(int i); ext_value1& operator =(const ext_value1 &a); ext_value1& operator +=(const ext_value1 &a); ext_value1& operator +=(double a); ext_value1 operator +(const ext_value1 &a); ext_value1 operator +(double a); friend ext_value1 operator +(double b,const ext_value1 &a); ext_value1& operator *=(const ext_value1 &a); ext_value1& operator *=(double a); ext_value1 operator *(const ext_value1 &a); ext_value1 operator *(double a); friend ext_value1 operator *(double b,const ext_value1 &a); ext_value1& operator -=(const ext_value1 &a); ext_value1& operator -=(double a); ext_value1 operator -(const ext_value1 &a); ext_value1 operator -(double a); friend ext_value1 operator -(double b,const ext_value1 &a); // унарный минус: ext_value1 operator -(); ext_value1 operator /(const ext_value1 &a); ext_value1 operator /(double a); ext_value1& operator /=(const ext_value1 &a); ext_value1& operator /=(double a); friend ext_value1 operator /(double b,const ext_value1 &a); friend ext_value1 sin(const ext_value1 &a); friend ext_value1 cos(const ext_value1 &a); friend ext_value1 sqrt(const ext_value1 &a); friend ext_value1 exp(const ext_value1 &a); friend ext_value1 atan2(const ext_value1 &a,const ext_value1 &b); friend ext_value1 asin(const ext_value1 &a); friend ext_value1 acos(const ext_value1 &a); }; // конструктор копирования ext_value3::ext_value3(const ext_value3 &ob) { int i,t; val=ob.val; n_var=ob.n_var; if(n_var) { der_1=new double[n_var]; for(i=0;i=0 && m=0 && m=0 && m=0 && i=0 && i=0 && i=n_var) throw i; if(j<0 || j>=n_var) throw j; der_2[i+(j*(j+1))/2]=a; } void ext_value2::set(double a,int i,int j) { if(n_var<=0) throw n_var; // исключительная ситуация ошибка размерности if(i<0 || i>=n_var) throw i; if(j<0 || j>=n_var) throw j; der_2[i+(j*(j+1))/2]=a; } // установка значения i,j,k-й компоненты третьей производной void ext_value3::set(double a,int i,int j,int k) { if(n_var<=0) throw n_var; // исключительная ситуация ошибка размерности if(i<0 || i>=n_var) throw i; if(j<0 || j>=n_var) throw j; if(k<0 || k>=n_var) throw j; der_3[i+(j*(j+1))/2+(k*(k*k+k+2))/4]=a; } // получить значение i-й компоненты первой производной double ext_value3::get(int i) { if(n_var<=0) {cerr<<"ext_value3 n_var throw "<=n_var) {cerr<<"ext_value3 i throw "<=n_var) {cerr<<"ext_value3 i throw "<=n_var) {cerr<<"ext_value3 i throw "<=n_var) throw i; if(j<0 || j>=n_var) throw j; int t; if(i>j) { t=i; i=j; j=t;} return der_2[i+(j*(j+1))/2]; } double ext_value2::get(int i,int j) { if(n_var<=0) throw n_var; if(i<0 || i>=n_var) throw i; if(j<0 || j>=n_var) throw j; int t; if(i>j) { t=i; i=j; j=t;} return der_2[i+(j*(j+1))/2]; } // получить значение i,j,k-й компоненты третьей производной double ext_value3::get(int i,int j,int k) { if(n_var<=0) throw n_var; if(i<0 || i>=n_var) throw i; if(j<0 || j>=n_var) throw j; if(k<0 || k>=n_var) throw j; int t; if(i>j) { t=i; i=j; j=t;} if(i>k) { t=i; i=k; k=t;} if(j>k) { t=j; j=k; k=t;} return der_3[i+(j*(j+1))/2+(k*(k*k+k+2))/4]; } // оператор = ext_value3& ext_value3::operator =(const ext_value3 &a) { int i,t; val=a.val; if (a.n_var==0) { if(der_1) delete [] der_1; if(der_2) delete [] der_2; if(der_3) delete [] der_3; n_var=0; return *this; } else if(n_var != a.n_var) { if(der_1) delete [] der_1; if(der_2) delete [] der_2; if(der_3) delete [] der_3; n_var=a.n_var; t=(n_var*(n_var+1))/2; der_1=new double[n_var]; t=(n_var*(n_var+1))/2; der_2=new double[t]; t=(n_var*(n_var+1))/2+((n_var-1)*(n_var*n_var-n_var+2))/4; der_3=new double[t]; } for(i=0;i