//Котельникова Любовь, 113 группа, курсовая работа
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
#include <cfloat>
#include <clocale>
#include <float.h>
using namespace std;
typedef double ( * Func) ( double * ) ;
class RungeKut
{
private :
int N;
Func* FuncArray;
double * x0;
double * yR; //текущий столбец значений-решений
double t; //независимая переменная, изменяющаяся от а до b
const char * stroka;
public :
RungeKut( int n) ;
void Init( double * X0, Func* Funcarray, const char * a) ;
void Start( double T_0, double T_end, double Step) ;
~RungeKut( ) ;
} ;
RungeKut:: RungeKut ( int n)
{
N= n;
x0= new double [ N] ;
yR= new double [ N] ;
}
void RungeKut:: Init ( double * X0, Func* Funcarray, const char * a)
{
FuncArray= new Func[ N] ;
for ( int i= 0 ; i< N; i++ ) {
FuncArray[ i] = Funcarray[ i] ;
x0[ i] = X0[ i] ;
}
int len= strlen ( a) ;
stroka= new char [ len+ 1 ] ;
stroka= a;
}
void RungeKut:: Start ( double T_0, double T_end, double Step)
{
ofstream fout( stroka) ;
t= T_0;
int ii= ( int ) ( ( T_end- T_0) / Step) ;
fout<< t;
for ( int j= 0 ; j< N; j++ ) {
fout<< " " << x0[ j] ;
yR[ j] = x0[ j] ;
}
fout<< endl;
for ( int k= 0 ; k< ii; k++ )
{
double * K0= new double [ N] ;
double * K1= new double [ N] ;
double * K2= new double [ N] ;
double * K3= new double [ N] ;
double * Khelp= new double [ N] ;
for ( int i= 0 ; i< N; i++ ) {
K0[ i] = Step* FuncArray[ i] ( yR) ;
Khelp[ i] = yR[ i] + K0[ i] / 2 ;
}
for ( int i= 0 ; i< N; i++ ) {
K1[ i] = Step* FuncArray[ i] ( Khelp) ;
}
for ( int i= 0 ; i< N; i++ ) {
Khelp[ i] = yR[ i] + K1[ i] / 2 ;
}
for ( int i= 0 ; i< N; i++ ) {
K2[ i] = Step* FuncArray[ i] ( Khelp) ;
}
for ( int i= 0 ; i< N; i++ ) {
Khelp[ i] = yR[ i] + K2[ i] ;
}
for ( int i= 0 ; i< N; i++ ) {
K3[ i] = Step* FuncArray[ i] ( Khelp) ;
}
for ( int i= 0 ; i< N; i++ ) {
yR[ i] = yR[ i] + ( K0[ i] + 2 * K1[ i] + 2 * K2[ i] + K3[ i] ) / 6 ;
}
t= t+ Step;
fout<< t;
for ( int j= 0 ; j< N; j++ ) {
fout<< " " << yR[ j] ; // В файле столбики: t,yR[1],yR[2],...,yR[N]
}
fout<< endl;
delete [ ] K0;
delete [ ] K1;
delete [ ] K2;
delete [ ] K3;
delete [ ] Khelp;
}
fout.close ( ) ;
}
RungeKut:: ~RungeKut( )
{
delete [ ] x0;
delete [ ] yR;
delete [ ] stroka;
delete [ ] FuncArray;
}
double xxx( double * y)
{
//return 5.*(y[1]-y[0]);
return y[ 0 ] ;
}
double yyy( double * y)
{
//return y[0]*(4.-y[2])-y[1];
return y[ 1 ] ;
}
double zzz( double * y)
{
//return y[0]*y[1]-y[2];
return y[ 2 ] ;
}
int main( )
{
int n= 3 ;
double a,b,h;
a= 0 ;
b= 100 ;
h= 0.01 ;
double * X0= new double [ n] ;
/*cout<<"Vvedite stolbets X0 ";
for (int i=0;i<n;i++) {
cin>>X0[i];
}*/
X0[ 0 ] = 0.1 ;
X0[ 1 ] = 0.1 ;
X0[ 2 ] = 0.1 ;
if ( ( X0[ 0 ] == 0 ) && ( X0[ 1 ] == 0 ) && ( X0[ 2 ] == 0 ) ) {
double a= DBL_EPSILON ;
X0[ 0 ] = X0[ 1 ] = X0[ 2 ] = a;
}
Func* Funcarray= new Func[ n] ;
Funcarray[ 0 ] = xxx;
Funcarray[ 1 ] = yyy;
Funcarray[ 2 ] = zzz;
RungeKut rk= RungeKut( n) ;
rk.Init ( X0,Funcarray, "ab.txt" ) ;
rk.Start ( a,b,h) ;
return 0 ;
}
Ly/QmtC+0YLQtdC70YzQvdC40LrQvtCy0LAg0JvRjtCx0L7QstGMLCAxMTMg0LPRgNGD0L/Qv9CwLCDQutGD0YDRgdC+0LLQsNGPINGA0LDQsdC+0YLQsAojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8Y2Zsb2F0PgojaW5jbHVkZSA8Y2xvY2FsZT4KI2luY2x1ZGUgPGZsb2F0Lmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgZG91YmxlICgqRnVuYykoZG91YmxlKik7CmNsYXNzIFJ1bmdlS3V0CnsKICAgIHByaXZhdGU6CiAgICBpbnQgTjsKCUZ1bmMqIEZ1bmNBcnJheTsKICAgIGRvdWJsZSAqeDA7CiAgICBkb3VibGUgKnlSOyAgICAgICAvL9GC0LXQutGD0YnQuNC5INGB0YLQvtC70LHQtdGGINC30L3QsNGH0LXQvdC40Lkt0YDQtdGI0LXQvdC40LkKICAgIGRvdWJsZSB0OyAgICAgICAgICAgLy/QvdC10LfQsNCy0LjRgdC40LzQsNGPINC/0LXRgNC10LzQtdC90L3QsNGPLCDQuNC30LzQtdC90Y/RjtGJ0LDRj9GB0Y8g0L7RgiDQsCDQtNC+IGIKICAgIGNvbnN0IGNoYXIqIHN0cm9rYTsKICAgIHB1YmxpYzoKICAgIFJ1bmdlS3V0KGludCBuKTsKICAgIHZvaWQgSW5pdChkb3VibGUgKlgwLCBGdW5jKiBGdW5jYXJyYXksIGNvbnN0IGNoYXIqIGEpOwogICAgdm9pZCBTdGFydChkb3VibGUgVF8wLCBkb3VibGUgVF9lbmQsIGRvdWJsZSBTdGVwKTsKICAgIH5SdW5nZUt1dCgpOwp9OwpSdW5nZUt1dDo6UnVuZ2VLdXQoaW50IG4pCnsKICAgIE49bjsgCgl4MD1uZXcgZG91YmxlW05dOwoJeVI9bmV3IGRvdWJsZVtOXTsKfQp2b2lkIFJ1bmdlS3V0OjpJbml0KGRvdWJsZSAqWDAsIEZ1bmMqIEZ1bmNhcnJheSwgY29uc3QgY2hhciogYSkgICAKewogICAgRnVuY0FycmF5PW5ldyBGdW5jW05dOwoJZm9yKGludCBpPTA7aTxOO2krKykgewoJCUZ1bmNBcnJheVtpXT1GdW5jYXJyYXlbaV07CgkJeDBbaV09WDBbaV07Cgl9CiAgICBpbnQgbGVuPXN0cmxlbihhKTsKCXN0cm9rYT1uZXcgY2hhcltsZW4rMV07CglzdHJva2E9YTsKfQp2b2lkIFJ1bmdlS3V0OjpTdGFydChkb3VibGUgVF8wLCBkb3VibGUgVF9lbmQsIGRvdWJsZSBTdGVwKQp7CglvZnN0cmVhbSBmb3V0KHN0cm9rYSk7CiAgICB0PVRfMDsKICAgIGludCBpaT0oaW50KSgoVF9lbmQtVF8wKS9TdGVwKTsKICAgIGZvdXQ8PHQ7CiAgICBmb3IgKGludCBqPTA7ajxOO2orKykgewoJCWZvdXQ8PCIgIjw8eDBbal07CgkJeVJbal09eDBbal07Cgl9Cglmb3V0PDxlbmRsOwoJZm9yKGludCBrPTA7azxpaTtrKyspCgl7CgkgICBkb3VibGUgKkswPW5ldyBkb3VibGVbTl07CgkgICBkb3VibGUgKksxPW5ldyBkb3VibGVbTl07CiAgICAgICBkb3VibGUgKksyPW5ldyBkb3VibGVbTl07CgkgICBkb3VibGUgKkszPW5ldyBkb3VibGVbTl07CgkgICBkb3VibGUgKktoZWxwPW5ldyBkb3VibGVbTl07CgkgICBmb3IoaW50IGk9MDsgaTxOO2krKyl7CgkJICAgSzBbaV09U3RlcCpGdW5jQXJyYXlbaV0oeVIpOwogICAgICAgICAgIEtoZWxwW2ldPXlSW2ldK0swW2ldLzI7CgkgICB9CgkgICBmb3IoaW50IGk9MDtpPE47aSsrKXsKCQkgICBLMVtpXT1TdGVwKkZ1bmNBcnJheVtpXShLaGVscCk7CgkgICB9CgkgICBmb3IoaW50IGk9MDtpPE47aSsrKXsKICAgICAgICAgICBLaGVscFtpXT15UltpXStLMVtpXS8yOwoJICAgfQoJICAgZm9yKGludCBpPTA7aTxOO2krKyl7CgkJICAgSzJbaV09U3RlcCpGdW5jQXJyYXlbaV0oS2hlbHApOwoJICAgfQoJICAgZm9yKGludCBpPTA7aTxOO2krKyl7CiAgICAgICAgICAgS2hlbHBbaV09eVJbaV0rSzJbaV07CgkgICB9CgkgICBmb3IoaW50IGk9MDtpPE47aSsrKXsKCQkgICBLM1tpXT1TdGVwKkZ1bmNBcnJheVtpXShLaGVscCk7CgkgICB9CgkgICBmb3IoaW50IGk9MDtpPE47aSsrKXsKICAgICAgICAgICB5UltpXT15UltpXSsoSzBbaV0rMipLMVtpXSsyKksyW2ldK0szW2ldKS82OwoJICAgfQoJICAgdD10K1N0ZXA7CiAgICAgICBmb3V0PDx0OwogICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspIHsKCSAgIAkgICAgZm91dDw8IiAiPDx5UltqXTsgICAgICAgICAgICAgICAgICAgICAgIC8vINCSINGE0LDQudC70LUg0YHRgtC+0LvQsdC40LrQuDogdCx5UlsxXSx5UlsyXSwuLi4seVJbTl0KCSAgICAgICAgfQoJICAgZm91dDw8ZW5kbDsKCSAgIGRlbGV0ZSBbXSBLMDsKICAgICAgIGRlbGV0ZSBbXSBLMTsKCSAgIGRlbGV0ZSBbXSBLMjsKCSAgIGRlbGV0ZSBbXSBLMzsKCSAgIGRlbGV0ZSBbXSBLaGVscDsKCX0KCWZvdXQuY2xvc2UoKTsKfQpSdW5nZUt1dDo6flJ1bmdlS3V0KCkKewoJZGVsZXRlIFtdIHgwOwoJZGVsZXRlIFtdIHlSOwoJZGVsZXRlIFtdIHN0cm9rYTsKCWRlbGV0ZSBbXSBGdW5jQXJyYXk7Cn0KZG91YmxlIHh4eChkb3VibGUgKnkpCnsKCS8vcmV0dXJuIDUuKih5WzFdLXlbMF0pOwoJcmV0dXJuIHlbMF07Cn0KZG91YmxlIHl5eShkb3VibGUgKnkpCnsKCS8vcmV0dXJuIHlbMF0qKDQuLXlbMl0pLXlbMV07CglyZXR1cm4geVsxXTsKfQpkb3VibGUgenp6KGRvdWJsZSAqeSkKewoJLy9yZXR1cm4geVswXSp5WzFdLXlbMl07CglyZXR1cm4geVsyXTsKfQppbnQgbWFpbigpCnsKICAgIGludCBuPTM7CiAgICBkb3VibGUgYSxiLGg7CglhPTA7CgliPTEwMDsKCWg9MC4wMTsKCWRvdWJsZSAqWDA9bmV3IGRvdWJsZVtuXTsKCS8qY291dDw8IlZ2ZWRpdGUgc3RvbGJldHMgWDAgIjsKCWZvciAoaW50IGk9MDtpPG47aSsrKSB7CgkJY2luPj5YMFtpXTsKCX0qLwoJWDBbMF09MC4xOwoJWDBbMV09MC4xOwoJWDBbMl09MC4xOwogICAgaWYgKChYMFswXT09MCkmJihYMFsxXT09MCkmJihYMFsyXT09MCkpIHsKICAgICAgICBkb3VibGUgYT1EQkxfRVBTSUxPTjsKICAgICAgICBYMFswXT1YMFsxXT1YMFsyXT1hOwogICAgfQoJRnVuYyogRnVuY2FycmF5PW5ldyBGdW5jW25dOwoJRnVuY2FycmF5WzBdPXh4eDsKCUZ1bmNhcnJheVsxXT15eXk7CiAgICBGdW5jYXJyYXlbMl09enp6OwogICAgUnVuZ2VLdXQgcms9UnVuZ2VLdXQobik7CiAgICByay5Jbml0KFgwLEZ1bmNhcnJheSwgImFiLnR4dCIpOwogICAgcmsuU3RhcnQoYSxiLGgpOwogICAgcmV0dXJuIDA7Cn0=
compilation info
prog.cpp: In member function ‘void RungeKut::Init(double*, double (**)(double*), const char*)’:
prog.cpp:39:21: error: ‘strlen’ was not declared in this scope
int len=strlen(a);
^
stdout