leahov
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору помогите разобраться численные методы (Builder c++), решение нелинейных уравнений вот листинг Код: //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include<math.h> #include "urav.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- 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; } float absolute(float x) { return x < 0 ? -x : x; } void chordes(float a, float b, float eps, TLabel* lbl3, TLabel* lbl4, TLabel* lbl5) { if(f(a)*f(b) < 0) { ShowMessage("Хорды: a и b неправильные"); return; } float x0 = a; float xf = b; if(f(a)*fd2x(a) > 0) { x0 = b; xf = a; } int step = 1; float x1 = x0 - f(x0)*(xf-x0)/(f(xf)-f(x0)); while(absolute(x1-x0) > eps) { x0 = x1; x1 = x0 - f(x0)*(xf-x0)/(f(xf)-f(x0)); step = step + 1; } lbl3->Caption = x1; lbl4->Caption = f(x1); lbl5->Caption = step; } void __fastcall TForm1::sek(float a, float b, float eps) { if(f(a)*f(b) < 0) { ShowMessage("Секущие : a и b неправильные"); return; } float x0 = a; float x1 = a + eps; if(f(a)*fd2x(a) < 0) { x0 = b; x1 = b - eps; } int step = 1; float x = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0)); x0 = x1; x1 = x; while(absolute(x1-x0) > eps) { x = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0)); x0 = x1; x1 = x; step = step + 1; } Label11->Caption = x1; Label12->Caption = f(x1); Label13->Caption = step; } void __fastcall TForm1::kasat(float a, float b, float eps) { if(f(a)*f(b) < 0) { ShowMessage("Касательные: a и b неправильные"); return; } float x0 = a; if(f(a)*fd2x(a) < 0) { x0 = b; } int step = 1; float x1 = x0 - f(x0)/fdx(x0); while(absolute(x1-x0) > eps) { x0 = x1; x1 = x0 - f(x0)/fdx(x0); step = step + 1; } Label17->Caption = x1; Label18->Caption = f(x1); Label25->Caption = step; } void __fastcall TForm1::combi(float a, float b, float eps) { if ((abs(f(a)*fd2x(a)) == f(a)*fd2x(a)) && (abs(f(b)*fd2x(b)) == f(b)*fd2x(b))) { ShowMessage("Данные: a и b неправильные"); return; } float x0=a; float t0=b; if(f(a)*fd2x(a) > 0) { x0 = b; t0 = a; } int step = 1; float x = x0 - f(x0)*(t0-x0)/(f(t0)-f(x0)); float t = t0 - f(t0)/fdx(t0); while (absolute(x0-t0) < eps) { x0 = (x0+t0)/2; t0 = f((x0+t0)/2); step = step + 1; } Label28->Caption = x0; Label30->Caption = t0; Label32->Caption = step; } void __fastcall TForm1::Button1Click(TObject *Sender) { float a, b, eps; // ShowMessage("Vvedite a, b, epsilon: "); a = StrToFloat(Edit1->Text); b = StrToFloat(Edit2->Text); eps = StrToFloat(Edit3->Text); chordes(a, b, eps, Label3, Label4, Label7); sek(a, b, eps); kasat(a, b, eps); combi(a, b, eps); } //--------------------------------------------------------------------------- | в чем выявлены ошибки: касательные, секущие и хорды вроде считает, но в комбинированные (combi) какая-то засада. Выдает без расчетов "Данные: a и b неправильные", если убрать Код: if ((abs(f(a)*fd2x(a)) == f(a)*fd2x(a)) && (abs(f(b)*fd2x(b)) == f(b)*fd2x(b))) { ShowMessage("Данные: a и b неправильные"); return; } | то вроде запускается, но не считает. Если здесь в label убрать нули Код: while (absolute(x0-t0) < eps) { x0 = (x0+t0)/2; t0 = f((x0+t0)/2); step = step + 1; } Label28->Caption = x0; Label30->Caption = t0; Label32->Caption = step; } | то получается какой то расчет и всё время со степом 1. Явно математическая часть не верна. Кто знает как её реализовать, подскажите пожалуйста |