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.

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

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

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


 

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

37454. Теплоснабжение района города Архангельск 8.09 MB
  20 Расчет расходов сетевой воды по ЦТП.1 Рекомендации по центральному качественному регулированию отпуска теплоты и определению расхода сетевой воды в закрытых системах тепловая нагрузка потребителей ЖКХ более 65 полной нагрузки № Условие Способ регулирования Расход сетевой воды Подключение подогревателей систем ГВС Расчетная тепловая нагрузка для выбора ЦТП см. Квартальные сети присоединены к магистральным трубопроводам через ЦТП. На плане показан источник теплоты магистральные трубопроводы и ответвления к ЦТП узловые теплокамеры УТ...
37455. Философия. Учебник 2.26 MB
  Электронный учебник Философия предназначен для студентов высших и средних специальных учебных заведений. Учебник открывает содержание-меню, состоящее из названий 13 тем. При совмещении курсора с названием темы на экране дисплея возникает страница текста. Кроме шестой все темы представлены в форме системных обучающих модулей. Каждый модуль состоит из основного текста темы и дополнений, куда включены такие элементы, как основные выводы, основные термины в вопросах и ответах на них
37456. Сам себе психолог 406.5 KB
  Вы ощущаете бремя молодости бремя зрелого возраста бремя старости или чеголибо другого особенно если жизнь ваша проходит в эпоху больших перемен.Довольно медвежьих услуг фруктов для консервации лыжных прогулок неинтересных путевок на отпуск навязываемых вам соседями коллегами или родственниками в той ситуации когда вам решительно не хотелось чтолибо консервировать кататься н лыжах или отдыхать в октябре на берегу Балтийского моря.Если вы предпочитаете систематическое чтение главу за главой и если помимо рецептов разрешения...