Решение систем дифференциальных уравнений при помощи неявной схемы Адамса 3-го порядка
}
//---------------------------------------------------------------------------
void fastcall TForm1::N7Click(TObject *Sender)
{
Form2->Show();
}
//---------------------------------------------------------------------------
void fastcall TForm1::N2Click(TObject *Sender) // очистка формы
{
Edit1->Clear();
Edit2->Clear();
Edit3->Clear();
>Edit4->Clear();
Edit5->Clear();
Edit6->Clear();
Edit7->Clear();
Edit8->Clear();
Edit9->Clear();
Memo1->Clear();
Series1->Clear();
Series2->Clear();
Series3->Clear();
Series4->Clear();
}
//---------------------------------------------------------------------------
void fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text="10";
Edit2->Text="1";
Edit3->Text="2";
Edit4->Text="4";
Edit5->Text="0,0001";
Edit6->Text="4";
Edit7->Text=FloatToStrF(exp(2),ffFixed,20,18);
Memo1->Text="результаты программы";
Button1->Show();
}
//---------------------------------------------------------------------------
void fastcall TForm1::Button1Click(TObject *Sender) //обработка события нажатия кнопки «выполнить»
{
//---------------------------------------------------------------------------
int nx,np,k,i,n;
double a,b,e,h,d,de,z,x;
double y[2],yp[2],f[2],fm[2],fp[2],fp1[2],fp2[2];
unsigned long int time=GetTickCount();
unsigned long int time1=0;
a=StrToFloat(Edit3->Text);
b=StrToFloat(Edit4->Text);
e=StrToFloat(Edit5->Text);
nx=StrToInt(Edit1->Text);
np=StrToInt(Edit2->Text);
Memo1->Clear();
Memo1->Lines->Add("Входные данные:");
Memo1->Lines->Add("");
Memo1->Lines->Add("du/dx="+Edit8->Text+";");
Memo1->Lines->Add("dv/dx="+Edit9->Text+";");
Memo1->Lines->Add("Интервал: ["+Edit3->Text+";"+Edit4->Text+"]");
Memo1->Lines->Add("Допустимая погрешность: е="+Edit5->Text);
Memo1->Lines->Add("Начальные условия:");
Memo1->Lines->Add("u="+Edit6->Text);
Memo1->Lines->Add("v="+Edit7->Text);
Memo1->Lines->Add("Количество шагов сетки: "+Edit1->Text);
Memo1->Lines->Add("Шаг вывода: "+Edit2->Text);
Memo1->Lines->Add("");
Memo1->Lines->Add("");
char *u1 =(char *)malloc(strlen(Edit8->Text.c_str())+1);
char *v1 =(char *)malloc(strlen(Edit9->Text.c_str())+1);
strcpy(u1,Edit8->Text.c_str());
strcpy(v1,Edit9->Text.c_str());
char *u =(char *)malloc(strlen(u1)+1); //динамическое выделение памяти
char *v =(char *)malloc(strlen(v1)+1);
strcpy(u,opz(&(u1[0]))); // преобразование в обратную польскую запись
strcpy(v,opz(&(v1[0])));
do {
h=(b-a)/nx;
x=a;
y[0]=StrToFloat(Edit6->Text);
y[1]=StrToFloat(Edit7->Text);
if(np!=0&&s==0){
Memo1->Lines->Add("Результаты:");
Memo1->Lines->Add(" x | u(x) | точное | разн. | v(x) | точное | разн. | ");
Memo1->Lines->Add("-----------------------------------------------------");
Memo1->Lines->Add(FloatToStrF(x,ffFixed,5,3)+" "+FloatToStrF(y[0],ffFixed,8,4)+" "+FloatToStrF(2*x,ffFixed,8,4)+" "+FloatToStrF(y[0]-2*x,ffFixed,8,4)+" "+FloatToStrF(y[1],ffFixed,8,4)+" "+FloatToStrF(exp(x),ffFixed,8,4)+" "+FloatToStrF(y[1]-exp(x),ffFixed,8,4));
}
Series1->Clear();
Series2->Clear();
Series3->Clear();
Series4->Clear();
Series1->AddXY(x,y[0]);
Series2->AddXY(x,2*x);
Series3->AddXY(x,y[1]);
Series4->AddXY(x,exp(x));
fm[0]=fpr(u,y[0],y[1],x);
fm[1]=fpr(v,y[0],y[1],x);
for(i=0;i<2;i++)
{
yp[i]=y[i]+h/2*fm[i];
}
x=x+h/2;
fp1[0]=fpr(u,yp[0],yp[1],x);
fp1[1]=fpr(v,yp[0],yp[1],x);
for(i=0;i<2;i++)
{
yp[i]=y[i]+h/2*fp1[i];
}
fp2[0]=fpr(u,yp[0],yp[1],x);
fp2[1]=fpr(v,yp[0],yp[1],x);
for(i=0;i<2;i++)
{
yp[i]=y[i]+h*fp2[i];
}
x=x+h/2;
fp[0]=fpr(u,yp[0],yp[1],x);
fp[1]=fpr(v,yp[0],yp[1],x);
for(i=0;i<2;i++)
{
yp[i]=y[i]+h*(fm[i]+2*fp1[i]+2*fp2[i]+fp[i])/6;
}
fp[0]=fpr(u,yp[0],yp[1],x);
fp[1]=fpr(v,yp[0],yp[1],x);
for(n=2;n<=nx;n++)
{
for(i=0;i<2;i++)
{
y[i]=yp[i]+h*(1.5*fp[i]-0.5*fm[i]);
};
x=x+h;
f[0]=fpr(u,y[0],y[1],x);
f[1]=fpr(v,y[0],y[1],x);
k=0;
do
{
k=k+1;
de=0;
for(i=0;i<2;i++)
{
z=yp[i]+h*(5*f[i]+8*fp[i]-fm[i])/12;
d=fabs(z-y[i]);
y[i]=z;
if(d>de) de=d;
};
f[0]=fpr(u,y[0],y[1],x);
f[1]=fpr(v,y[0],y[1],x);
} while(de>e);
for(i=0;i<2;i++)
{
yp[i]=y[i];
fm[i]=fp[i];
fp[i]=f[i];
}
Series1->AddXY(x,y[0]); //вывод графиков функций
Series2->AddXY(x,2*x);
Series3->AddXY(x,y[1]);
Series4->AddXY(x,exp(x));
if((fmod(n,np)==0)&&s==0) { //вывод результатов
Memo1->Lines->Add(FloatToStrF(x,ffFixed,5,3)+" "+FloatToStrF(y[0],ffFixed,8,4)+" "+FloatToStrF(2*x,ffFixed,8,4)+" "+FloatToStrF(y[0]-2*x,ffFixed,8,4)+" "+FloatToStrF(y[1],ffFixed,8,4)+" "+FloatToStrF(exp(x),ffFixed,8,4)+" "+FloatToStrF(y[1]-exp(x),ffFixed,8,4));
p=1;
o=1;
}
else o=0;
}
nx=nx*2;
np=np*2;
time1=GetTickCount();
if (o==1) {
Memo1->Lines->Add("------------------------------------------------------");
Memo1->Lines->Add("Время выполнения:"+FloatToStrF((time1-time)/1000.,ffFixed,6,3)+"мс");
}
if(CheckBox1->Checked) y[1]=exp(x);
} while(fabs(y[1]-exp(x))>e);
j++;
s=1;
if(p==1&&(fmod(j,2)==0))
{
Memo1->Lines->Add("Рекомендуемое значение шага сетки :"+FloatToStrF(nx/2,ffFixed,6,0));
Edit1->Text=FloatToStrF(nx/2,ffFixed,5,0);
Edit2->Text=FloatToStrF(np/2,ffFixed,5,0);
s=0;
p=0;
}
free(u); // освобождение памяти
free(v);
free(u1);
free(v1);
}
//---------------------------------------------------------------------------
void fastcall TForm1::N4Click(TObject *Sender) //Сохранение в файл
{
SaveDialog1->Title="Save File";
if (SaveDialog1->Execute())
{
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
}
//---------------------------------------------------------------------------
void fastcall TForm1::N3Click(TObject *Sender) // Загрузка из файла функций
Другие рефераты на тему «Математика»:
Поиск рефератов
Последние рефераты раздела
- Анализ надёжности и резервирование технической системы
- Алгоритм решения Диофантовых уравнений
- Алгебраическое доказательство теоремы Пифагора
- Алгоритм муравья
- Векторная алгебра и аналитическая геометрия
- Зарождение и создание теории действительного числа
- Вероятностные процессы и математическая статистика в автоматизированных системах