численные методы. решение нелинейных уравнений
leahov:
так может правильней?
Код
while (absolute(x0-t0) < eps)
{
x = (x0+t0)/2;
t = f((x0+t0)/2);
step = step + 1;
}
Label28->Caption = x;
Label30->Caption = t;
Label32->Caption = step;
но степ по прежнему 1
oxotnik:
значит условие выполняется только один раз
к стати в теле цикла x0, t0 и eps не меняются, поэтому условие while (absolute(x0-t0) < eps) бесполезно
ЗЫ: операция деления выполняется в 10 раз дольше операции умножения
VerZer:
Код:
//---------------------------------------------------------------------------
float f(float x)
{
// return x*x*x + 3*x - 2;
return x*x*x + x - 5;
}
float fdx(float x)
{// return 3*x*x +3;
return 3*x*x +1;
}
float fd2x(float x)
{
return 4*x;
}
//---------------------------------------------------------------------------
void TForm1::go_combined(float x0, float t0, float epsilon, int step)
{
if (abs(x0 - t0) < epsilon)
{
ListBox1->Items->Add("x: "+FloatToStr((x0+t0)/2));
ListBox1->Items->Add("f(x): "+FloatToStr(f((x0+t0)/2)));
ListBox1->Items->Add("steps: "+IntToStr(step));
return;
}
float x = x0 - f(x0)*(t0-x0)/(f(t0)-f(x0));
float t = t0 - f(t0)/fdx(t0);
go_combined(x, t, epsilon, step + 1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bExeClick(TObject *Sender)
{
float a = StrToFloat(Edit1->Text);
float b = StrToFloat(Edit2->Text);
float epsilon = StrToFloat(Edit3->Text);
if (abs(f(a)*fd2x(a)) == f(a)*fd2x(a) &&
abs(f(b)*fd2x(b)) == f(b)*fd2x(b))
{
ListBox1->Items->Add("данные неверны");
return;
}
else
{
float x0 = a;
float t0 = b;
if (f(x0)*fd2x(x0) > 0)
{
x0 = b;
t0 = a;
}
ListBox1->Items->Add("===================================");
go_combined(x0, t0, epsilon, 1);
ListBox1->Items->Add("===================================");
ListBox1->Items->Add("");
}
}
//---------------------------------------------------------------------------
leahov:
oxotnik, спасибо
VerZer не реальное спасибо, ща пойду домой испробую
leahov:
ещё есть последняя просьба, как реализовать модифицированный метод ньютона (касательных) из имеющегося простого метода ньютона (он же kasat в коде). В посте 22 есть описание этих методов. Если кто знает, помогите люди добрые.
Навигация