16217

Изучение способов перекрытия методов родительских классов

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №5 Цель работы: Изучить способы перекрытия методов родительских классов Постановка задачи: Создать родительский класс решения нелинейного уравнения методом деления отрезка пополам методом итераций и методом Ньютона. В дочерних классах предус...

Русский

2013-06-20

166 KB

11 чел.

Лабораторная работа №5

Цель работы: Изучить способы перекрытия методов родительских классов

Постановка задачи: Создать родительский класс решения нелинейного уравнения методом деления отрезка пополам, методом итераций и методом Ньютона. В дочерних классах предусмотреть динамическое перекрытие нелинейных уравнений.

Краткие теоретические сведения:

Объявление виртуального метода в базовом классе выполняется с помощью ключевого слова virtual, а его перекрытие в производных классах — с помощью ключевого слова override. Перекрытый метод должен иметь точно такой же формат (список параметров, а для функций еще и тип возвращаемого значения), что и перекрываемый:

Суть виртуальных методов в том, что они вызываются по фактическому типу экземпляра, а не по формальному типу, записанному в программе.

Благодаря механизму наследования и виртуальных методов в среде Delphi реализуется такая концепция ООП как полиморфизм. Полиморфизм существенно облегчает труд программиста, поскольку обеспечивает повторное использование кода уже написанных и отлаженных методов.

При построении иерархии классов часто возникает ситуация, когда работа виртуального метода в базовом классе не известна и наполняется содержанием только в наследниках. Конечно, тело метода всегда можно сделать пустым или почти пустым, но лучше воспользоваться директивой abstract.

Директива abstract записывается после слова virtual и исключает необходимость написания кода виртуального метода для данного класса.

Разновидностью виртуальных методов являются так называемые динамические методы. При их объявлении вместо ключевого слова virtual записывается ключевое слово dynamic.

В наследниках динамические методы перекрываются так же, как и виртуальные — с помощью зарезервированного слова override.

По смыслу динамические и виртуальные методы идентичны. Различие состоит только в механизме их вызова. Методы, объявленные с директивой virtual, вызываются максимально быстро. Методы, объявленные с директивой dynamic вызываются несколько дольше, но при этом таблицы с адресами методов имеют более компактный вид, что способствует экономии памяти. Таким образом, программисту предоставляются два способа оптимизации объектов: по скорости работы (virtual) или по объему памяти (dynamic).

Текст программы:

<         Equation          >

program Equation;

uses

 Forms,

 UMainForm in 'UMainForm.pas' {Form1},

 UEquation in 'UEquation.pas';

{$R *.res}

begin

 Application.Initialize;

 Application.CreateForm(TForm1, Form1);

 Application.Run;

end.

<         UMainForm          > 

unit UMainForm;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls, ComCtrls, TeeProcs, TeEngine, Chart, Series,

 Buttons, UEquation, BubbleCh;

type

 TForm1 = class(TForm)

   EditMin: TEdit;

   EditMax: TEdit;

   RadioGroup1: TRadioGroup;

   EditEpsilon: TEdit;

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Panel1: TPanel;

   Label4: TLabel;

   Label5: TLabel;

   Panel2: TPanel;

   Bevel1: TBevel;

   Label6: TLabel;

   Panel3: TPanel;

   Label7: TLabel;

   EditResult: TEdit;

   CheckBox1: TCheckBox;

   UpDown1: TUpDown;

   EditRound: TEdit;

   DisplayChart: TChart;

   Series1: TLineSeries;

   Series2: TPointSeries;

   SpeedButton1: TSpeedButton;

   CheckBox2: TCheckBox;

   SpeedButton2: TSpeedButton;

   Panel4: TPanel;

   Series3: TFastLineSeries;

   EditDelay: TEdit;

   UpDown2: TUpDown;

   Label8: TLabel;

   RadioGroup2: TRadioGroup;

   Timer1: TTimer;

   procedure CheckBox1Click(Sender: TObject);

   procedure SpeedButton1Click(Sender: TObject);

   procedure Wait(x: double);

   procedure EditRoundChange(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure SpeedButton2Click(Sender: TObject);

   procedure EditEpsilonKeyPress(Sender: TObject; var Key: Char);

   procedure CheckBox2Click(Sender: TObject);

   procedure EditDelayChange(Sender: TObject);

   procedure RadioGroup2Click(Sender: TObject);

   procedure Timer1Timer(Sender: TObject);

   procedure DisplayResults();

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form1: TForm1;

 e: TEquation;

 delayTime: integer=500;

implementation

{$R *.dfm}

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

 EditRound.Enabled:=(Sender as TCheckBox).Checked;

 UpDown1.Enabled:=(Sender as TCheckBox).Checked;

 try

   if (Sender as TCheckBox).Checked then

     EditResult.Text:=FloatToStrF(e.Res, ffFixed, 15, StrToInt(EditRound.Text))

   else

     EditResult.Text:=FloatToStrF(e.Res, ffFixed, 15, 15);

 finally

 end;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

 try

   e.Min:=StrToFloat(EditMin.Text);

   e.Max:=StrToFloat(EditMax.Text);

   e.Epsilon:=StrToFloat(EditEpsilon.Text);

   e.Method:=RadioGroup1.ItemIndex;

 except

   on e1: ECantBeZero do

             begin

               MessageDlg(e1.Message, mtWarning, [mbOK], 0);

               exit;

             end;

   else

             begin

               MessageDlg('Неверное число!'#13#10'Проверьте, возможно в одно из полей введено не число!', mtError, [mbOK], 0);

               exit;

             end;

 end;

 SpeedButton1.Enabled:=false;

 SpeedButton2.Enabled:=true;

 Panel4.Enabled:=false;

 e.Reset();

 if CheckBox2.Checked then

   Timer1.Enabled:=true

 else

   Timer1Timer(Timer1);

end;

procedure TForm1.Wait(x: double);

begin

 if CheckBox2.Checked then

   sleep(delayTime);

end;

procedure TForm1.EditRoundChange(Sender: TObject);

begin

 CheckBox1Click(CheckBox1);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

 e:=TEquation.Create(0.5, 2, 0.001, RadioGroup1.ItemIndex, DisplayChart);

 e.Calculate;

 //e.OnNextStep:=Wait;

 CheckBox1Click(CheckBox1); //Просто запись значения в EditResult с учётом округлять/не округлять

end;

procedure TForm1.SpeedButton2Click(Sender: TObject);

begin

 Timer1.Enabled:=not Timer1.Enabled;

end;

procedure TForm1.EditEpsilonKeyPress(Sender: TObject; var Key: Char);

begin

 if not (Key in ['0'..'9', ',', '-', #8]) then

   Key:=chr(0);

end;

procedure TForm1.CheckBox2Click(Sender: TObject);

begin

 EditDelay.Enabled:=(Sender as TCheckBox).Checked;

 UpDown2.Enabled:=(Sender as TCheckBox).Checked;

end;

procedure TForm1.EditDelayChange(Sender: TObject);

begin

 Timer1.Interval:=StrToInt((Sender as TEdit).Text);

end;

procedure TForm1.RadioGroup2Click(Sender: TObject);

begin

 case (Sender as TRadioGroup).ItemIndex of

 0:  begin

       e.Free;

       e:=TEquation.Create(0.5, 2, 0.001, RadioGroup1.ItemIndex, DisplayChart);

       EditMin.Text:='0,5';

       EditMax.Text:='2';

       EditEpsilon.Text:='0,001';

       e.Calculate;

       CheckBox1Click(CheckBox1);

       //e.OnNextStep:=Wait;

     end;

 1:  begin

       e.Free;

       e:=TEquation1.Create(2, 3, 0.001, RadioGroup1.ItemIndex, DisplayChart);

       EditMin.Text:='2';

       EditMax.Text:='3';

       EditEpsilon.Text:='0,001';

       e.Calculate;

       CheckBox1Click(CheckBox1);

       //e.OnNextStep:=Wait;

     end;

 2:  begin

       e.Free;

       e:=TEquation2.Create(2, 3, 0.001, RadioGroup1.ItemIndex, DisplayChart);

       EditMin.Text:='2';

       EditMax.Text:='3';

       EditEpsilon.Text:='0,001';

       e.Calculate;

       CheckBox1Click(CheckBox1);

       //e.OnNextStep:=Wait;

     end;

 end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

   try

     if not CheckBox2.Checked then

       (Sender as TTimer).Enabled:=false;

     if not e.Calculate_Next then

     begin

       (Sender as TTimer).Enabled:=false;

       DisplayResults();

       exit;

     end;

   except

     on e1: Exception do

             begin

               (Sender as TTimer).Enabled:=false;

               MessageDlg(e1.Message, mtWarning, [mbOK], 0);

               DisplayResults();

             end;

   end;

   if not CheckBox2.Checked then

      Timer1Timer(Sender);

end;

procedure TForm1.DisplayResults();

begin

   Form1.CheckBox1Click(Form1.CheckBox1);  //Просто запись значения в EditResult с учётом округлять/не округлять

   Form1.SpeedButton1.Enabled:=true;

   Form1.SpeedButton2.Enabled:=false;

   Form1.Panel4.Enabled:=true;

end;

end.

<         UEquation          >

unit UEquation;

interface

uses SysUtils, Chart, Math;

const drawFSteps=50;

     drawFSpace=0.05;

     FMaxIterations=100;

type

 EMinNotLessThenMax=class(Exception);

 ETooMuchIterations=class(Exception);

 EDontMatchCondition=class(Exception);

 EZeroDenominator=class(Exception);

 EZeroDerivatite=class(Exception);

 ECantBeZero=class(Exception);

type

 TNextStepEvent=procedure(x: double) of object;

type

 TEquation=class

 private

   FMin: Double;

   FMax: Double;

   FMin2: Double;

   FMax2: Double;

   FN: integer;

   FEpsilon: Double;

   FResult: Double;

   FMethod: Integer;

   FOnNextStep: TNextStepEvent;

   FChart: TChart;

 public

   constructor Create; overload;

   constructor Create(AMin, AMax, AEpsilon: double; AMethod: integer; AChart: TChart); overload;

   function F(x: Double): Double; virtual;

   function Phi(x: Double): Double; virtual;

   function FirstDerivative(x: Double): Double; virtual;

   function SecondDerivative(x: Double): Double; virtual;

   procedure SetEpsilon(AEpsilon: double); virtual;

   property Min: Double read FMin write FMin;

   property Max: Double read FMax write FMax;

   property Epsilon: Double read FEpsilon write SetEpsilon;

   property Res: Double read FResult;

   property Method: integer read FMethod write FMethod;

   property Chart: TChart read FChart write FChart;

   property OnNextStep: TNextStepEvent read FOnNextStep write FOnNextStep;

   procedure Calculate; virtual;

   function Calculate_HalfDividing: Double; virtual;

   function Calculate_Iterations: Double; virtual;

   function Calculate_Newton: Double; virtual;

   procedure Reset; virtual;

   function Calculate_Next: boolean; virtual;

   function Calculate_HalfDividing_Next: boolean; virtual;

   function Calculate_Iterations_Next: boolean; virtual;

   function Calculate_Newton_Next: boolean; virtual;

   procedure DrawF; virtual;

   procedure DrawStep(x: double); virtual;

   procedure DrawStep2(x: double); virtual;

 end;

 TEquation1=class(TEquation)

 public

   function F(x: Double): Double; override;

   function Phi(x: Double): Double; override;

   function FirstDerivative(x: Double): Double; override;

   function SecondDerivative(x: Double): Double; override;

 end;

 TEquation2=class(TEquation)

 public

   function F(x: Double): Double; override;

   function Phi(x: Double): Double; override;

   function FirstDerivative(x: Double): Double; override;

   function SecondDerivative(x: Double): Double; override;

 end;

implementation

//TEquation1

 function TEquation1.F(x: Double): Double;

 begin

   Result:=3*sin(sqrt(x))+0.35*x-3.8;

 end;

 function TEquation1.Phi(x: Double): Double;

 begin

   Result:=-8.571*sin(sqrt(x))+10.8571;

 end;

 function TEquation1.FirstDerivative(x: Double): Double;

 begin

   Result:=1.5*cos(sqrt(x))/sqrt(x)+0.35;

 end;

 function TEquation1.SecondDerivative(x: Double): Double;

 begin

   Result:=-0.75*(sin(sqrt(x))+cos(sqrt(x)))/(x*sqrt(x));

 end;

//TEquation1

 function TEquation2.F(x: Double): Double;

 begin

   Result:=ln(x)-x+1.8;

 end;

 function TEquation2.Phi(x: Double): Double;

 begin

   Result:=ln(x)+1.8;

 end;

 function TEquation2.FirstDerivative(x: Double): Double;

 begin

   Result:=1/x-1;

 end;

 function TEquation2.SecondDerivative(x: Double): Double;

 begin

   Result:=-1/sqr(x);

 end;

//TEquation

 constructor TEquation.Create;

 begin

   inherited Create;

   FMin:=0;

   FMax:=2;

   FEpsilon:=0.001;

 end;

 constructor TEquation.Create(AMin, AMax, AEpsilon: double; AMethod: integer; AChart: TChart);

 begin

   inherited Create;

   FMin:=AMin;

   FMax:=AMax;

   FEpsilon:=AEpsilon;

   FMethod:=AMethod;

   FChart:=AChart;

   DrawF;

 end;

 procedure TEquation.SetEpsilon(AEpsilon: double);

 begin

   if (AEpsilon=0) then

     raise ECantBeZero.Create('Точность не может равняться 0!');

     FEpsilon:=abs(AEpsilon);

 end;

 procedure TEquation.Calculate;

 begin

   if not (FMin<FMax) then

     raise EMinNotLessThenMax.Create('Нижняя граница должна быть меньше верхней!');

   if assigned(FChart) then

   begin

     FChart.Series[1].Clear;

     FChart.Series[2].Clear;

   end;

   case FMethod of

   1: FResult:=Calculate_Iterations;

   2: FResult:=Calculate_Newton;

   else

      FResult:=Calculate_HalfDividing;

   end;

 end;

 procedure TEquation.Reset();

 begin

   if assigned(FChart) then

   begin

     FChart.Series[1].Clear;

     FChart.Series[2].Clear;

   end;

   case FMethod of

   1: begin

       FN:=1;

       FResult:=(FMax+FMin)/2;

       DrawStep(FResult);

     end;

   2:  begin

         FN:=1;

         FResult:=FMin;

         if F(FMax)*SecondDerivative(FMax)>0 then

           FResult:=FMax;

         DrawStep2(FResult);

         if Assigned(FOnNextStep) then

             FOnNextStep(FResult);

       end;

   else

      begin

        FMin2:=Fmin;

        FMax2:=FMax;

        FN:=0;

      end;

   end;

 end;

 function TEquation.Calculate_Next: boolean;

 begin

   if not (FMin<FMax) then

     raise EMinNotLessThenMax.Create('Нижняя граница должна быть меньше верхней!');

   case FMethod of

   1: Result:=Calculate_Iterations_Next;

   2: Result:=Calculate_Newton_Next;

   else

      Result:=Calculate_HalfDividing_Next;

   end;

 end;

 function TEquation.Calculate_HalfDividing_Next: boolean;

 var x0: double;

 begin

   if not (F(FMin)*F(FMax)<0) then

     raise EDontMatchCondition.Create('Для метода половинного деления необходимо, чтобы функция на концах промежутка иммела разные знаки!');

   if F(FMin2)=0 then

   begin

     FResult:=FMin2;

     DrawStep(FMin2);

     Result:=false;

     exit;

   end;

   if F(FMax2)=0 then

   begin

     FResult:=FMax2;

     DrawStep(FMax2);

     Result:=false;

     exit;

   end;

   if FN>FMaxIterations then

     raise ETooMuchIterations.Create('Превышено максимальное количество итераций ('+inttostr(FMaxIterations)+')!');

   x0:=(FMax2+FMin2)/2;

   DrawStep(x0);

   if (F(FMin2)*F(x0)<0) then

     FMax2:=x0

   else

     FMin2:=x0;

   inc(FN);

   if Assigned(FChart) then

   begin

       FChart.Series[0].Title:='Функция ('+inttostr(FN)+' итераций).';

       FChart.Series[1].Title:='X='+FloatToStr(x0);

   end;

   if Assigned(FOnNextStep) then

     FOnNextStep(x0);

   if f(x0)=0 then

     Result:=false

   else if (FMax2-FMin2<2*FEpsilon) then

     Result:=false

   else

     Result:=true;

   FResult:=x0;

 end;

  function TEquation.Calculate_Iterations_Next: boolean;

 var

     x0, x1: double;

 begin

     x0:=FResult;

     if FN>FMaxIterations then

       raise ETooMuchIterations.Create('Превышено максимальное количество итераций ('+inttostr(FMaxIterations)+')!');

     inc(FN);

     x1:=Phi(x0);

     DrawStep(x1);

     if Assigned(FChart) then

     begin

         FChart.Series[0].Title:='Функция ('+inttostr(FN)+' итераций).';

         FChart.Series[1].Title:='X='+FloatToStr(x1);

     end;

     if Assigned(FOnNextStep) then

       FOnNextStep(x1);

    if ((x1-x0)<FEpsilon) then

       Result:=false

    else

       Result:=true;

    FResult:=x1;

 end;

 function TEquation.Calculate_Newton_Next: boolean;

 var N: integer;

     x0, x1, d: double;

 begin

   x0:=FResult;

   if FN>FMaxIterations then

     raise ETooMuchIterations.Create('Превышено максимальное количество итераций ('+inttostr(FMaxIterations)+')!');

   if FirstDerivative(x0)=0 then

     raise EZeroDerivatite.Create('На шаге '+inttostr(FN)+' производная стала равна нулю!');

   x1:=x0-(F(x0)/FirstDerivative(X0));

   DrawStep2(x1);

   inc(FN);

   if Assigned(FChart) then

   begin

       FChart.Series[0].Title:='Функция ('+inttostr(FN)+' итераций).';

       FChart.Series[1].Title:='X='+FloatToStr(x1);

   end;

   if Assigned(FOnNextStep) then

     FOnNextStep(x1);

   if abs(x1)>1 then

     d:=(x1-x0)/x1

   else

     d:=x1-x0;

   if ((d<=FEpsilon) and (abs(F(x1))<=100*Fepsilon)) then

     Result:=false

   else

     Result:=true;

   FResult:=x1;

 end;

 

 procedure TEquation.DrawF;

 var

   leftBorder, rightBorder, h, x: double;

   i: integer;

 begin

   if assigned(FChart) then

   begin

     FChart.Series[0].Clear;

     leftBorder:=FMin-(FMax-Fmin)*drawFSpace;

     rightBorder:=FMax+(FMax-Fmin)*drawFSpace;

     h:=(rightBorder-leftBorder)/drawFSteps;

     x:=leftBorder;

     for i:=0 to drawFSteps do

     begin

       FChart.Series[0].AddXY(x, f(x));

       x:=x+h;

     end;

   end;

 end;

 function TEquation.F(x: Double): Double;

 begin

   Result:=0.25*power(x, 3)+x-1.2502;

 end;

 function TEquation.Phi(x: Double): Double;

 begin

   Result:=-0.25*power(x, 3)+1.2502;

 end;

 function TEquation.FirstDerivative(x: Double): Double;

 begin

   Result:=0.75*power(x, 2)+1;

 end;

 function TEquation.SecondDerivative(x: Double): Double;

 begin

   Result:=1.5*x+1;

 end;

 function TEquation.Calculate_HalfDividing: Double;

 var B, A, x0: double;

     N: integer;

 begin

   if not (F(FMin)*F(FMax)<0) then

     raise EDontMatchCondition.Create('Для метода половинного деления необходимо, чтобы функция на концах промежутка иммела разные знаки!');

   N:=0;

   B:=FMax;

   A:=FMin;

   if F(A)=0 then

   begin

     Result:=A;

     DrawStep(A);

     exit;

   end;

   if F(B)=0 then

   begin

     Result:=B;

     DrawStep(B);

     exit;

   end;

   while ((B-A)>(FEpsilon*2)) do

   begin

     if N>FMaxIterations then

       raise ETooMuchIterations.Create('Превышено максимальное количество итераций ('+inttostr(FMaxIterations)+')!');

     x0:=(B+A)/2;

     if F(x0)=0 then

       break;

     DrawStep(x0);

     if (F(A)*F(x0)<0) then

       B:=x0

     else

       A:=x0;

     inc(N);

     if Assigned(FChart) then

     begin

         FChart.Series[0].Title:='Функция ('+inttostr(N)+' итераций).';

         FChart.Series[1].Title:='X='+FloatToStr(x0);

     end;

     if Assigned(FOnNextStep) then

       FOnNextStep(x0);

   end;

   Result:=(B+A)/2;

   if Assigned(FChart) then

   begin

       FChart.Series[0].Title:='Функция ('+inttostr(N)+' итераций).';

       FChart.Series[1].Title:='X='+FloatToStr(Result);

   end;

 end;

 function TEquation.Calculate_Iterations: Double;

 var N: integer;

     x0, x1{, x2, y0, y1, y2, d1, d2}: double;

 begin

    N:=1;

    x1:=(FMax+FMin)/2;

    DrawStep(x1);

    repeat

     x0:=x1;

      if N>FMaxIterations then

       raise ETooMuchIterations.Create('Превышено максимальное количество итераций ('+inttostr(FMaxIterations)+')!');

     inc(N);

     x1:=Phi(x0);

     DrawStep(x1);

     if Assigned(FChart) then

     begin

         FChart.Series[0].Title:='Функция ('+inttostr(N)+' итераций).';

         FChart.Series[1].Title:='X='+FloatToStr(x1);

     end;

     if Assigned(FOnNextStep) then

       FOnNextStep(x1);

    until ((x1-x0)<FEpsilon);

    Result:=x1;

   {N:=1;

   x1:=(FMax+Fmin)/2;

   y1:=F(x1);

   x2:=Phi(x1);

   y2:=F(x2);

   repeat

     x0:=x1;

     y0:=y1;

     x1:=x2;

     y1:=y2;

     if N>FMaxIterations then

       raise ETooMuchIterations.Create('Превышено максимальное количество итераций ('+inttostr(FMaxIterations)+')!');

     inc(N);

     if ((x1=y1) or ( (x0-y0)=(x1-y1) ) ) then

       raise EZeroDenominator.Create('Метод итераций: знаменатель равен нулю на '+inttostr(N)+' шаге!');

     x2:=x1+(x1-x0)/((x0-y0)/(x1-y1)-1);

     y2:=Phi(x2);

     DrawStep(x2);

     if Assigned(FChart) then

   begin

       FChart.Series[0].Title:='Функция ('+inttostr(N)+' итераций).';

       FChart.Series[1].Title:='X='+FloatToStr(x2);

   end;

     if Assigned(FOnNextStep) then

       FOnNextStep(x2);

     if abs(x2)>1 then

     begin

       d1:=(x2-x1)/x2;

       d2:=(x2-y2)/x2;

     end

     else

     begin

       d1:=x2-x1;

       d2:=x2-y2;

     end;

   until ((d1<=10*FEpsilon) and (d2<=10*FEpsilon));

   Result:=x2;

   if Assigned(FChart) then

   begin

       FChart.Series[0].Title:='Функция ('+inttostr(N)+' итераций).';

       FChart.Series[1].Title:='X='+FloatToStr(Result);

   end; }

 end;

 function TEquation.Calculate_Newton: Double;

 var N: integer;

     x0, x1, d: double;

 begin

   N:=1;

   x1:=FMin;

   if F(FMax)*SecondDerivative(FMax)>0 then

     x1:=FMax;

   DrawStep2(x1);

   if Assigned(FOnNextStep) then

       FOnNextStep(x1);

   repeat

     if N>FMaxIterations then

       raise ETooMuchIterations.Create('Превышено максимальное количество итераций ('+inttostr(FMaxIterations)+')!');

     x0:=x1;

     if FirstDerivative(X0)=0 then

       raise EZeroDerivatite.Create('На шаге '+inttostr(N)+' производная стала равна нулю!');

     x1:=x0-(F(x0)/FirstDerivative(X0));

     DrawStep2(x1);

     inc(N);

     if Assigned(FChart) then

     begin

         FChart.Series[0].Title:='Функция ('+inttostr(N)+' итераций).';

         FChart.Series[1].Title:='X='+FloatToStr(x1);

     end;

     if Assigned(FOnNextStep) then

       FOnNextStep(x1);

     if abs(x1)>1 then

       d:=(x1-x0)/x1

     else

       d:=x1-x0;

   until ((d<=FEpsilon) and (abs(F(x1))<=100*Fepsilon));

   Result:=x1;

   if Assigned(FChart) then

     begin

         FChart.Series[0].Title:='Функция ('+inttostr(N)+' итераций).';

         FChart.Series[1].Title:='X='+FloatToStr(Result);

     end;

 end;

 procedure TEquation.DrawStep(x: Double);

 begin

   if Assigned(FChart) then

     FChart.Series[1].AddXY(x, F(x));

 end;

 procedure TEquation.DrawStep2(x: Double);

 begin

   if Assigned(FChart) then

   begin

     if ((F(x)<0) and (FirstDerivative(x)>0)) then

     begin

       FChart.Series[1].AddXY(x, F(x));

       FChart.Series[2].AddXY(x, 0);

       FChart.Series[2].AddXY(x, F(x));

     end

     else

     begin

       FChart.Series[1].AddXY(x, F(x));

       FChart.Series[2].AddXY(x, F(x));

       FChart.Series[2].AddXY(x, 0);

     end

   end;

 end;

end.

Результаты работы программы:

Выводы: таким образом, мы изучили способы перекрытия методов родительских классов. Мы создали класс решения нелинейного уравнения методом деления отрезка пополам, методом итераций и методом Ньютона. Вся функциональность была реализована в базовом классе. Далее, перекрыв соответствующий метод в дочернем классе, мы изменили само нелинейное уравнение.

Итак, мы написали программу, которая решает любое из трёх предложенных нелинейных уравнений любым из предложенных методов решения нелинейных уравнений.


 

А также другие работы, которые могут Вас заинтересовать

42193. Электрическая цепь с одним источником питания и смешанным соединением элементов 130 KB
  Основные теоретические положения Основными элементами любой электрической цепи являются: а источники электрической энергии электромашинные генераторы аккумуляторные батареи термоэлементы и т. С помощью закона Ома описывается связь между током напряжением и сопротивлением заданного участка цепи . Согласно 1му закону Кирхгофа алгебраическая сумма токов сходящихся в любом узле цепи равна нулю т. Так как при параллельном соединении все элементы находятся под одним и тем же напряжением то используя закон Ома это уравнение можно...
42194. Вимірювання опорів на постійному струмі 115 KB
  Ознайомлення з основними видами та методами вимірювання активних електричних опорів на постійному струмі. Дослідження методичних похибок основних методів вимірювання опорів та шляхи їх усунення. Завдання на вимірювання опорів кожен студент одержує від викладача.
42195. Калібрування і повірка засобів вимірювання тиску 86 KB
  1 Мета роботи Ознайомитись з будовою і принципом дії технічних засобів для вимірювання тиску. Набути практичних навиків при повірці і калібруванні систем вимірювання тиску.2 Програма роботи Під час заняття студент повинен самостійно ознайомитись з будовою і принципом дії технічних засобів які використовуються в системах для вимірювання тиску.
42196. Обробка результатів прямих багаторазових вимірювань 263.5 KB
  Вивчення методів і набуття практичних навиків в обробці результатів багаторазових вимірювань які містять випадкові похибки. Програма роботи Під час роботи студенти вимірюють активні опори за допомогою універсального цифрового вимірювача Ф 480 так щоб досягти при цьому одержання найбільш точних результатів шляхом визначення і виключення систематичних і випадкових похибок вимірювань параметра з рівноточними значеннями відліку. З цією метою використовується методика багатократного вимірювання однієї і тієї ж величини з...
42197. Вивчення будови, принципу дії амперметрів та вольтметрів. Визначення їх метрологічних характеристик 93 KB
  Якщо статична характеристика лінійна у=кх то коефіцієнт к називається чутливістю вимірювального приладу; ціна поділки ЗВ ; ціна одиниці найменшого розряду числа в показах цифрового приладу ; 2 похибки ЗВ: Абсолютна відносна приведена похибки ЗВ; Похибки поділяються на статичні які виникають при вимірюванні постійних величин динамічні які виникають при вимірюванні змінних величин. До числа характеристик похибок відноситься також варіація вихідного сигналу або варіація показів вимірювального приладу.8485]: метод порівняння з...
42198. Повiрка цифрових та аналогових омметрiв 144.5 KB
  Програма роботи У процесі підготовки до заняття студенту потрібно ознайомитись з методикою повірки омметрів згідно ГОСТ 9. Здійснити повірку цифрових універсальних омметрів типу В7 – 20 та В7 – 16А.1 Будова аналогових омметрів Омметрами називають прилади прямої дії які служать для безпосереднього вимірювання активних опорів. Перевага двохрамочних омметрів у тому що їх покази не залежать від напруги джерела живлення.
42199. Калібрування і повірка термометрів опору 286.5 KB
  Засвоїти методику отримання практичних навиків при проведенні досліджень динамічних характеристик термометрів опору при нагріванні і охолодженні повірці термометрів опору та калібруванні напівпровідникових термометрів опору термісторів.2 Програма роботи Під час заняття студент повинен ознайомитись з будовою та принципом дії термометрів опору. Визначити динамічну похибку термометрів опору типу ТСП і ТСМ.
42200. Систематичні похибки вимірювань та методи їх зменшення 71.5 KB
  У процесі заняття провести вимірювання різних електричних величин різними способами і засобами визначити систематичні похибки ввести поправки до результатів вимірювань обчислити дійсні значення вимірюваних величин і впевнитись у правильності отриманих значень.1 Систематичні похибки вимірювань та методи їх зменшення Процес пізнання матеріального світу відбувається через експериментальне визначення вимірювання кількісних оцінок фізичних величин що характеризують досліджувані процеси явища. Таким чином результат...
42201. Вивчення будови, принципу дії та застосування електронного осцилографа для електричних вимірювань 461 KB
  Практичне виконання вимiрювань напруги струму часових iнтервалiв частоти кута зсуву фаз складової комплексного опору та iнших електричних величин з допомогою осцилографа. При пiдготовцi до роботи студенти повиннi самостiйно продумати i завчасно пiдготувати програму виконання роботи для заданого їм варiанта вибрати або скласти самостiйно необхiднi для цього схеми вимiрювань запропонувати свої рiшення в здiйсненнi вимiрювань дiючих значень синусоїдальних струмiв i напруг з допомогою осцилографа. Пропонується продумати методику...