Исследование модели фрактального броуновского движения (1005943), страница 7
Текст из файла (страница 7)
}
// Построение графика спектральной плотности
int c = 200;
Image1->Canvas->MoveTo(5,250-floor(f[0]*c));
Memo1->Lines->Add(AnsiString(f[0]));
for (int i=1; i<=N; i++) {
Image1->Canvas->LineTo(5+i*(500.0/N),250-floor(f[i]*c));
Memo1->Lines->Add(AnsiString(Fspectr(lambda[i])));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
// Моделирование ФБД
{
Memo1->Clear();
CanvasClear();
double lambda[N+1];
double f[N+1];
double Vk[N+1];
double beta[n+1];
AnsiString buf;
// Считывание значений Lambda[k] для данного N и параметра Харста H
for (int i=0; i<=N; i++) {
buf = Memo2->Lines->Strings[i];
lambda[i] = StrToFloat(buf);
}
// Генерирование случайных величин V[k]
randomize();
for (int i=0; i<=N; i++) {
Vk[i] = RandG(0,1)/sqrt(N);
}
// Вычисление реализаций ФГШ
for (int i=0; i<n; i++) {
beta[i]=0;
for (int j=1; j<=N; j++) {
beta[i] += cos(lambda[j]*i)*Vk[j];
}
}
// Вычисление значений ФБД
B[0] = 0;
Memo1->Lines->Add(AnsiString(B[0]));
for (int i=1; i<=n; i++) {
B[i] = B[i-1] + beta[i-1];
Memo1->Lines->Add(AnsiString(B[i]));
}
//ScaleMotion();
// Вычисление масштаба шкалы значений ФБД
double maxb = 0;
for (int i=0; i<=n; i++) {
if (maxb < fabs(B[i])) {
maxb = fabs(B[i]);
}
}
int scale = floor(250/maxb);
if (scale > 249 ) {
scale = 249;
}
// Отрисовка осей координат
Image1->Canvas->Pen->Color = clSilver;
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->LineTo(405,250);
Image1->Canvas->MoveTo(405,250);
Image1->Canvas->LineTo(405,255);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(5,250+scale);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(10,250-scale);
Image1->Canvas->MoveTo(5,250+scale);
Image1->Canvas->LineTo(10,250+scale);
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->Pen->Color = clBlack;
// Построение графика ФБД
for (int i=0; i<=n; i++) {
Image1->Canvas->LineTo(5+i*2,250-B[i]*scale);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnLoadClick(TObject *Sender)
// Загрузка значений Lambda[k] из внешнего файла
{
Memo2->Clear();
char p[100];
if(OpenDialog1->Execute()){
AnsiString PathName = OpenDialog1->FileName;
using namespace std;
fstream myfile(PathName.c_str());
while (!myfile.eof()) {
myfile.getline(p,100);
Memo2->Lines->Add(AnsiString(p));
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnSaveClick(TObject *Sender)
// Сохранение вычисленных значений Lambda[k] во внешний файл
{
if ( SaveDialog1->Execute() ) {
AnsiString PathName = SaveDialog1->FileName;
using namespace std;
fstream myfile(PathName.c_str());
myfile << Memo2->Text.c_str();
myfile.close();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnCalcClick(TObject *Sender)
// Вычисление значений Lambda[k] для заданного N и параметра Харста H
{
double lambda[N+1];
double delta = 0.00001;
lambda[0] = -M_PI;
Memo2->Lines->Add(AnsiString(lambda[0]));
double I, I2;
double x = -M_PI;
int k = 0;
I = 0;
while (x<0) {
I2 = I;
I = (x + M_PI)/(2*M_PI);
for (int i=1; i<=L; i++) {
I+= (Cov(i)*(sin(x*i)+sin(M_PI*i)))/(M_PI*i);
}
if ( (I2 < (1.0/N)*(k+1)) && (I >= (1.0/N)*(k+1)) ) {
lambda[k+1] = x;
k++;
Memo2->Lines->Add(AnsiString(x));
}
x += delta;
}
lambda[N/2] = 0;
Memo2->Lines->Add(AnsiString(lambda[N/2]));
for (int i=1; i<=N/2; i++) {
lambda[N/2+i] = fabs(lambda[N/2-i]);
Memo2->Lines->Add(AnsiString(lambda[N/2+i]));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnHurstClick(TObject *Sender)
// Изменение значения параметра Харста
{
H = StrToFloat(editHurst->Text);
lblHurst->Caption = "H = " + AnsiString(H);
Memo2->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnCovClick(TObject *Sender)
// Построение оценки ковариационной функции
{
CanvasClear();
const int nn = 21; // количество вычисляемых значений
// Вычисление точного значения ковариационной функции
double Cv[nn];
for (int i=0; i<nn; i++) {
Cv[i] = Cov(i);
}
// Построение массива реализаций ФГШ
double beta[n];
for (int i=0; i<n; i++) {
beta[i] = B[i+1]-B[i];
}
Memo1->Lines->Add(" ");
Memo1->Lines->Add("cov = ");
// Вычисление оценки ковариационной функции по реализациям ФГШ
double Cv2[nn];
for (int i=0; i<nn; i++) {
Cv2[i] = 0;
for (int j=0; j<=n-i-1; j++) {
Cv2[i] += beta[i+j]*beta[j];
}
Cv2[i] = Cv2[i]/(n-i);
Memo1->Lines->Add(FloatToStr(Cv2[i]));
}
// Вычисление масштаба шкалы значений ковариационной функции
double maxb = 0;
for (int i=0; i<nn-1; i++) {
if (maxb < fabs(Cv2[i])) {
maxb = fabs(Cv2[i]);
}
}
int scale = ceil(250/maxb);
if (scale > 249 ) {
scale = 249;
}
// Отрисовка осей координат
Image1->Canvas->Pen->Color = clSilver;
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->LineTo(5+10*(nn-1),250);
Image1->Canvas->LineTo(5+10*(nn-1),255);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(5,250+scale);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(10,250-scale);
Image1->Canvas->MoveTo(5,250+scale);
Image1->Canvas->LineTo(10,250+scale);
Image1->Canvas->Pen->Color = clBlack;
// Построение графика точного значения ковариационной функции
Image1->Canvas->MoveTo(5,250-scale*Cv[0]);
for (int i=1; i<nn; i++) {
Image1->Canvas->LineTo(5+i*10,250-scale*Cv[i]);
}
// Построение графика оценки ковариационной функции
Image1->Canvas->Pen->Color = clRed;
Image1->Canvas->MoveTo(5,250-scale*Cv2[0]);
for (int i=1; i<nn; i++) {
Image1->Canvas->LineTo(5+i*10,250-scale*Cv2[i]);
}
double He = 0.5*log(Cv2[1]+1.0)/log(2) + 0.5;
Label2->Caption = "[H] = "+AnsiString(floor(He*10000.0)/10000.0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnLoadSignalClick(TObject *Sender)
// Загрузка сигнала, построенного в Matlab
{
Memo1->Clear();
CanvasClear();
// Считывание значений из внешнего файла
char p[100];
int i = 0;
if(OpenDialog1->Execute()){
AnsiString PathName = OpenDialog1->FileName;
using namespace std;
fstream myfile(PathName.c_str());
while (!myfile.eof()) {
myfile.getline(p,100);
Memo1->Lines->Add(AnsiString(p));
B[i] = StrToFloat(AnsiString(p));
i++;
}
}
ScaleMotion();
// Вычисление масштаба шкалы значений ФБД
double maxb = 0;
for (int i=0; i<=n; i++) {
if (maxb < fabs(B[i])) {
maxb = fabs(B[i]);
}
}
int scale = floor(250/maxb);
if (scale > 249 ) {
scale = 249;
}
// Отрисовка осей координат
Image1->Canvas->Pen->Color = clSilver;
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->LineTo(505,250);
Image1->Canvas->MoveTo(505,250);
Image1->Canvas->LineTo(505,255);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(5,250+scale);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(10,250-scale);
Image1->Canvas->MoveTo(5,250+scale);
Image1->Canvas->LineTo(10,250+scale);
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->Pen->Color = clBlack;
// Построение ФБД
for (int i=0; i<n; i++) {
Image1->Canvas->LineTo(5+i,250-B[i]*scale);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnBMClick(TObject *Sender)
// Построение стандартного броуновского движения
{
Memo1->Clear();
CanvasClear();
double f[N+1];
double beta[n+1];
randomize();
beta[0] = 0;
for (int i=1; i<=n; i++) {
beta[i]=RandG(0,1);
}
B[0] = 0;
Memo1->Lines->Add(AnsiString(B[0]));
for (int i=1; i<=n; i++) {
B[i] = B[i-1] + beta[i];
Memo1->Lines->Add(AnsiString(B[i]));
}
double maxb = 0;
for (int i=0; i<=n; i++) {
if (maxb < fabs(B[i])) {
maxb = fabs(B[i]);
}
}
int scale = floor(250/maxb);
if (scale > 249 ) {
scale = 249;
}
Image1->Canvas->Pen->Color = clSilver;
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->LineTo(505,250);
Image1->Canvas->MoveTo(505,250);
Image1->Canvas->LineTo(505,255);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(5,250+scale);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(10,250-scale);
Image1->Canvas->MoveTo(5,250+scale);
Image1->Canvas->LineTo(10,250+scale);
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->Pen->Color = clBlack;
for (int i=0; i<=n; i++) {
Image1->Canvas->LineTo(5+i*2,250-B[i]*scale);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnBetaClick(TObject *Sender)
// Построение функции beta при неслучайных V[k]
// Просто для наблюдения за ее структурой
{
Memo1->Clear();
CanvasClear();
double lambda[N+1];
double f[N+1];
double beta[n+1];
AnsiString buf;
for (int i=0; i<=N; i++) {
buf = Memo2->Lines->Strings[i];
lambda[i] = StrToFloat(buf);
}
for (int i=0; i<n; i++) {
beta[i]=0;
for (int j=1; j<=N; j++) {
beta[i] += cos(lambda[j]*i)*(1.0/N);
}
}
double maxb = 0;
for (int i=0; i<n; i++) {
if (maxb < fabs(beta[i])) {
maxb = fabs(beta[i]);
}
}
int scale = floor(250/maxb);
if (scale > 249 ) {
scale = 249;
}
Image1->Canvas->Pen->Color = clSilver;
Image1->Canvas->MoveTo(5,250);
Image1->Canvas->LineTo(505,250);
Image1->Canvas->MoveTo(505,250);
Image1->Canvas->LineTo(505,255);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(5,250+scale);
Image1->Canvas->MoveTo(5,250-scale);
Image1->Canvas->LineTo(10,250-scale);
Image1->Canvas->MoveTo(5,250+scale);
Image1->Canvas->LineTo(10,250+scale);
Image1->Canvas->MoveTo(5,250-beta[0]*scale);
Image1->Canvas->Pen->Color = clBlack;
for (int i=1; i<n; i++) {
Image1->Canvas->LineTo(5+i,250-beta[i]*scale);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnSolveClick(TObject *Sender)
// Решение диффура
{
CanvasClear();
randomize();
X[0] = RandG(0,g0);
Y[0] = 0;
// Моделирование ФБД
double mu[N/2+1];